伪静态页面可通过执行document.lastModified并刷新比对时间判断:若两次时间不同,则为伪静态(动态生成);若相同且无动态特征,则为真静态。

HTML网页本身不执行逻辑,无法直接“被渗透”,真正要测的是它背后的服务端接口、动态行为和前端安全控制。静态纯HTML页面(无JS、无表单、无API调用)基本没有可利用的攻击面,连document.lastModified都不变的,直接跳过。
怎么快速判断是真静态还是伪静态
别靠文件后缀猜。打开浏览器开发者工具,执行:document.lastModified,刷新页面再执行一次。两次返回时间戳不同 → 说明服务端每次都在生成新响应 → 是伪静态(即动态网站)。如果不变,再查location.href是否含?id=、#section等参数,或用curl -I看响应头有没有ETag或Last-Modified随请求变化。真静态就别在这浪费时间了,去扫子域名或查JS文件里的API地址。
表单提交类漏洞重点查哪几处
所有<form>标签都是入口,但关键不在前端HTML,而在它提交到哪里、怎么处理。抓包看action指向的URL,再检查三点:
- 后端是否校验
Content-Type?比如允许text/plain上传却没做MIME类型二次检查 - 参数是否全量做过滤?特别是
id、page、callback这类易被篡改的字段 - 敏感操作(如密码修改、订单支付)是否缺失
CSRF token,或token是否在每次请求后失效 - 错误响应里是否泄露堆栈、路径、数据库名(比如
MySQL error in query: SELECT * FROM users WHERE id = '1'')
DOM型XSS必须手动跟踪数据流
自动化扫描器几乎漏掉90%的DOM型XSS,因为不发请求、不改服务器响应。打开Sources面板,在location.search、location.hash、document.referrer附近下断点,然后输入?q=%3Cimg%20src=x%20onerror=alert(1)%3E,单步跟到innerHTML、eval()、setTimeout()这些sink函数。常见坑:
立即学习“前端免费学习笔记(深入)”;
-
decodeURIComponent()之后直接进innerHTML,绕过前端简单过滤 - jQuery的
$().html()和原生innerHTML一样危险,text()才安全 - JSONP回调函数名若由URL参数控制(如
callback=alert),且未白名单校验,就是现成的XSS
框架嵌入与Clickjacking不能只看响应头
X-Frame-Options: DENY或Content-Security-Policy: frame-ancestors 'none'确实能拦住大部分攻击,但得验证是否全局生效。用Burp Suite或ZAP扫完,还要自己建个测试页:
<iframe src="https://target.com/login.html" sandbox="allow-scripts"></iframe>,看能否加载成功。更隐蔽的是
sandbox属性被滥用:如果开了allow-scripts allow-same-origin,等于把防御形同虚设。另外,某些SPA应用会用history.pushState()配合postMessage实现跨域通信,这时候frame-ancestors可能无效,得人工审计接收方window.addEventListener('message', ...)是否校验event.origin。
最常被忽略的其实是JS文件本身——它们不是HTML,但往往包含硬编码的API地址、密钥片段、未脱敏的调试日志,甚至整个登录逻辑。别只盯着.html,把network标签里所有.js都拖下来搜password、api_key、console.log。



















