其他 HTTP 代理提供了良好的性能,但是,BurpSuite 由于其扩展能力,无疑是最好的工具。正如我们在前面的章节中所看到的,扩展添加了很多函数,因此它们可以集中于一个特定的问题。
创建扩展的能力为用户自动化测试活动提供了很大的帮助。BurpSuite 支持 Java、Python 和 Ruby 来开发扩展,因此它可以灵活地为开发人员提供方便的访问。
在本章中,我们将回顾一个新扩展的开发过程,并提供一些技巧和技巧,以便在安装 BurpSuite 时使用。
我们将在本章中介绍以下主题:
- 建立发展环境
- 编写 BurpSuite 扩展
- 执行扩展
要开发您自己的扩展,您可以使用开源的集成开发环境(IDEs),例如 NetBeans 或 Eclipse。为自己选择最舒适的 IDE。在这种情况下,我们将使用 NetBeans:
- 转到 NetBeans 网站(https://netbeans.org/ 下载最新版本。不需要安装,因为 NetBeans 是用 Java 开发的,并作为 JAR 文件分发;只需解压缩下载文件并单击 netbeans bin 图标,如以下屏幕截图所示:
- 在开始使用 NetBeans 之前,请转到https://www.oracle.com/technetwork/java/javase/downloads/ 和。。。
任何 BurpSuite 扩展的基本类结构如下所示,由 PortSwigger 提供:
package burp;
public class BurpExtender implements IBurpExtender{
public void registerExtenderCallbacks (IBurpExtenderCallbacks callbacks){
// your extension code here
}
}
这基本上就是用于创建所有 BurpSuite 扩展的类定义。现在,让我们开始修改代码。
请记住,所有扩展都是以 PortSwigger 提供的结构(之前显示)为代码基础开发的,扩展的入口点如下:
void registerExtenderCallbacks (IBurpExtenderCallbacks callbacks);
如果要调用自己的扩展名,则需要使用以下方法:
callbacks.setExtensionName (Your extension name);
下面的代码显示字节实用程序。它们可用于管理字符串、搜索子字符串、编码、解码等:
int indexOf (byte[] data, byte[] pattern, boolean caseSensitive, int from, int to); String bytesToString(byte[] data); byte[] stringToBytes(String data); String urlDecode(String data); String urlEncode(String ...
现在,让我们使用 PortSwigger 提供的基本结构分析一个扩展的代码,以修改 HTTP 请求中的用户代理。
我们需要修改用户代理的第一件事是使用替代用户代理。在代码的下一部分中,我们创建一个默认用户代理列表,用于扩展;扩展名还提供了使用带有字符串的 XML 文件的选项,如下所示:
public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) { extCallbacks = callbacks; extHelpers = extCallbacks.getHelpers(); extCallbacks.setExtensionName("Burp UserAgent"); extCallbacks.registerSessionHandlingAction(this); printOut = new PrintWriter(extCallbacks.getStdout(), true); printHeader(); /* Create the default User-Agent */ bUserAgents.add("Current Browser"); bUserAgentNames.put("Current Browser", "Current Browser"); /* ...
PortSwigger 简化了将扩展与 Burp Suite 集成的方法,创建了一个新的 Burp Suite 选项卡,元素只需要几行代码。
首先,我们需要在 Burp Suite 的窗口中为我们的扩展定义一个新选项卡,如下所示:
bUAPanel = new JPanel(null);
JLabel bUALabel = new JLabel();
final JComboBox bUACbx = new JComboBox(bUserAgents.toArray());
JButton bUASetHeaderBtn = new JButton("Set Configuration");
我们还需要创建一个框,用于放置所有选项,以及每个选项的标签,如下所示:
bUALabel.setText("User-Agent:");
bUALabel.setBounds(16, 15, 75, 20);
bUACbx.setBounds(146, 12, 310, 26);
bUASetHeaderBtn.setBounds(306, 50, 150, 20);
bUASetHeaderBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
newUA = bUserAgentNames.get(bUACbx.getItemAt(bUACbx.getSelectedIndex()));
printOut.println("User-Agent header set to: " + newUA + "\n");
}
});
此外,我们需要补充的是,当应用或扩展打开时,没有没有没有默认值的应用或扩展提供给用户,如下所示:
bUALabel.setText("User-Agent:");
bUALabel.setBounds(16, 15, 75, 20);
bUACbx.setBounds(146, 12, 310, 26);
bUASetHeaderBtn.setBounds(306, 50, 150, 20);
bUASetHeaderBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
newUA = bUserAgentNames.get(bUACbx.getItemAt(bUACbx.getSelectedIndex()));
printOut.println("User-Agent header set to: " + newUA + "\n");
}
});
前面的代码块显示了所有扩展内容和图形界面,但以下几行显示了扩展本身的操作:
首先,我们设置初始变量和组件,如下所示:
@Override public String getTabCaption() { return "Burp UserAgent"; } @Override public Component getUiComponent() { return bUAPanel; } @Override public String getActionName(){ return "Burp UserAgent"; } @Override public void performAction(IHttpRequestResponse currentRequest, IHttpRequestResponse[] macroItems) { IRequestInfo requestInfo = extHelpers.analyzeRequest(currentRequest); List<String> headers = requestInfo.getHeaders(); String reqRaw = new String(currentRequest.getRequest()); String reqBody = ...
在服务、端口和技术检测之后,下一步是导航并了解应用的流程。这里,我们将重点讨论认证部分。
-
因此,打开 Burp Suite,配置完 web 浏览器后,进入https://www.mercadolibre.com.mx/ 。
-
正如我们前面提到的,Mercado Libre 是一家大型在线零售商,它是卖家和买家之间的中间方,提供套餐服务和金融服务。
-
在登录部分输入有效凭据,以了解其工作原理。
-
此处提供了有关认证流程的简历:
- 用户输入电子邮件地址或用户名和密码
- 用户已登录
- 如果用户关闭会话,下次进入登录部分时,他们只需输入密码,因为用户名已被占用
-
让我们检查登录请求:
POST /jms/mlm/lgz/msl/login/H4sIAAAAAAAEAzWNQQ7DIAwE_-JzFO4c-xHkEidBxQUZR6SK8veaSj3ueHd8QS5begf9VAIPdNacYlKYoGbUtQiHtNiBs6GWlP6RRwUFmZSkgb-GaKPlQTYaKpWDrIOH7mHNpRv6vTK2FQu7am3eud77zCQRl5LTU2iOhWc-HdwTrNg0qGB8gR---wvSIukMrwAAAA/enter-pass HTTP/1.1
Host: www.mercadolibre.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: https://www.mercadolibre.com/jms/mlm/lgz/login?platform_id=ml&go=https%3A%2F%2Fwww.mercadolibre.com.mx%2F&loginType=explicit
Content-Type: application/x-www-form-urlencoded
Content-Length: 655
Connection: close
Cookie: msl_tx=1UqiRoqpEUxsLE3lBOswwkkNK9jF03Mi; _ml_ci=923720559.1550729012; orguseridp=21657778; _d2id=9db3c122-55e2-4c10-b17c-b06211ac246f-n; ftid=8MoAWQIdUk07TQENB2UnuCGnB5WY5qMo-1550733044507; dsid=e71d14ce-5128-453c-b586-60e5212fa4cf-1550733049231
Upgrade-Insecure-Requests: 1
user_id=vendetta%40gmail.com&password=H3r3154p4555w0rd&action=complete&dps=armor.bdecc76bc2e60160f1d8464959d69f4d2d9119c3f039ee75cb69bd697920e46f90877723d71324ebedade124738cd189e161d2b655c7fa985521cc6e4c2ccdc75231619b1a24f5e526cee284f62d303f.86588a3c22fdc3e5adde058557e1028e&rbms=1UqiRoqpEUxsLE3l&gctkn=03AOLTBLQTrF3tOZ-Md6XA6e3MFfVpMq2U2eZ1MOnZMtRddlltoxecbHaOtRdLrSPRUXTVGmJQ3nRRhvIcZa_4fY1KhgJ4vN2xg5DaG5ZeXjWuC-KIg59R0WDaRU9cyX7Nz1yaQOgVfvCGqf-buiapfJ5cVN3uureFwrxgegqBZwHAsHQBwOxSQ9hXZlU0V6ZHpWV7PwH_1N65MlH4HhvjGOgaBPPG5XJ69Nsa1eErb1KZG5s5ByeMbOeCgX6uTJzglJYzpxUmygRJpiIvN7ypFLdgnKNC7UuemvkGZwcOgbDQgmjdx5vifkJmlmNIsT2tEoXJw2wWJlBfi0cBkReEX61RoA4C91heOQ&kstrs=
让我们再来看看对该登录请求的响应:
HTTP/1.1 302 Found
Content-Type: text/html; charset=utf-8
Content-Length: 328
Connection: close
Date: Thu, 21 Feb 2019 07:13:56 GMT
Server: Tengine
Cache-Control: private, max-age=0, no-store
Location: https://auth.mercadolibre.com.mx/session/replicator/1550733236355-bqp0ov4guqf0rkcp9qjp34r63e61r6r6?go=https%3A%2F%2Fwww.mercadolibre.com.mx%2F
Set-Cookie: ssid=ghy-022103-1lPFbjVoxrDURTxzC3azejgqjE9O3a-__-21657778-__-1645341236209--RRR_0-RRR_0; Max-Age=94607999; Domain=.mercadolibre.com; Path=/jms/mlm/; Expires=Sun, 20 Feb 2022 07:13:55 GMT; HttpOnly; Secure
Set-Cookie: orgid=CS-022103-03c45ab2ac839ae3d7083c377cdce53010e242e00d3b5fd587459dcdb9c93fa8-21657778; Max-Age=94607999; Domain=.mercadolibre.com; Path=/jms/mlm/; Expires=Sun, 20 Feb 2022 07:13:55 GMT
Set-Cookie: orghash=022103-MLMw1s3mS30KNKIoHNpkHJpGxvOlzu__RRR_0__RRR_0-21657778; Max-Age=94607999; Domain=.mercadolibre.com; Path=/jms/mlm/; Expires=Sun, 20 Feb 2022 07:13:55 GMT; HttpOnly
Set-Cookie: orgapi=CS-022103-69fb38cb3696712af34d6ddd57dc20cfb93a9a77a8d4d2490c82c20d7b7ff6ebc6b411d78e3f5f633a6e653efdd84859895e27e3d79c1da956c6649264d08370-21657778; Max-Age=94607999; Domain=.mercadolibre.com; Path=/jms/mlm/; Expires=Sun, 20 Feb 2022 07:13:55 GMT
Set-Cookie: orguserid=0Z07t79hhh7; Max-Age=94607999; Domain=.mercadolibre.com; Path=/jms/mlm/; Expires=Sun, 20 Feb 2022 07:13:55 GMT
Set-Cookie: orguseridp=21657778; Max-Age=94607999; Domain=.mercadolibre.com; Path=/jms/mlm/; Expires=Sun, 20 Feb 2022 07:13:55 GMT
Set-Cookie: orgnickp=AUGUSTO_VENDETTA; Max-Age=94607999; Domain=.mercadolibre.com; Path=/jms/mlm/; Expires=Sun, 20 Feb 2022 07:13:55 GMT
Set-Cookie: uuid=0; Max-Age=0; Domain=.mercadolibre.com; Path=/jms/mlm/; Expires=Thu, 21 Feb 2019 07:13:56 GMT
Set-Cookie: sid=0; Max-Age=0; Domain=.mercadolibre.com; Path=/jms/mlm/; Expires=Thu, 21 Feb 2019 07:13:56 GMT; HttpOnly
Vary: Accept, Accept-Encoding
X-Content-Type-Options: nosniff
X-DNS-Prefetch-Control: on
X-Download-Options: noopen
X-XSS-Protection: 1; mode=block
X-Request-Id: 445dd144-db49-404e-83e9-7e081487326c
X-D2id: 9db3c122-55e2-4c10-b17c-b06211ac246f
Content-Security-Policy: frame-ancestors 'self'
X-Frame-Options: SAMEORIGIN
X-Cache: Miss from cloudfront
Via: 1.1 ae22d429a3be7ab1d9089446772f27a7.cloudfront.net (CloudFront)
X-Amz-Cf-Id: RyU3aIakL8jke184nvlIt6Ghu0-MfmJLlVYXBw9BxivAF3F9yH9_Mg==
<p>Found. Redirecting to <a href="https://auth.mercadolibre.com.mx/session/replicator/1550733236355-bqp0ov4guqf0rkcp9qjp34r63e61r6r6?go=https%3A%2F%2Fwww.mercadolibre.com.mx%2F">https://auth.mercadolibre.com.mx/session/replicator/1550733236355-bqp0ov4guqf0rkcp9qjp34r63e61r6r6?go=https%3A%2F%2Fwww.mercadolibre.com.mx%2F</a></p>
使用前面的代码块,我们可以检测以下内容:
- 应用正在使用负载平衡器或 DDoS 防护服务。我们可以在响应中看到请求是如何重定向到确定的服务器的。
- 应用使用令牌跟踪请求;可能无法利用 CSRF 等漏洞进行攻击。
- 应用具有 XSS 保护,避免了信息提取。例如,使用 JavaScript 提取用户的会话。
- 该应用包括一个 SAMEORIGIN 策略。在这本书中,我们没有涉及到这一点。此控件用于避免执行来自外部实体的操作。
- 用户凭据在请求主体中发送。
- 应用使用 XML 格式。这意味着应用正在使用内部 API。
现在,我们有一些关于认证流的信息。在实际评估中,您需要映射整个应用和完整的应用流。
现在,我们将回顾与认证相关的问题。
编写完扩展后,启动 Burp Suite 应用,然后单击 Run | Run Project。启动应用时,将运行我们的扩展。
对于此扩展,您需要创建会话处理并在“用户代理”选项卡中配置选项,如以下屏幕截图所示:
正如您在以下屏幕截图中所看到的,应用运行时没有出现错误:
如果你想。。。
在本章中,我们分析了如何创建自己的扩展以及 PortSwigger 提供的不同功能和方法,这不仅帮助我们创建了新的扩展,还向我们展示了如何修改需要适应我们需求的现有扩展。
下一章将介绍一个真实的案例,说明一家大型在线零售商是如何因其认证实现被破坏而受到损害的。