php不会将我的十六进制字符解释为hex

时间:2015-05-29 18:11:43

标签: mysql code-injection

我试图理解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);
?>

输出结果为:

  

\'

有人知道为什么它对我不起作用吗?

谢谢

1 个答案:

答案 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=”。