JS `Zaproxy` / `Burp Suite` `Active / Passive Scanner` 自动发现漏洞

各位靓仔靓女,老少爷们,晚上好!我是今晚的讲师,很高兴和大家聊聊JS、Zaproxy和Burp Suite这三个神器,以及它们如何联手自动发现漏洞,就像抓小偷一样,一个都跑不掉!

今天咱们的主题是:JS Zaproxy / Burp Suite Active / Passive Scanner 自动发现漏洞:抓贼三人组的完美配合!

咱们先来个热身,简单介绍下这三位主角,免得有些人还不认识它们:

  • JS (JavaScript): 前端扛把子,负责在浏览器里跑来跑去,渲染页面,处理用户交互。但跑得太欢也容易留下安全隐患。想想你家门没锁就跑出去玩,小偷不惦记你惦记谁?
  • Zaproxy (OWASP ZAP): 免费开源的Web应用安全扫描器,就像一个经验丰富的保安,主动(Active Scan)或者被动(Passive Scan)地帮你检查网站的安全漏洞。
  • Burp Suite: 专业的Web应用安全测试工具,功能强大,就像一个装备精良的特警,主动出击(Active Scan)或者默默监视(Passive Scan),帮你找出各种安全问题。

好,主角介绍完毕,下面咱们进入正题。

第一部分:JS 安全漏洞的那些事儿 (JS:我太难了!)

JS代码虽然强大,但一不小心就可能变成漏洞的温床。常见的JS安全漏洞包括:

  • 跨站脚本攻击 (XSS): 小偷往你家网页里塞了点恶意代码,用户访问时就被执行了,盗取用户信息或者搞破坏。

    • 存储型XSS: 恶意代码存储在服务器数据库中,每次用户访问相关页面都会被执行。
    • 反射型XSS: 恶意代码通过URL参数传递,服务器直接返回给用户执行。
    • DOM型XSS: 恶意代码不经过服务器,直接在浏览器端通过JS修改DOM结构来执行。

    举个例子,假设有个页面显示用户评论:

    <div>评论: <span id="comment"></span></div>
    <script>
    const comment = new URLSearchParams(window.location.search).get('comment');
    document.getElementById('comment').innerText = comment;
    </script>

    如果用户访问 ?comment=<script>alert('XSS')</script>,就会触发XSS攻击。

  • 跨站请求伪造 (CSRF): 小偷冒充你给银行转账,因为银行只验证了你的身份,没验证请求是不是你本人发起的。

    • 假设一个网站有个修改邮箱的接口:POST /[email protected]
    • 攻击者可以在自己的网站上放一个隐藏的表单:

      <form action="https://example.com/change_email" method="POST">
        <input type="hidden" name="email" value="[email protected]">
        <input type="submit" value="点我领取奖品!">
      </form>

      如果用户登录了 example.com 并访问了攻击者的网站,点击“领取奖品”,就会不知不觉地修改了自己的邮箱。

  • 不安全的反序列化: JS对象被序列化成字符串存储,反序列化时如果数据被篡改,可能导致代码执行。

    • 例如,使用 JSON.parse() 反序列化用户提交的数据,如果数据包含恶意代码,就可能执行。
  • 依赖包漏洞: JS项目通常会使用大量的第三方库,如果这些库存在漏洞,你的项目也会受到影响。

    • 可以使用工具如 npm audityarn audit 来检查依赖包的漏洞。
  • 信息泄露: JS代码中可能包含敏感信息,例如API密钥、数据库密码等。

    • 例如,直接在JS代码中 hardcode API Key 是非常危险的。
  • DOM clobbering: 利用HTML元素名称的全局变量特性,覆盖JS代码中的变量,从而影响程序的行为。

    • 例如,在HTML中定义一个id为URL的元素,会覆盖全局的URL构造函数,可能导致程序出错。

第二部分:Zaproxy 和 Burp Suite:安全界的福尔摩斯和华生 (侦探二人组!)

