有人能解释一下这个查询的含义吗?
-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'
答案 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 字符,然后将该字符与指定字符进行比较(使用LIMIT
或IF()
)最终产生CASE
或不是有效正则表达式的东西。
每个请求都是针对ASCII集中的某个字符检查单个表或字段名称的单个字符。如果选中的字符小于注入器提供的字符,则注入的部分将评估为2
并且查询正常运行。否则,它将评估为2 RLIKE 2
并且查询失败。这样,进样器脚本将其正在测试的字符的潜在值范围分成一半。接下来的查询会一次又一次地缩小它,直到它找到确切的字符。它最多需要7个注入请求才能找到单个字段表的单个字符。
然后它从位置2 RLIKE (
处的角色开始,依此类推。使用相同的技术,但使用不同的查询,脚本首先找到它想要查找的名称。
这个过程很乏味,但这就是为什么计算机首先被发明出来的原因:为人类做繁琐的工作。