我试图理解mysql注入不按预期工作。 我有一个PHP脚本,根据网页上提供的用户名和密码进行登录。查询字符串如下所示:
$querystr = "SELECT COUNT(*) FROM usertbl WHERE user='$user' and pass='$pass'";
用户名和密码在上面的querystr中使用之前会被转义。这意味着任何apastroph(单引号)也会被转义。 我在这里找到了一个描述这个问题的博客:mysql_escape_string-the-charset-vulnerability。
我试图复制在该博客上解释的内容,但是当我为用户提供十六进制字符或在网站上传递时,php似乎不会将它们解释为十六进制。
当我在网页上输入用户名(密码为空)时:
用户\ XBF \ X27
MySQL记录的查询是:
SELECT COUNT(*)FROM usertbl WHERE user ='user \ xbf \ x27或1 = 1--'和pass =''
所以,对我而言,十六进制字符看起来并不是这样解释的。
对于更多调试,我创建了以下php脚本,我在服务器上运行:
<?php
header('Content-type: text/plain; charset=gbk');
$hex="\xbf\x27";
echo mysql_escape_string($hex);
?>
输出结果为:
\'
有人知道为什么它对我不起作用吗?
谢谢
答案 0 :(得分:1)
当您在php脚本中键入$hex="\xbf\x27";
时,PHP将对其进行解析并存储由十六进制字节BF 27
形成的字符串。
当您在网页中键入\xbf\x27
时,它会逐字发送到服务器,因此查询最终会显示文字«\ xbf \ x27»。
利用它的方法是在浏览器中输入该字符(例如,将浏览器编码更改为iso-8859-1并粘贴¿
),或者在您直接插入的地方发送虚假的HTTP请求你想要的任何字节都在电线中。如果您通过HTTP GET执行注入,则有一种简单的方法可以插入使用%-escapes,即。 “&user=user%bf%27%20or%201=1--&pass=
”。