freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Myql SLEEP函数和SQL注入
2018-12-14 18:06:40

1.png

缘起

如果你审查过的慢查询日志或者网站access日志中,你可能都会看到如下的语句:

time.png

可能就是你网站启用后大概1小时候内就收到的日志,或者你Web服务器(nginx)访问中看到的。如果你是在Mysql慢查询日志中或者access日志中看到,并且该跳请求返回的状态码为200,而不是404,那么恭喜你可能中标了,被人Sql攻击了。本文虫虫就和大家以sleep()函数为介入来讨论。

SLEEP()函数

“sleep(n)”,暂停数据库n秒。

不要混淆MySQL控制台中的sleep状态,它描述了连接的状态,SLEEP函数做了一件事,就是暂停数据库的执行,直到设定的时间。那么该操作有什么用?为什么要用它呢?

通常,有一些操作需要一段时间来操作,操作时候需要暂时操作或者更新(比如数据锁,比如记录一个Pos点后,备份一个从库),当然也有可能是黑客攻击。

漏洞渗透和扫描

如果你的数据库和网站没有做安全措施,直接把端口暴露在公网上(比如ssh 22端口,mysql 3306端口),那么,很快就会能有扫描器对你的端口进行扫描渗透。所以虫虫以也提到过在主机防护中的条款:禁止把端口暴露在公网;修改常用端口。专门对于mysql,最常用的扫描渗透和安全审计工具是sqlmap。

2.png

sqlmap是使用Python编写的一款数据库sql注入扫描工具,目前支持常见的mysql、oracel、postgresql、sql server,access,db2,sqlite等数据的安全漏洞(sql注入)。

在sqlmap盲主扫描中,通常会Fuzzy各种sql语句,通常还会使用sleep命令。比如扫描那些使用旧的mysql或mysqli等非PDO的连接PHP MySQL网站,然后枚举易受攻击的AJAX命令列表或GET/POST结果,在输出扫描结果时候的通常需要中止执行。

sqlmap及同类工具可以并行攻击几十个站点,通过对这些网站强制数据库sleep一段时间(数字设定取决于个人经验),通过计数sleep的时间,来测试渗透命令中的有效性,这在安全界通常叫基于时间的盲注,下面是sqlmap中相关时间盲主部分的源码:

3.png

解析

在本文开头,我们举了一个sql语句的例子,这是常用的盲注的典型语句。如果执行SELECT语句,其中的条件语句部分被替换为类似以下的内容,那么它将绝对锁定数据库:

time.png

注意该语句巧妙地使用各种运算符和分隔符。注意该语句,对只对拼写sql语句的程序有用,使用PDO该语句可以被过滤,不能执行的 。

PHP mysql注入示例

让我们写一个php的示例,来说问题。看以下PHP函数:

4.png

上面的示例中,我们使用implode函数生成以逗号分隔的ID列表。由于对输入没有任何验证,传入的数组中,可能是非法的具有SLEEP的命令或者dump语句,实现数据库表中的数据的“脱裤”,甚至一些安全设置会导致,浏览服务器上的文件(/etc/shadow等)。

5.png

针对这种问题,你需要使用对传入的数据做验证,验证长度(根据实际需要限制参数长度,可以极大防止注入的成功)。你还可以使用PDO等链接框架,利用占位符?代替(绑定)参数生成sql语句,并通过prepare做参数验,这样可以阻止绝大多数的SQL注入的值。


6.png

PDO并非灵丹妙药

上面我们也说通过PDO可以预防绝大多数的PHP Sql注入问题,但是他不是100%保证能解决所有问题。

如前所述,自己拼凑Sql的原始动态组合方法,让很多PHP系统处于危险之中

所以,一无所措的码农们不可避免地会通过谷歌寻求帮助他们:


7.png

上面是网上一个很流行的PDO使用教程之一,该代码使用PDO,但是并没有什么蛋用,和纯的手动拼凑Sql的并没有什么两样,也是非常危险的做法。

再看如下StackOverflow(一个知名的编程问答网站)上的的一个答案:

8.png

看到了么,这也是很糟糕的代码,但是还被接受了。在码农们接受的概念是"使用PDO可以防止sql注入",但是他们不知道PDO防止注入也是有前提的,那就是必须是用"?占位符绑定写SQL,然后prepare,然后execute",否则等于没有用。

不要小看sleep

可能你觉得发现sleep执行,并没有什么的?起码不会DROP你的数据库。SLEEP很容易识别,并且在该阶段通常几乎没有啥害。但是通过,可以在通过盲注Fuzz测试数据执行大量的查询,并很快就找到有效的攻击EXP。

实际上,这就死sqlmap的核心功能。这种思路的一个问题是,在依赖于MySQL for UX/UI的生产Web项目中,通常的做法是将代码执行用户限制为仅具有SELECT权限,不给他DROP权限。但是SLEEP()使用只需SELECT权限。

善用sleep实现攻击探测(IDS)

因为SLEEP函数的使用只需要SELECT,不需要任何特权权。并且可以作为"最安全的"MySQL命令执行。

它只是一个SQL注入漏洞,无法使用定时攻击暂停数据库执行或浏览数据(或对其进行dump)。而且一般通过简单的配置无法禁用SLEEP函数。MySQL可以在数据库,表和列级别做权限限制。当然如果能有办法简单这顶对某些危险函数的禁止也是有意义的(比如php.ini中的disable_functions配置)。

实际上sleep也给了我们一种防御思路,基于对该函数关键字的探测来实现sql攻击告警和防御。比如虫虫自研了一款web防火墙App-Waf(https://github.com/bollwarm/App-Waf)就是基于这样的探测原理,通过分析访问日志中的关键词,其中就包括了sleep函数,下面是我用的关键字规则(部分)。

9.png

本文中虫虫和大家一起以Mysql的sleep()函数为介入讨论了Sql注入的问题,总体上来说可以使用sleep来枚举SQL漏洞,PDO绑定参数的方法擦可以防御Sql注入,sleep一般无害,而且不会正常情况下很少用的到,但是可以变废为宝用他来做为探测攻击的手段。

# SQL注入 # SqlMap # sql盲注 # sleep
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者