http://www.pwntester.com/blog/2014/01/15/hackyou2014-web100-write-up/ 在这个链接中,他们通过十六进制代码注入,如
0x39393939393939393939393920756e696f6e20616c6c202873656c656374202748656c6c6f21212729
含义:
999999999999 union all (select 'Hello!!')
在mysql中,我们无法输入类似的查询 MySQL的> 0x0abcd ...(假设0x0abc ..表示从...中选择*)。 所以,你能解释一下为什么他们可以注入我的链接吗? p / s:抱歉我的英语不好。
答案 0 :(得分:3)
SQL注入不会发生在INSERT
语句中,而是发生在第二个SELECT
语句中:
"SELECT title FROM picture WHERE id = ".$r['id']
此处$r['id']
是最近插入的ID,i。例如,用户提供了$_POST['id']
值。
现在,为什么这个SQL注入工作的原因是MySQL对hexadecimal literals的支持以及 vote 表的 id 列属于{ {3}}在这种情况下适用以下条件:
在字符串上下文中,它们的行为类似于二进制字符串,其中每对十六进制数字都转换为字符:
mysql> SELECT X'4D7953514C'; -> 'MySQL' mysql> SELECT 0x0a+0; -> 10 mysql> SELECT 0x5061756c; -> 'Paul'
对于PHP 0x…
是数字(即is_numeric
),对于MySQL 0x…
,它被解释并存储为字符串,后来插入到上面提到的SELECT
语句中
如果
,这是不可能的SELECT
本来是一份准备好的陈述。答案 1 :(得分:1)
这篇博客文章的评论已经回答了这个问题。十六进制字符串必须通过PHP运行,或者其他一些错误地将值作为字符串(而不是数字)传递给MySQL的系统,以便使这个“黑客”工作。