一、事件起因
在一个风和日丽的夜晚,我收到一位朋友的请求,希望我协助检查一个特定的站点。为了表达谢意,他还特意为我准备了第二天晚上的早饭。抱着对美食的期待,我开始着手调查这个站点的问题。
二、渗透过程
最初,我尝试对目标站点进行黑盒测试。然而,目录扫描会导致IP被封禁,后台账号密码和前台注册邀请码的爆破尝试也都以失败告终。前端的JavaScript代码复杂且难以解读,导致无法取得实质性的进展。面对这些困难,我决定改变思路,通过特征搜索找到了该站点的源码。
前台登录页面和后台登录页面都具有典型的设计风格,初步判断是基于ThinkAdmin进行的二次开发。由于代码量不大,我选择手工审计代码而非借助工具。
1. 任意文件读取漏洞
在代码审计过程中,我发现了一个可疑的参数encode
。通过传入特定的加密参数,可以实现对任意文件的读取,例如配置文件
config/database.php
这类漏洞与之前ThinkAdmin曝出的任意文件读取漏洞相似,尽管代码有所修改,但核心问题依然存在。
2. 文件上传漏洞
进一步审查代码,我发现了Base.php
中的upload_base64()
函数。该函数接受两个参数:$type
和$img
,其中$img
为经过Base64编码的图片数据。代码通过正则表达式解析文件内容和后缀,检查并创建相应的文件夹,最后保存文件。
值得注意的是,该函数缺乏对上传文件的有效验证和过滤,导致存在文件上传漏洞。前端多处调用了upload_base64()
函数,只需通过POST请求传递特定参数即可上传任意文件,从而可能执行恶意代码。
3. 获取Shell权限
综合利用上述漏洞,可以实施一系列攻击步骤。如果目标站点的数据库端口(如3306)暴露在公网,通过任意文件读取漏洞获取数据库的账号和密码,然后获取有效的邀请码完成注册登录,最后利用文件上传漏洞获取Shell权限,全面控制目标站点。
三、总结
此次渗透测试案例中,主要漏洞源于对已有框架的二次开发过程中未能充分考虑安全性,导致经典漏洞重新出现。尽管攻击手段并不复杂,但也凸显了代码审计在安全测试中的重要性。通过这次实践,我进一步深化了对代码安全审计的认识,也提醒开发者在二次开发过程中应严格遵循安全编码规范,及时修补已知漏洞,确保系统的安全性。
原文始发于微信公众号(暗影网安实验室):渗透测试实战 | 代码审计攻破目标站点
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论