在SQL注入中进行十六进制编码

时间:2014-10-04 16:52:52

标签: php mysql sql sql-injection

http://www.pwntester.com/blog/2014/01/15/hackyou2014-web100-write-up/ 在这个链接中,他们通过十六进制代码注入,如

0x39393939393939393939393920756e696f6e20616c6c202873656c656374202748656c6c6f21212729  

含义:

999999999999 union all (select 'Hello!!')  

在mysql中,我们无法输入类似的查询 MySQL的> 0x0abcd ...(假设0x0abc ..表示从...中选择*)。 所以,你能解释一下为什么他们可以注入我的链接吗? p / s:抱歉我的英语不好。

2 个答案:

答案 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语句中

如果

,这是不可能的
  • id 将是数字数据类型,或
  • SELECT本来是一份准备好的陈述。

答案 1 :(得分:1)

这篇博客文章的评论已经回答了这个问题。十六进制字符串必须通过PHP运行,或者其他一些错误地将值作为字符串(而不是数字)传递给MySQL的系统,以便使这个“黑客”工作。