Zaproxy和Burp Suite都是强大的Web应用安全扫描器,它们可以帮助我们自动发现JS代码中的漏洞。

  • Passive Scan (被动扫描): 就像福尔摩斯在街上溜达,观察人们的行为,发现可疑之处。

    • Zaproxy/Burp Suite会监听浏览器发出的所有HTTP请求和响应,分析其中的JS代码,查找潜在的漏洞。
    • 例如,检查响应头是否包含安全相关的header (如 X-Frame-Options, Content-Security-Policy),JS代码中是否存在敏感信息,等等。
  • Active Scan (主动扫描): 就像福尔摩斯乔装打扮,主动去犯罪现场调查,寻找线索。

    • Zaproxy/Burp Suite会模拟各种攻击场景,向目标网站发送恶意请求,测试是否存在漏洞。
    • 例如,发送包含XSS payload的请求,测试是否存在XSS漏洞;发送包含SQL注入payload的请求,测试是否存在SQL注入漏洞。

Zaproxy 和 Burp Suite 的对比:

功能 Zaproxy Burp Suite
价格 免费开源 付费,有免费社区版
易用性 相对简单,适合新手入门 功能强大,需要一定的学习曲线
扩展性 支持插件,可以扩展功能 支持BApp,可以扩展功能
扫描速度 相对较慢 相对较快
漏洞检测能力 覆盖常见漏洞,但可能存在误报漏报 覆盖广泛,检测能力更强,误报漏报率较低
报告生成 支持多种格式的报告 支持多种格式的报告
协作功能 支持团队协作,但功能相对简单 支持团队协作,功能更强大

第三部分:JS + Zaproxy/Burp Suite:自动发现漏洞的正确姿势 (完美配合!)

下面咱们来演示如何使用Zaproxy/Burp Suite自动发现JS代码中的漏洞。

1. 环境准备:

  • 安装Zaproxy 或 Burp Suite。
  • 配置浏览器代理,将所有HTTP/HTTPS流量转发到Zaproxy/Burp Suite。
    • Zaproxy: Options -> Local Proxy -> Address: 127.0.0.1, Port: 8080
    • Burp Suite: Proxy -> Options -> Proxy Listeners -> Bind to address: 127.0.0.1, Port: 8080
  • 安装Zaproxy/Burp Suite的CA证书到浏览器,否则HTTPS流量无法被拦截。
    • Zaproxy: Tools -> Options -> Dynamic SSL Certificates -> Generate
    • Burp Suite: Proxy -> Options -> Import / export CA certificate

2. 使用 Passive Scan:

  • 启动Zaproxy/Burp Suite。
  • 配置浏览器代理。
  • 浏览目标网站,Zaproxy/Burp Suite会自动分析HTTP请求和响应,查找潜在的漏洞。
  • 在Zaproxy/Burp Suite的Alerts/Issues面板中查看扫描结果。

代码示例(模拟一个简单的信息泄露):

// API Key 存储在JS代码中,非常危险!
const apiKey = "YOUR_API_KEY";

function fetchData(endpoint) {
  fetch(endpoint + "?apiKey=" + apiKey)
    .then(response => response.json())
    .then(data => {
      console.log(data);
    });
}

fetchData("/api/data");

当Zaproxy/Burp Suite监听到包含 apiKey 的请求时,就会发出警告。

3. 使用 Active Scan:

  • 启动Zaproxy/Burp Suite。
  • 配置浏览器代理。
  • 在Zaproxy/Burp Suite中选择目标网站,右键选择 "Attack" -> "Active Scan"。
  • Zaproxy/Burp Suite会自动发送各种恶意请求,测试是否存在漏洞。
  • 在Zaproxy/Burp Suite的Alerts/Issues面板中查看扫描结果。

代码示例(模拟一个简单的XSS漏洞):

<div>
  <input type="text" id="userInput">
  <button onclick="displayInput()">显示</button>
  <div id="output"></div>
</div>

<script>
function displayInput() {
  const userInput = document.getElementById("userInput").value;
  document.getElementById("output").innerHTML = userInput; // 存在XSS漏洞
}
</script>

Zaproxy/Burp Suite会发送包含 XSS payload 的请求,例如 <script>alert('XSS')</script>,如果页面成功执行了这段代码,就说明存在XSS漏洞。

4. 优化扫描结果:

  • Zaproxy/Burp Suite的扫描结果可能包含误报,需要人工进行验证。
  • 根据扫描结果,修复JS代码中的漏洞。
  • 定期进行安全扫描,确保JS代码的安全性。

