2019年9月25日星期三

XXE漏洞注入原理探索--踩坑篇

# 首先是一个简单的外部实体引入的例子


其中test.txt和XXE_Test.php 处于同级目录下
结果:
所以,本地直接是可行的,那么我们再进一步:
能不能通过传入一个xml来模拟真实的情景呢?

真棒,遇见各种bug在这里记录一下吧(悄悄水一天):

第一,先是phpstorm,安装phpstorm后:
1. 最省事的是将工程直接放在WWW目录下,这样就不会出现502错误了(如果代码没啥问题的话。。)
2. 配置php解释器:
如图,就在这个位置在CLI interpreter中定位自己的php.exe然后就可以用了
3. 可以配合Xdebug完成PHP的调试,具体可自行百度~

第二,关于xml的处理函数
这里介绍最简单的simplexml函数
分别是simplexml_load_file(),simplexml_load_string()故名思意,一个是用来打开文件的,一个是用来打开字符形式的。

第三,怎么接收前端的xml
1. 网上比较多的方法是写一个php自己发送数据,格式大致如下:
$ch = curl_init();
$data = '<?xml version="1.0" encoding="utf-8"?><root><aa>123</aa><bb>456</bb></root>';
curl_setopt($ch, CURLOPT_URL, 'http://127.0.0.1/test/test.php');
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-type: text/xml;charset=\"utf-8\""));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_HEADER,0);
curl_exec($ch);
curl_close($ch);
此时,接受端一般有两种写法:
首先,不能用$_POST原因呢是因为$_POST默认不接受text/xml类型的数据,
”$_POST 只能取得 Content-type 為 application/x-www-form-urlencoded 或 multipart/form-data 的資料“
而接受的方法1. 一般是使用file_get_contents('php://input')来接收原始post数据,写法为:


2. 或者使用$GLOBALS['HTTP_RAW_POST_DATA'];来接收,写法为:



$xml =$GLOBALS['HTTP_RAW_POST_DATA'];
//将xml数据写入文本文件"a.txt"中
$handle =fopen('a.txt','a+'); 
fwrite($handle,$xml);

我是通过第一种方法完成了数据的传输,然而却存在数据传不完的bug。。明天找师傅问一哈吧。。实在解决不了了。。。。其实来说,只要解决了数据传输不全的问题,也就完全证明了xxe注入漏洞的危害性,明天解决这个问题后可以去找个wp分析一下实际的利用过程

good,问题解决了

所以,是怎么做到的呢,似乎是因为<>的原因导致的,构造payload:
通过添加\ 然后str_replace 就完成了写入到执行的操作,所以不用拖明天了

其他利用方式:
1. 命令执行 expect://ifconfig
2. 内网探测 http://192.168.0.100:80
等等,其实已经危害很大了,相当于一个肉鸡了,欧克,搞定收工~

今日分享:
哎,今日又有朋友脱单了~既然如此,就分享一个
我爱你,没有什么目的。只是爱你。张爱玲的一句话,祝福长久吧~

没有评论:

发表评论

XSS速查表

今天继续XSS的进一步学习,以下内容转载自Freebuf上的文章,原文章来自OWASP的xss备忘录 1.介绍 这篇文章的主要目的是给专业安全测试人员提供一份跨站脚本漏洞检测指南。文章的初始内容是由RSnake提供给 OWASP,内容基于他的XSS备忘录: http://...