这个SQL注入是做什么的?

时间:2011-12-16 19:54:47

标签: mysql sql-injection

长话短说,通过旧的asp网站我运行的人发现了一个未经过滤的URL参数,并且能够运行此查询。我试图弄清楚它做了什么......

查询应为:

select * from reserve where id = 345

运行的是:

select * from reserve where id = 345 and ascii(substring((select concat(user,0x3a,password,0x3a,host) from mysql.user limit 0,1),17,1))=53

我真的不确定这会得到什么。任何输入?

5 个答案:

答案 0 :(得分:5)

可能正在探测Web应用程序是否以root访问数据库。当以root身份运行时,删除ascii(substring())部分将返回以下内容:

mysql> select concat(user,0x3a,password,0x3a,host) from mysql.user limit 0,1;
+--------------------------------------+
| concat(user,0x3a,password,0x3a,host) |
+--------------------------------------+
| root:<rootpw-hash>:localhost         |
+--------------------------------------+

在成功探测之后,他们可能会尝试检索mysql.user的内容,从中可以开始破解彩虹表的密码。

答案 1 :(得分:2)

SQL正在尝试从My-Sql用户表中读取用户数据,该用户表通常包含允许访问给定my-sql服务器的用户和主机列表。

在我看来,perp正试图欺骗mysql转储用户表的内容,以便他们可以离线记录密码哈希值并将其解密以查找有效的登录信息。

如果您的Web应用程序使用允许访问mysql用户表的登录,那么这是一个严重的安全漏洞,如果它使用的登录只被授予应用程序所需的表的权限,那么没有信息将可以获得。

安全提示:在设置任何类型的数据库时,使用该应用程序并使用登录/访问角色授予它所需要的一切至关重要。

如果您的应用程序只需要读取数据并且从不修改它,那么除了读取之外它永远不应该具有任何权限。您总是需要仔细检查这一点,因为大多数数据库系统默认情况下会为具有完全读取,创建,修改权限的给定数据库创建用户角色。

始终为该数据库和/或表集合创建特定用户,并始终为该用户提供所需的绝对最小值,如果您的应用程序确实遭到黑客攻击,那么他们将获得最多的攻击访问也是一个特定的数据库。

答案 2 :(得分:2)

where条件的第二部分真的很奇怪:它查找mysql凭据并按如下方式处理它们:

  • concat(用户,0x3a,密码,0x3a,主机)将类似于'someUser:hisPass:localhost'
  • 以上字符串将以较小的一个
  • 分割
  • 上面的字符串被转换为ascii代码(您可能将它从遗留语言中称为ord())
  • 将转换结果与53整数
  • 进行比较

我认为WHERE语句的第一部分(id = 345)将始终返回true,而第二部分太具体,因此整个查询可能始终返回空结果。 / p>

答案 3 :(得分:2)

查询看起来似乎是一组中的一个:

  • 通过更改charcode和substring start位置,你可以找到所有用户名和相应的密码哈希值(当页面按预期呈现时你有一个char匹配)
  • 它允许找出当前用户有权访问mysql架构。

答案 4 :(得分:2)

sql注入漏洞不一定立即将查询结果输出到攻击者屏幕,结果通常只是错误或没有错误,或者注入可能导致可测量的(对攻击者)延迟。通过这种方式,攻击者可以获得每个请求的1位信息。

通过发送大量请求,迭代字符串位置,对字符进行二进制搜索 - 或者在这种情况下进行线性搜索(这可能表明攻击者并不真正理解他在做什么,但他会得到最后),他将能够找到mysql root用户passwordhash中的所有字符。 (这可能是离线强制执行的。)