5. 高级用法:

  • 自定义扫描规则: Zaproxy/Burp Suite允许自定义扫描规则,可以根据自己的需求添加特定的漏洞检测。
  • 使用 API 进行自动化扫描: Zaproxy/Burp Suite提供了API,可以编写脚本自动化进行安全扫描。
  • 集成到 CI/CD 流程中: 将Zaproxy/Burp Suite集成到 CI/CD 流程中,可以在代码提交时自动进行安全扫描,及时发现漏洞。

代码示例(使用Zaproxy API进行自动化扫描):

import requests

zap_url = "http://localhost:8080"  # 修改为你的Zaproxy地址

def start_scan(target_url):
  """启动Zaproxy的主动扫描"""
  url = f"{zap_url}/JSON/ascan/action/scan/?url={target_url}"
  response = requests.get(url)
  if response.status_code == 200:
    scan_id = response.json()["scan"]
    print(f"扫描已启动,扫描ID:{scan_id}")
    return scan_id
  else:
    print(f"启动扫描失败:{response.text}")
    return None

def get_scan_status(scan_id):
  """获取扫描进度"""
  url = f"{zap_url}/JSON/ascan/view/status/?scanId={scan_id}"
  response = requests.get(url)
  if response.status_code == 200:
    progress = response.json()["status"]
    print(f"扫描进度:{progress}%")
    return progress
  else:
    print(f"获取扫描进度失败:{response.text}")
    return None

def get_alerts():
  """获取扫描结果"""
  url = f"{zap_url}/JSON/core/view/alerts/"
  response = requests.get(url)
  if response.status_code == 200:
    alerts = response.json()["alerts"]
    for alert in alerts:
      print(f"风险等级:{alert['risk']}")
      print(f"漏洞名称:{alert['name']}")
      print(f"描述:{alert['description']}")
      print(f"URL:{alert['uri']}")
      print("-" * 20)
  else:
    print(f"获取扫描结果失败:{response.text}")
    return None

if __name__ == "__main__":
  target_url = "http://example.com"  # 修改为你的目标URL
  scan_id = start_scan(target_url)
  if scan_id:
    while True:
      progress = get_scan_status(scan_id)
      if progress == "100":
        print("扫描完成!")
        break
      import time
      time.sleep(5) # 每隔5秒检查一次进度

    print("扫描结果:")
    get_alerts()

第四部分:JS 安全开发最佳实践 (防患于未然!)

除了使用Zaproxy/Burp Suite进行安全扫描,更重要的是在开发过程中就注意JS代码的安全性。

  • 输入验证: 对所有用户输入进行验证,过滤掉恶意字符,防止XSS攻击。

    • 使用白名单验证,只允许输入特定的字符或格式。
    • 对特殊字符进行转义,例如 < 转义为 &lt;> 转义为 &gt;
  • 输出编码: 对所有输出到页面的内容进行编码,防止XSS攻击。

    • 使用 encodeURIComponent() 对URL参数进行编码。
    • 使用安全的模板引擎,例如 Handlebars 或 Mustache,它们会自动进行输出编码。
  • 使用 CSP (Content Security Policy): CSP可以限制浏览器加载的资源,防止恶意脚本执行。

    • 例如,可以设置只允许加载来自同一域名的脚本:Content-Security-Policy: default-src 'self'
  • 启用 HTTP Strict Transport Security (HSTS): HSTS可以强制浏览器使用HTTPS连接,防止中间人攻击。

    • 设置 Strict-Transport-Security header:Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
  • 定期更新依赖包: 及时更新依赖包,修复已知的安全漏洞。

    • 使用 npm audityarn audit 来检查依赖包的漏洞。
  • 使用 Subresource Integrity (SRI): SRI可以验证从CDN加载的资源的完整性,防止CDN被篡改。

    • <script><link> 标签中添加 integrity 属性,指定资源的哈希值。
  • 避免在JS代码中存储敏感信息: 不要在JS代码中 hardcode API密钥、数据库密码等敏感信息。

    • 将敏感信息存储在服务器端,通过API接口获取。
    • 使用环境变量来配置敏感信息。
  • 进行代码审查: 定期进行代码审查,发现潜在的安全漏洞。

总结:

JS安全至关重要,Zaproxy和Burp Suite是你的得力助手,它们可以帮助你自动发现JS代码中的漏洞。但是,安全是一个持续的过程,需要在开发过程中就注意JS代码的安全性,防患于未然。记住,安全不是免费的午餐,需要我们付出努力!

希望今天的讲座对大家有所帮助。 谢谢大家! 散会!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注