每天分享更多技能、工具及体系化视频教程,旨在提高访问效率,减少页面访问开销。
在Thinkphp框架中,由于数据序列化后存入缓存文件,使得命令执行等行为成为可能,可能导致攻击者插入恶意代码,直接执行webshell等攻击。下面我会详细解析这个过程中的一些关键点和安全问题。
一、缓存函数设计不严格
--
Thinkphp框架在处理缓存时,将数据序列化后存入一个php文件。这种处理方式如果设计不严格,就可能被攻击者利用,插入恶意代码,直接获取webshell等权限。
二、关键代码解析
例如,当寻找Cache.class.php文件时,这是缓存文件的关键部分。读入配置,获取实例化的一个类的路径,路径是Think\Cache\Driver\。这里尝试了使用var_dump和echo等函数直接在浏览器中访问Cache.class.php,但无预期那样打印出类名。后来发现需要数据写入缓存页面跳转才能打印出Think\Cache\Driver\相关的内容。
三、注入问题
--
在update等数据库操作中,由于拼接SQL语句并未进行充分过滤,可能导致SQL注入。例如,在使用where方法制定主键的数值时,如果参数未经过严格过滤,就可能被注入恶意SQL代码。
四、漏洞利用
--
以find函数为例,当$options参数为数组且主键也为数组时,可以绕过一些判断,直接进入解析流程。如果$options中的where参数可控且未经过滤,那么就可以构造SQL注入语句。同样,delete函数也存在类似的问题,需要在解析完$options后对where参数进行判断,需要我们传入值使之不为空,从而继续执行删除操作。
五、总结与防护建议
--
针对上述问题,首先要开启缓存的安全设置,避免恶意代码的写入。要设置DATA_CACHE_KEY参数,避免被猜到缓存文件名。应确保缓存使用文件方式的安全性,并避免将缓存目录在web目录下面。要及时更新Thinkphp框架的版本,修复已知的安全漏洞。对于数据库操作,要严格过滤用户输入,避免SQL注入等安全问题的发生。
数据库的联接利用了PDO(PHP Data Objects)进行实现。为支持堆叠注入,需要设置`PDO::MYSQL_ATTR_MULTI_STATEMENTS`为`true`。这个配置至关重要。
在此,我们通过控制`$this->config`来达成与数据库的连接。此过程需要细致的操作以确保配置的正确性。
驱动类被设计为抽象类,其目的是为了确保只有在合适的类实例化后才能使用。在此情境下,我们选择了mysql类来进行实例化操作。
至此,我们已经完成了一个通过反序列化触发SQL注入的链条。
关于POC(Proof of Concept),它在此处扮演了验证和演示的角色。由于此系统能够连接至任意服务器,因此存在一种被称作“MySQL恶意服务端读取客户端文件漏洞”的利用方式。
具体利用方式为:我们需先启动一个恶意的mysql服务,当客户端尝试访问时,我们的恶意服务会自动读取客户端的可读文件。其中,“hostname”指的就是我们启动的恶意mysql服务的地址和开放的3307端口。
搭建恶意mysql服务详解
在mysql的日志文件中,我们可以看到被提取出来的文件信息,如“flag.txt”。