查找此尝试的 SQL 注入查询的解释

Looking for an explanation of this attempted SQL injection query

提问人:James Paterson 提问时间:7/15/2022 更新时间:7/17/2022 访问量:151

问:

查看我的日志,我发现以下查询字符串是尝试执行 SQL 注入的尝试,可能来自自动化工具:

(select*from(select+sleep(10)union/**/select+1)a)

据我所知,它正在尝试基于时间的攻击,以查看我数据库中是否有任何表以“a”开头 - 睡眠函数仅在联合查询匹配时才会运行?但我对攻击的其他部分有点困惑:

  • 为什么查询的各个部分之间有加号?
  • 为什么查询字符串中有注释?

会对任何答案感兴趣 - 我相当确定我的网站没有受到损害,因为我没有扫描该查询的进一步活动,也无法让它自己执行,所以只是想知道我的直觉是否正确。干杯!

postgresql sql 注入

答:

0赞 Terrell Plotzki 7/15/2022 #1

我不认为这是在尝试寻找以 a 开头的表,只需在可能的递归查询上运行睡眠,如果一堆递归查询执行,这可能会导致您的数据库出现问题。

+ 号可能是尝试进行一些字符串连接......这是我的猜测

无论如何,我都会强烈考虑追溯它的来源并清理您网站上的输入,以便原始输入(潜在的 sql )不会被放入查询中。

评论

3赞 Andy Lester 7/15/2022
我不认为这会导致问题,而是作为注射有效的指标。如果你把它发进去,并且需要 10.01 秒才能回复,那么你就知道注射有效了。sleep(10)
2赞 Andy Lester 7/15/2022
“清理您网站上的输入” 更好的是,在 SQL 中使用占位符,这样就不会使用外部数据来构建 SQL 语句。
2赞 jjanes 7/16/2022 #2

我不知道这有什么意义,也不知道试图弄清楚这一点的意义何在。注射比逆向工程更容易阻止,后者对前者没有多大贡献。

+ 和 /**/ 的点可能几乎相同,它们在不使用空格的情况下分隔标记。据推测,有人认为空格会触发某种警报或阻塞。

“a”只是一个别名,可能是为了避免错误“错误:FROM 中的子查询必须具有别名”

这在库存 PostgreSQL 中不起作用,因为没有拼写的函数。他们可能以不同的 DBMS 为目标,或者可能是使用特定应用程序/框架的 PostgreSQL,该应用程序/框架会创建自己的功能。sleepsleep

如果系统没有向最终用户返回有意义的消息,则可能会出现睡眠。如果需要 10 秒才能获得响应,那么您就知道睡眠已执行。如果它立即返回,您知道它没有执行,但不知道为什么它没有执行。

1赞 Egret 7/17/2022 #3

这是为了通过定时攻击来检测 SQL 注入(可能通过 HTML 参数)。插入的注释(正如其他人所提到的)旨在删除空格,同时仍然允许查询解析以试图欺骗自定义(设计不当)清理。“+”很可能是在经过 HTML 解码后被解码为空格。

如果替换空格并添加缩进,则更容易看到发生了什么:

select *           <-- match any number of columns on the original query
from               
(select            <-- nested sub-query in the from clause
 sleep(10)         <-- timing attack meant to detect whether the SQL ran 
 union             <-- not sure why the union is needed 
 select 1) a       <-- alias the subquery to "a"
)                  <-- close off matching parens in injected SQL?