Burp Xss Scanner插件开发思路分享(附下载)
字数 1627 2025-08-18 11:37:16
Burp XSS Scanner插件开发思路与实现详解
0x00 前言
Burp Suite虽然自带XSS检测功能,但其Payload和检测数量不可控。本文介绍如何开发一款自定义Burp XSS检测插件,主要特点包括:
- 对每个参数只需发送一次Payload即可检测分隔符逃逸
- 支持DOM XSS检测
- 使用Java HtmlUnit进行页面渲染分析
0x01 检测思路概述
- 发送包含
'"<>特殊字符的HTTP请求 - 分析响应中这些字符的过滤情况
- 对于HTML和JS内容XSS可直接分析响应
- 对于DOM XSS需要使用HtmlUnit渲染页面并hook关键JS函数
0x02 HTML-Content XSS检测
基本原理
通过分析响应中特殊字符的过滤情况,判断是否存在XSS漏洞。
HtmlUnit的自动修正问题
HtmlUnit会自动修正错误的HTML语法,这会影响检测结果:
测试案例1:
<?php
$url = $_GET['url'];
echo "TTT`
渲染后结果:
```html
<html>
<head/>
<body>
</html>
解决方案:
- 闭合前面的标签:
test.php?url='"/>TTT'"<>TTT - 使用标签包裹Payload:
test.php?url='"/><TTT'"TTT>
过滤情况检测
当某些字符被过滤时(如<、>、"被替换),可采用以下策略:
- 使用未被过滤的字符(如单引号
') - 观察HtmlUnit如何处理修正后的标签
过滤案例:
<?php
$url = $_GET['url'];
$url = str_replace("<","00",$url);
$url = str_replace(">","11",$url);
$url = str_replace("\"","22",$url);
echo "`
结果:
```html
检测逻辑总结
- 检查是否能逃逸当前分隔符
- 根据HtmlUnit的修正行为调整Payload
- 使用正则匹配判断可利用性
0x03 JS-Content XSS检测
基本原理
JS上下文中的XSS检测相对简单,因为错误的JS语法不会被自动修正。
测试案例:
<?php
$url = $_GET['url'];
?>
<script>var a = <?php echo $url;?></script>
Payload:test.php?url=000111"'<TTT'"TTT>
响应:
<html>
<head>
<script>//<![CDATA[
var a = "000111"'<TTT'"TTT>script>
</head>
<body/>
</html>
检测方法
- 使用正则表达式匹配Payload中的特殊模式
- 判断是否能逃逸当前分隔符(如引号、分号)
正则示例:
- 匹配标签:
<ttt(.*?)'"ttt(.*?)> - 逃逸分号检测:
'(.*?)ttt(ttt(.*?)'
0x04 DOM XSS检测
检测挑战
DOM XSS需要通过JS执行才能发现,传统响应分析无法检测:
document.writeinnerHTMLevallocation相关操作setTimeout/setInterval
解决方案:JS函数Hook
通过修改返回报文,Hook关键JS函数来监控可疑操作。
实现技术
- 继承
FalsifyingWebConnection类修改响应 - 在响应中添加Hook代码
核心代码结构:
public class WebConnectionListener extends FalsifyingWebConnection {
public WebConnectionListener(WebClient webClient) throws IllegalArgumentException {
super(webClient);
}
@Override
public WebResponse getResponse(WebRequest request) throws IOException {
WebResponse response = super.getResponse(request);
// 修改响应内容
return createWebResponse(...);
}
}
关键函数Hook实现
- eval函数Hook:
var _eval = eval;
window.eval = function(string) {
append("eval",string);
_eval(string);
};
- setTimeout Hook:
var _setTimeout = setTimeout;
window.setTimeout = function(code,millisec) {
append("settimeout",code);
_setTimeout(code,millisec);
};
- location操作Hook:
location.href赋值:
location.__defineSetter__('href', function(url) {
append("location",url);
});
location.replace调用:
var _replace = function(url){
append("location.replace",url);
};
- location直接赋值:
通过修改响应报文,将location = "xss"转换为location.href = "xss"
结果收集
添加自定义append函数收集检测结果:
function append(type,payload){
if(payload.indexOf("111000")>-1) {
var para=document.createElement("p");
var node=document.createTextNode(type + payload);
para.appendChild(node);
var element=document.getElementsByTagName("html")[0];
element.appendChild(para);
}
}
0x05 完整实现要点
- HtmlUnit配置:
WebClient webClient = new WebClient();
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setUseInsecureSSL(true);
webClient.getOptions().setThrowExceptionOnScriptError(false);
- 页面渲染与捕获:
try {
HtmlPage page = webClient.getPage(url);
System.out.println(page.asXml());
} catch (ScriptException e) {
System.out.println(e.getFailingLine());
System.out.println(e.getPage().asXml());
}
- Payload设计:
- 包含可识别的标记(如"TTT")
- 包含所有特殊字符(
'"<>) - 适应HtmlUnit的自动修正特性
0x06 检测流程总结
- 发送包含特殊字符的Payload
- 对响应进行三种检测:
- HTML上下文检测
- JS上下文检测
- DOM型XSS检测(通过函数Hook)
- 分析结果并报告漏洞
0x07 扩展思路
- 增加更多上下文检测(如CSS、URL上下文)
- 完善Payload生成策略
- 添加更多JS函数Hook(如
setInterval、innerHTML等) - 优化结果分析逻辑,减少误报
通过这种自定义插件开发,可以实现比Burp自带功能更灵活、更全面的XSS检测能力,特别是对DOM XSS的检测能力显著提升。