Thinkphp5.0 最新SQL注入漏洞利用详情

 
 
              ThinkPHP 5.0是目前最新的版本,历经多年的升级完善,深受网站设计公司
 
的喜欢,在互联网上也是一个开源的,免费、多个功能插件、API接口功能强悍的PHP
 
语言开发的一款程序,ThinkPHP从设计以来一直秉承简洁实用的设计原则,在保证出
 
色的性能和至简的代码的同时,也很注重实用性。
 

 
SINE安全公司在对其最新版本的程序进行网站安全审计的时候,发现该程序存在数据
 
库密码信息泄露漏洞,在PDO PHP查询中可以阻止大多数的恶意参数攻击,而且
 
ThinkPHP 5.0框架要求的是在php 5.4版本上运行,这也就防止了php在5.3.6版本下
 
的SQL查询注入的漏洞。
 

 
在对其代码进行安全审计,其实这是一个SQL注入点,可以查询到一些数据库的账号
 
以及密码等安全信息。Thinkphp5.0里代码设计里调用到了函数input来替代3.2.3版
 
本里的I函数,利用该函数,控制了in语句的数值位置,即可通过传入一个数组并带
 
入恶意的参数,来构造SQL注入语句,进行获取数据库的账号密码。
 

 
在$bindName参数里我们对网站进行了详细的网站安全检测,将$k数值写进到了
 
$bindName里,并在$value数值确实为一个数组的同时,这里边会遍历全部的$value
 
的数值,也就是说我们控制了预编译SQL语句中的键名,也是可以控制了预编译的SQL
 
语句,这个在理论上来说是一个SQL注入漏洞。
 

这漏洞过程当中涉及到预编译的执行过程了。通常PDO PHP预编译执行过程分三步:
 
一、prepare($SQL) 编译SQL语句
 
二、bindValue($param, $value) 将value绑定到param的位置上
 
三、execute() SQL语句执行
 
这个漏洞实际上就是控制了第二步的$param变量,这个变量如果是一个SQL语句的话
 
,那么在第二步的时候是会抛出错误的:Sine安全公司是一家专注于:服务器安全
 
网站安全、网站安全检测、网站漏洞修复,渗透测试,安全服务于一体的网络安全服务
 
提供商。
 
看页面提示是有SQL注入漏洞的,笔者在这里也尝试着使用MYSQL报错注入,但结果失
 
败的,值得一提的是这种数据库账户和密码泄漏的前提是SQL语句执行失败或者发生
 
异常的时候才会出现。如果非SQL语法错误的debug模式下是不会泄漏数据库账户和密

码的。


 
执行发现,虽然我只调用了prepare函数,但原SQL语句中的报错已经成功执行:
 
究其原因,是因为我这里设置了PDO::ATTR_EMULATE_PREPARES => false。
 
这个选项涉及到PDO的“预处理”机制:因为不是所有数据库驱动都支持SQL预编译,
 
所以PDO存在“模拟预处理机制”。Sine安全公司是一家专注于:服务器安全、网站
 
安全、网站安全检测、网站漏洞修复,渗透测试,安全服务于一体的网络安全服务提供
 
商。
 
 
如果说开启了模拟预处理,那么PDO内部会模拟参数绑定的过程,SQL语句是在最后
 
execute()的时候才发送给数据库执行;如果我这里设置了
 
PDO::ATTR_EMULATE_PREPARES => false,那么PDO不会模拟预处理,参数化绑定整
 
个过程都是和Mysql交互进行的。
分享: