mysql – php中的sql查询注入攻击

谁能解释一下这个查询的含义?

-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”.

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

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

工作原理:它会引入奇怪的嵌入式查询,如问题中提到的那样,并检查页面的行为.检查失败时,检查其查询结果的页面会生成不同的内容.它显示错误消息或重定向到某个页面,或者有时它不会产生任何输出(当查询失败的“处理”类似于“或die()”时).

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

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

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

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

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

然后它从位置K 1处的角色开始,依此类推.使用相同的技术但使用不同的查询,脚本首先查找要查找的名称的长度.

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

转载注明原文:mysql – php中的sql查询注入攻击 - 代码日志