白帽故事 · 2025年10月13日 0

5分钟挖出网站漏洞的高效排查法​​

内容来自 coffinxp 的分享。

方法1:使用 Shodan 和 Nuclei 进行批量扫描

  1. 找到你的目标 CVE:首先,选择一个你想要寻找的 CVE。

  2. 前往 Shodan,使用与产品或 CVE 相关的特定搜索 Dork,Shodan 会立即显示所有查询到的互联网连接设备

  1. IP 地址分析:在结果页面上,点击“More”选项打开Facet Analysis 标签页。然后选择“ip”选项,这样就可以按 IP 地址整齐地组织所有结果。

  1. 提取和扫描:创建一个自定义书签,它会自动从 Shodan 结果中提取所有 IP 地址,并将它们下载为.txt 文件。脚本如下:
  • 针对IP地址:
javascript: (function() {
    var ipElements = document.querySelectorAll('strong');
    var ips = [];
    ipElements.forEach(function(e) {
        ips.push(e.innerHTML.replace(/["']/g, ''))
    });
    var ipsString = ips.join('\n');
    var a = document.createElement('a');
    a.href = 'data:text/plain;charset=utf-8,' + encodeURIComponent(ipsString);
    a.download = 'ip.txt';
    document.body.appendChild(a);
    a.click();
})();
  • 针对域名:
javascript: (function() {
    var ipElements = document.querySelectorAll('strong'),
    ips = [],
    domains = [];
    ipElements.forEach(function(e) {
        var t = e.innerHTML.replace(/['"]/g, '').trim();
        /^(\d{1,3}\.){3}\d{1,3}$/.test(t) ? ips.push(t) : /^(?!\d+\.)[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(t) && domains.push(t)
    });
    var dataString = %27IPs: \n % 27 + ips.join( % 27\n % 27) + %27\n\nDomains: \n % 27 + domains.join( % 27\n % 27),
    a = document.createElement( % 27a % 27);
    a.href = %27data: text / plain;
    charset = utf - 8,
    %27 + encodeURIComponent(dataString);
    a.download = %27domains.txt % 27;
    document.body.appendChild(a);
    a.click();
})();

一旦有了文件,就可以直接将其输入 Nuclei 进行自动扫描,只需将标签或模板名称替换为 CVE 相关的名称,几分钟后,Nuclei 将扫描整个列表并突出显示那些易受攻击的主机。

cat ip.txt | nuclei -tags grafana -bs 50 -c 50 -es info

方法2:发现隐藏在明处的那些“秘密”

开发者经常禁用表单输入、按钮或隐藏整个页面部分,以为这样很安全,下面的脚本可以帮助你绕过这些客户端限制:

javascript: (function() {
    document.querySelectorAll('[disabled],[readonly]').forEach(el = >{
        el.removeAttribute('disabled');
        el.removeAttribute('readonly');
    });
    document.querySelectorAll('[style*="display: none"]').forEach(el = >{
        el.style.display = 'block';
    });
    document.querySelectorAll('[style*="pointer-events: none"]').forEach(el = >{
        el.style.pointerEvents = 'auto';
        el.style.opacity = '1';
    });
    alert('Disabled, readonly, and hidden elements are now active!');
})();

可以将一个实用的脚本集成到Lost Uncover工具中,从而实现自动查找和修改网页上的这些元素:

javascript: (function() {
    if (document.getElementById('lostsec-scanner')) return;

    let e = !1,
        t = [],
        n = document.createElement('div');

    n.id = 'lostsec-scanner';
    n.style = 'position:fixed;bottom:0;left:0;width:100%;height:350px;background:#181818;color:#00bcd4;z-index:999999;padding:20px;font-family:monospace;box-shadow:0 -2px 10px rgba(0,0,0,0.7);border-top:2px solid #00bcd4;overflow:hidden;';

    let o = document.createElement('div');
    o.style = 'position:absolute;top:0;left:0;width:100%;height:10px;background:#222;cursor:ns-resize;';
    n.appendChild(o);

    let i = !1,
        a = 0,
        l = 0;

    o.addEventListener('mousedown', r => {
        i = !0;
        a = r.clientY;
        l = n.offsetHeight;
        r.preventDefault();
    });

    function d(r) {
        if (i) {
            let d = l - (r.clientY - a);
            d = Math.max(200, Math.min(d, window.innerHeight * .9));
            n.style.height = d + 'px';
            let s = document.getElementById('results-wrapper');
            s && (s.style.maxHeight = d - 140 + 'px');
        }
    }

    function c() {
        i = !1;
    }

    document.addEventListener('mousemove', d);
    document.addEventListener('mouseup', c);

    let s = document.createElement('div');
    s.textContent = '❌';
    s.style = 'posi...x 0;padding:5px;background:#333;border-radius:3px;word-break:break-all;';
    t.textContent = e;
    k.appendChild(t);

    function U(e) {
        return e.filter(t => {
            if (b.checked && !t.includes(x)) return !1;
            let n = v.value.toLowerCase();
            return !(n && !t.toLowerCase().includes(n));
        });
    }

    let C = [];

    v.addEventListener('input', () => T(C));
    b.addEventListener('change', () => T(C));

    h.addEventListener('click', () => {
        let e = U(C);
        navigator.clipboard.writeText(e.join('\n')).then(() => alert('✅ URLs copied!'));
    });

    g.addEventListener('click', () => {
        let e = U(C),
            t = new Blob([e.join('\n')]),
            n = document.createElement('a');
        n.href = URL.createObjectURL(t);
        n.download = 'lostsec_urls.txt';
        n.click();
    });

    function init() {
        w.textContent = 'Scanning...';
        domUrls = L();
        updateResults();
        scanExternalScripts().then(() => {
            if (e) return;
            w.innerHTML = `<div style="margin:10px 0;color:#00bcd4">✅Scan complete! Found ${C.length} unique URLs & Endpoints on ${x}</div>`;
            T(C);
        }).catch(n => {
            if (e) return;
            console.error(n);
            w.textContent = '❌ Error during scan. Check console for details.';
        });
    }
    init();
})();

你可以使用下面的 HTML 文件来测试脚本,只需打开文件,然后使用“Lost Uncover → Unhide Element”选项:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <title>Bookmarklet Test Page</title>
  <style>
    body {
      background-color: black;
      color: #00ff88;
      font-family: monospace;
      padding: 20px;
    }
    input, button {
      font-family: monospace;
      margin-top: 5px;
      margin-bottom: 20px;
      padding: 5px;
    }
    .hidden {
      display: none;
    }
    .grayed {
      pointer-events: none;
      opacity: 0.4;
    }
  </style>
</head>
<body>
  <h1>Bookmarklet Test Page</h1>

  <h2>Disabled Input</h2>
  <label>Email (Disabled):<br>
    <input type="text" value="[email protected]" disabled>
  </label>

  <h2>Readonly Input</h2>
  <label>Username (Readonly):<br>
    <input type="text" value="readonly_user123" readonly>
  </label>

  <h2>Hidden Button</h2>
  <button class="hidden" id="secret-btn">Secret Admin Button</button>

  <h2>Grayed-Out Section</h2>
  <div class="grayed">Premium Content</div>
</body>
</html>

当点击“Unhide Element”后,它会显示禁用输入、只读输入、隐藏按钮、灰色区域等类似元素。

你也可以使用该脚本快速扫描任何网站的 URL、端点和隐藏信息,直接从浏览器中操作即可。

方法3:大规模URL发现的基础

第一步是获取目标网站的全部存在地图,可以使用了 AlienVault 的开放威胁交换(OTX)脚本进行查询。

./alienvault.sh domain.com

alienvault.sh

  1. 使用 AlienVault 脚本生成 URL 列表
  2. 使用 gf 模式(如 gf xss 或 gf sqli)筛选有趣的参数
  3. 使用类似 uro 的工具删除重复项

最终命令看起来像下面那样,使我们得到一个干净的可疑漏洞 URL 列表:

cat all_urls.txt | gf xss | uro > unique_xss_targets.txt
cat all_urls.txt | gf sqli | uro > unique_xss_targets.txt
cat all_urls.txt | gf idor | uro > unique_xss_targets.txt
cat all_urls.txt | gf ssrf | uro > unique_xss_targets.txt
cat all_urls.txt | gf redirect | uro > unique_xss_targets.txt

GF参数合集:

GFpattren

发现隐藏的子域和端点

URLScan.io 是侦察阶段的另一个神器,使用脚本自动化查询可以节省大量时间。这个工具非常适合两大任务:

  • 查找子域名:你可以在“子域名”模式下运行脚本,以获取所有相关子域名的列表

  • 发现更多 URL:在“URLs”模式下,它会获取另一组独特的 URL,你可以将这些添加到从 AlienVault 获得的列表中,或者单独使用 Nuclei DAST 扫描它们。

python urlscan.py -d redbull.com --mode urls
python urlscan.py -d redbull.com --mode subdomains

file

VirusTotal 脚本

使用 Orwa 编写的脚本查询 VirusTotal,你通常会有一些惊人的发现。

因为 VirusTotal 分析了全球用户提交的文件和 URL,其数据库有时会包含与目标相关的暴露秘密,使用以下脚本通常可以找到:

  • 邮箱和密码组合
  • 内部 API 密钥
  • 密码重置令牌和其它敏感链接

virustotalx

./virustotal.sh domain.com

原文:https://infosecwriteups.com/my-5-minute-workflow-to-find-bugs-on-any-website-c20075320c96