利用web内径图谱来检测EAR漏洞
字数 1583 2025-08-26 22:11:40
Web内径图谱检测EAR漏洞教学文档
1. EAR漏洞概述
1.1 定义
EAR漏洞(Execution After Redirection)即执行重定向逻辑漏洞,指在Web应用中,虽然进行了header跳转或href跳转,但由于未正确终止后续代码执行,导致页面代码及内容仍可被执行或返回的安全问题。
1.2 漏洞原理
- 关键操作的鉴权没有加上exit/die等终止函数
- 程序执行了跳转(header或href)但后续代码仍继续执行
- 常见于安装功能和鉴权功能场景
1.3 典型漏洞代码示例
function check_login() {
session_start();
if(isset($_SESSION['user']) || isset($_SESSION['pass'])) {
} else {
echo "<script>";
echo "window.location.href = '?c=login'";
echo "</script>";
// 缺少exit/die语句
}
}
2. EAR漏洞危害
2.1 信息泄露
- 泄露后台页面源码
- 暴露接口参数和功能调用方式
2.2 功能滥用
- 无限制调用后台功能
- 绕过权限检查执行敏感操作
2.3 安装漏洞
- 重安装漏洞(通过绕过lock检查)
- 数据库参数重置
3. 传统检测方法
3.1 白盒审计
- 检查安装功能和鉴权功能代码
- 确认跳转后是否有exit/die语句
- 优点:直接有效
- 缺点:需要源代码访问权限
3.2 黑盒测试
- 使用Burp Suite等工具抓包
- 观察跳转后页面响应内容
- 优点:无需源代码
- 缺点:覆盖率低,效率不高
4. 基于Web内径图谱的检测方法
4.1 整体思路
- 构建Web应用的完整路径图谱
- 通过图查询识别可疑路径
- 检测从公开页面到受保护页面的异常路径
4.2 爬虫机制实现
4.2.1 爬虫改造要点
- 重写Scrapy框架爬取逻辑
- 记录URL爬取先后顺序和层级关系
- 抽取表单参数(用于后续漏洞验证)
4.2.2 关键代码实现
def parse(self, response):
# 抽取页面所有链接
url_list = response.xpath('//a/@href').extract()
# 抽取表单信息
form_list = response.xpath('//form').extract()
url_result, form_result = [], []
# 处理表单数据
for form in form_list:
form_selector = Selector(text=form)
action = form_selector.xpath('//form/@action').extract()[0]
# 处理相对路径
if urlparse.urlparse(action).netloc == '':
action = urlparse.urljoin(self.root_url, action)
param_type = form_selector.xpath('//form/@method').extract()[0]
param_list = form_selector.xpath('//input').extract()
result = {}
for param in param_list:
param_selector = Selector(text=param)
name = param_selector.xpath('//input/@name').extract()
value = param_selector.xpath('//input/@value').extract()
if name:
name = name[0]
if value:
value = value[0]
else:
value = ''
result[name] = value
form_three = [action, param_type, result] # 表单三元组
if self.form_include(self.form_set, form_three):
self.form_set.append(form_three)
form_result.append(form_three)
# 处理URL链接
for url in url_list:
url_add = urlparse.urljoin(response.url, url)
if '#' in url_add:
url_add = url_add[:url_add.find('#')]
if urlparse.urlparse(url_add).netloc == self.status_root.netloc and url_add not in UrlSpider.url_set:
self.url_set.add(url_add)
url_result.append(url_add)
yield scrapy.http.Request(url_add, callback=self.parse, dont_filter=True)
# 存储结果
item = NgItem()
item['url'] = response.url
item['form'] = form_result
item['name'] = url_result
yield item
4.3 图数据库构建
4.3.1 数据库选择
- 使用Neo4j图数据库
- 适合表示Web应用的路径关系
4.3.2 数据模型设计
- 节点:URL页面
- 关系:"next"关系表示页面跳转顺序
- 可选属性:表单参数(用于漏洞验证)
4.4 检测原理
4.4.1 核心检测逻辑
- 查询从首页(index.php)到后台功能页面的最短路径
- 检查路径中是否包含后台首页节点
- 如果包含,则可能存在EAR漏洞
4.4.2 图查询示例
MATCH (p1:url {name:'http://127.0.0.1/101html/index.php'}),
(p2:url{name:'http://127.0.0.1/101html/index.php?c=admin&a=save_content'}),
p=shortestpath((p1)-[*..10]-(p2))
RETURN nodes(p)
5. 完整检测流程
-
爬取阶段:
- 从网站首页开始爬取
- 递归获取所有可访问URL
- 记录URL之间的跳转关系
-
图谱构建:
- 将爬取结果导入Neo4j
- 建立URL节点和跳转关系
-
漏洞检测:
- 配置后台关键URL作为检测终点
- 执行图查询寻找可疑路径
- 分析路径中的关键节点
-
结果验证:
- 对可疑路径进行手动验证
- 确认是否存在EAR漏洞
6. 优化与扩展
6.1 双爬虫机制
- 爬虫1:无权限爬取(模拟普通用户)
- 爬虫2:带登录权限爬取(模拟管理员)
- 比较两者爬取结果的差异
- 识别权限绕过可能性
6.2 自动化检测
- 预定义常见后台URL模式
- 自动识别可能的敏感端点
- 批量执行图查询检测
6.3 路径可视化
- 将检测结果可视化展示
- 直观显示漏洞利用路径
- 辅助安全分析
7. 局限性
-
爬取覆盖率:
- 动态生成内容可能无法完全覆盖
- JavaScript渲染的内容需要特殊处理
-
配置需求:
- 需要预先配置检测终点(后台URL)
- 对于不常见的后台路径可能漏报
-
误报可能:
- 合法公开的后台页面可能导致误报
- 需要结合其他信息进行验证
8. 实际应用建议
-
目标选择:
- 优先检测安装程序和后台管理系统
- 关注鉴权相关功能点
-
结合其他方法:
- 与常规扫描工具结合使用
- 白盒审计辅助确认
-
持续监控:
- 对关键系统建立定期检测机制
- 跟踪新增URL和功能
9. 参考实现
GitHub项目地址:
https://github.com/yinhongji/WebCrawl
10. 总结
基于Web内径图谱的EAR漏洞检测方法提供了一种新颖的黑盒检测思路,通过构建完整的应用路径图谱,能够有效识别传统方法难以发现的权限绕过问题。该方法特别适合检测复杂的逻辑漏洞,为Web应用安全评估提供了新的技术手段。