在php中通过sql查询进行注入攻击

时间:2014-04-21 07:17:06

标签: mysql sql-injection

有人能解释一下这个查询的含义吗?

-999.9 and(select 1 from(select count(*),
 concat((select (select concat(0x7e,0x27,unhex(Hex(cast(database() as char))),0x27,0x7e))
 from `information_schema`.tables limit 0,1),floor(rand(0)*2))x 
 from `information_schema`.tables group by x)a)--

我发现表单中的必填字段由1填充,电子邮件ID由此特定查询填写。
在表单中,我有序列,如姓名,移动nu,电子邮件ID和其他详细信息。在电子邮件ID后面有任何字段,填空或空白' null'在电子邮件ID之前,所有字段都由' 1'

填充

1 个答案:

答案 0 :(得分:1)

这是一个盲目的SQL注入。当站点不容易受到正常的SQL注入攻击时使用它。您的站点验证输入数据,可能不正确但足以让信息通过SQL注入泄漏。

盲SQL注入不会尝试直接获取信息;如果发现泄漏,则首先不需要盲注。

工作原理:它会引入奇怪的嵌入式查询,例如问题中提到的查询,并检查页面的行为。检查失败时,检查其查询结果的页面会生成不同的内容。它显示错误消息或重定向到某个页面,或者有时它不会产生任何输出(当查询失败的"处理""或#34;或者死亡()&# 34。)

盲SQL注入会产生假设然后生成并注入一个运行正确或失败的查询。它检查页面内容以了解注入的部分是否使查询成功或失败。根据结果​​(成功或失败),注入脚本知道它的假设是真还是假,然后它做出决定并再次尝试不同的假设。

我不知道测试这个注射片段是什么。由于group by x部分,它使得我正在使用的MySQL版本的查询失败。也许它在其他版本上成功(MySQL 4?);在这种情况下,它仅用于检测MySQL的版本。它不是确切的版本,而是主要版本。在主要的MySQL版本上有一些小的东西发生了变化,攻击者脚本知道正在运行的版本是很重要的。这样它就知道它可以使用哪种语言功能。如果它没有使用正确的语法,那么它的所有查询都会失败,并且无法实现其目标。 : - )

我维护的一个遗留网站在几个月前以类似的方式遭到攻击。我们认为所有输入数据都已正确检查,并且无法向其注入任何内容。碰巧有一个小洞仍然存在,有人决定攻击该网站(可能提取电子邮件地址),他们使用的工具找到了漏洞并开始通过它注入查询。

注入查询类似于2 RLIKE (SELECT ...),其中...代表一个复杂的查询,它从{{1}中选择N th 对象(表或列)的名称(使用information_schema),使用函数MID(name, K, 1)从所选名称中提取K th 字符,然后将该字符与指定字符进行比较(使用LIMITIF())最终产生CASE或不是有效正则表达式的东西。

每个请求都是针对ASCII集中的某个字符检查单个表或字段名称的单个字符。如果选中的字符小于注入器提供的字符,则注入的部分将评估为2并且查询正常运行。否则,它将评估为2 RLIKE 2并且查询失败。这样,进样器脚本将其正在测试的字符的潜在值范围分成一半。接下来的查询会一次又一次地缩小它,直到它找到确切的字符。它最多需要7个注入请求才能找到单个字段表的单个字符。

然后它从位置2 RLIKE (处的角色开始,依此类推。使用相同的技术,但使用不同的查询,脚本首先找到它想要查找的名称。

这个过程很乏味,但这就是为什么计算机首先被发明出来的原因:为人类做繁琐的工作。