XML External Entity,XML外部实体注入
注入步骤:
- 判断传输xml数据,得到回显
- 分析过滤
- 构造外部实体
初识XXE
为了感受XXE魅力,本地写了一个文件,结果搞了好久的环境,看了各种文档终于找到问题所在成功读写出我想要文件。
PHP源码
<?php
$xml=<<<EOF
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE address[
<!ENTITY xxe SYSTEM "file:///D://phpStudy//WWW//myphp//html1.html"> //读取任意文件
]>
<root><xxe>&xxe;</xxe></root>
EOF;
$data = simplexml_load_string($xml,NULL,LIBXML_DTDVALID); //参数超级重要啊
var_dump($data);
echo LIBXML_DOTTED_VERSION;
?>
任意读取文件内容回显
一个比较坑的点是libxml的配置问题。默认情况下,libxml2不会加载dtd
试过的只有php5.2默认开启了。还有之前一直傻乎乎的把将第二个参数忽略掉了,所以一直卡在这里。
php://filter 在xxe漏洞上的妙用
当我们读取的文件格式是php时,由于<?php …?>很像标签所以会有读取的错误
当我们使用php://filter/read=convert.base64-encode/resource=./xxe.php
会将读取的代码转化为base64格式,问题引刃而解。这也是一个小技巧吧
bwapp靶机上的xxe练习
Level-1
通过抓包获得的POST数据为:
<reset><login>root</login><secret>Any bugs?</secret></reset>
通过改变<login>
标签内的数据可以看到回显。
于是构造外部实体读取任意文件
Level-2
阅读源码发现这一关禁止了xml外部实体引用,从session中获取login信息而不是从xml中获取。secret是从xml中获取有一个过滤,可以有sql注入,但暂时没有关于xxe思路。先填一个坑。
jarvisoj题目-api调用
抓包,发现传输的数据是json格式的,改变你search中的内容,响应发生变化。没有过滤。
当我们传输的是txt/xml格式的时候
响应也是xml格式
构造payload
啊哈,(o゜▽゜)o☆[BINGO!]。
和bwapp的不太一样,bwapp是直接传输后台处理后才回显,这道题直接解析传输数据就回显了。