利用Bambdas优化HTTP视角分析

本文介绍了如何使用Burp Suite的自定义列功能(Bambdas)来解析HTTP请求和响应,提升安全测试效率。涵盖从基础操作到高级技巧,如GraphQL解析、会话Cookie解码和CSP检测等实用脚本。

利用Bambdas优化HTTP视角分析

当你打开一个HTTP请求或响应时,会本能地寻找什么?可疑的参数名?CORS头?还是请求来源或底层目的的线索?每个HTTP消息对不同观察者可能讲述不同故事,但现代网站发送成千上万条消息,很容易忽略关键内容。

为帮助解决这一问题,Burp Suite最近添加了对自定义列的支持,允许你个性化HTTP请求中哪些元素显示在表格中。以下是一个简单示例,从请求体中解析GraphQL操作并放入列中:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// 示例:解析GraphQL操作名
String paramName = "operationName";
if(requestResponse.request().hasParameter(paramName, HttpParameterType.JSON)) {
    return requestResponse.request().parameterValue(paramName, HttpParameterType.JSON);
}
String query = requestResponse.request().parameterValue("query", HttpParameterType.JSON);
if(query.contains("{") || query.contains("(")) {
    var queryParts = query.split("\\{|\\(");
    return queryParts[0];
}
return "";

幕后,这些功能通过称为bambdas的代码片段实现。该功能强大到几乎令人不知所措,因此我们分享研究团队创建的一些列示例,从简单实用到复杂不等。熟悉Java的读者可能注意到我们未刻意避免空指针异常——这是因为它们在行级别处理,通常不会导致问题。

实用Bambdas示例

请求来源页面

理解HTTP请求序列流对发现许多高级漏洞至关重要,此脚本使其更简单:

1
return requestResponse.request().headerValue("Referer");

响应来源的Web服务器

或许我有针对特定代理的WAF绕过或缓存投毒攻击:

1
return requestResponse.response().headerValue("Server");

HTTP版本

应优先处理请求走私还是竞争条件?我的10,000词目录暴力破解需要多长时间?

1
return requestResponse.request().httpVersion();

IP地址所有者

或许应改为目标其基础设施。反向DNS是美妙的东西:

1
2
String ipAddress = requestResponse.httpService().ipAddress();
return java.net.InetAddress.getByName(ipAddress).getCanonicalHostName();

是否在范围内?

你不想意外目标范围外的东西:

1
return requestResponse.request().isInScope();

会话Cookie的Base64解码

像JWT这样的编码签名令牌无处不在,总是值得窥探。此脚本需要根据目标定制:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
if (!requestResponse.hasResponse()) return "";
var extract = "session";
var response = requestResponse.response();
var optionalCookie = response.cookies().stream().filter(cookie -> cookie.name().equals(extract)).findFirst();
if(optionalCookie.isEmpty()) return "";
var value = optionalCookie.get().value();
var parts = value.split("\\.");
if(parts.length != 3) return "";
var payload = parts[1];
return utilities().base64Utils().decode(payload, Base64DecodingOptions.URL);

哪些Cookie禁用了SameSite?

在策划CSRF或XSS攻击时,了解是否有Cookie禁用SameSite很有用:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
if(requestResponse.response() == null) return "";
if(!requestResponse.response().hasHeader("Set-Cookie")) return "";
ArrayList<String> cookieNames = new ArrayList<>();    
Pattern pattern = Pattern.compile("^ ([^=]+).+; SameSite=None", Pattern.CASE_INSENSITIVE);
List<HttpHeader> headers = requestResponse.response().headers();
for(HttpHeader header : headers) {
    Matcher matcher = pattern.matcher(header.value());
    while(matcher.find()) cookieNames.add(matcher.group(1));
}
return String.join(", ", cookieNames);

响应是否有不良CSP?

此自定义列Bamda允许你优先测试部署了不安全CSP指令(如unsafe-inline或unsafe-eval)的易受攻击端点:

1
2
3
4
5
6
7
8
9
if(requestResponse.response() == null) return "";
if(!requestResponse.response().hasHeader("Content-Security-Policy")) return "No CSP";
String csp = requestResponse.response().headerValue("Content-Security-Policy");
ArrayList<String> vulnerableDirectives = new ArrayList<>();
String[] directivesToCheck = new String[]{"unsafe-inline", "unsafe-eval"};
for(int i=0;i<directivesToCheck.length;i++) {
    if(csp.contains(directivesToCheck[i])) vulnerableDirectives.add(directivesToCheck[i]);
}
return String.join(", ", vulnerableDirectives);

通过排序自定义列进行优先级排序

你可以通过自定义列对整个表格排序,帮助确定优先处理哪些请求。随着时间的推移,我个人可能会编写一个巨型bambda,从0-100评分请求的可攻击性,但目前有两个简单示例:

此请求有多少参数?

有时,你只想尽快找到最大的攻击面:

1
return requestResponse.request().parameters().size();

响应中有多少’HTTP_‘出现?

这可能表示环境变量泄漏,或可调整以查找各种其他有趣字符串:

1
2
3
if (!requestResponse.hasResponse()) return 0;
String lookFor = "HTTP_";
return utilities().byteUtils().countMatches(requestResponse.response().body().getBytes(), lookFor.getBytes());

执行Shell命令

也许下次吧。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计