CTF-WEB-20180821-#XXE#JSON
-#XXE#json ——CTF{XxE_15_n0T_S7range_Enough}
题目描述
API调用
请设法获得目标机器/home/ctf/flag.txt中的flag值。http://web.jarvisoj.com:9882/
分析
-
随便传一个返回,啥都没看出来()
- 查看源代码,还是不知道想考什么(),除了知道出题人要你传json数据
<script>
function XHR() {
var xhr;
try {xhr = new XMLHttpRequest();}
catch(e) {
var IEXHRVers =["Msxml3.XMLHTTP","Msxml2.XMLHTTP","Microsoft.XMLHTTP"];
for (var i=0,len=IEXHRVers.length;i< len;i++) {
try {xhr = new ActiveXObject(IEXHRVers[i]);}
catch(e) {continue;}
}
}
return xhr;
}
function send(){
evil_input = document.getElementById("evil-input").value;
var xhr = XHR();
xhr.open("post","/api/v1.0/try",true);
xhr.onreadystatechange = function () {
if (xhr.readyState==4 && xhr.status==201) {
data = JSON.parse(xhr.responseText);
tip_area = document.getElementById("tip-area");
tip_area.value = data.task.search+data.task.value;
}
};
xhr.setRequestHeader("Content-Type","application/json");
xhr.send('{"search":"'+evil_input+'","value":"own"}');
}
- 没思路,看了下大佬的hint和脑洞过程,挣扎了一番后大佬也没想出来()
3.1 一般性尝试,特殊协议的构造,如POST改GET/LOL等;
//LOL就是乱改……绕CDN和WAF的时候用的...就是中间有层代理,但是他不认可这个LOL这个方法,可能里面啥都不过滤就直接丢给服务器
3.2 请求的地址,可能需要一些脑洞,比如v1.0改成2.0这种;
//v1改v2就是看看有没有什么别的接口存在
3.3 header字段内容,依然是没有什么可疑的地方;(我错了)
3.4 json内容,可以构造各种数据试一试,特殊字符、HPP、增删一些字段、错误的json格式等等;
//hpp是参数污染,比如用?key=">< img src=1/onerror=alert(5)>'or'1'='1'#来测试sql和xss问题但被过滤,如果这么写?key=123456&key=">< img src=1/onerror=alert(5)>'or'1'='1'#,同名参数输入了两次的处理机制如下图。还有可能比如waf只对前一百个参数做解析(CVE-2018-9230),后面的就不管了,判断没问题以后就整个丢给服务器端继续处理,那我前100写的都是没用的参数,在第101个参数处写入真正的payload,就可以绕过waf的检测
利用同名参数绕过waf
//错误的json格式是指为了多收集信息而瞎改,比如对键名/键值加加减减,添加一些特殊字符,故意把json格式修改为不正确的格式,或者也可以增删改一些header的内容,比如x-forwarded-for等,核心思想就是要他报错
3.5 返回包中201CREATE的状态码引人瞩目,另外服务器是python的(联想到一些python服务器带来的安全问题),返回的内容也是json格式,将search和value两个字段以及值返回回来了。
//python服务器带来的安全问题相关参考:
https://github.com/bit4woo/python_sec
python Web安全
Fix Python Arbitrary Command Execution Vulnerability https://joychou.org/codesec/fix-python-arbitrary-command-execution-vulnerability.html
Python Sandbox Bypass https://joychou.org/web/python-sandbox-bypass.html
Python Pickle的任意代码执行漏洞实践和Payload构造 http://www.polaris-lab.com/index.php/archives/178/
利用 Python 特性在 Jinja2 模板中执行任意代码 http://blog.knownsec.com/2016/02/use-python-features-to-execute-arbitrary-codes-in-jinja2-templates/
乱弹Flask注入 http://www.freebuf.com/articles/web/88768.html
Flask jinja2模板注入思路总结 http://www.freebuf.com/vuls/162752.html
Flask开启debug模式等于给黑客留了后门 https://zhuanlan.zhihu.com/p/32138231
3.6 提示中说flag在/home/ctf/flag.txt中,那么应该是通过api的某些漏洞能够达到任意文件读取的效果。那么是什么漏洞呢……
4.于是大家殊!途!同!归!来到这一步——直接看wp()。原来是XXE……
xxe就是xml实体注入,借助XXE,攻击者可以实现任意文件读取,DOS拒绝服务攻击以及代理扫描内网等。服务端可能同时支持了对多种数据格式的处理,但没有对外部实体引用进行限制。常规的POST的content-type为application/x-www-form-urlencoded,但只要我将其修改为application/json,就可以传入json格式的POST数据,修改为application/xml,就可以传入XML格式的数据。常规的WAF一般只检测application/x-www-form-urlencoded的数据,一旦修改数据类型则将通杀各大WAF。用slim framework 3.0开发的CMS,只要获取了POST数据,都将受到此XXE漏洞的影响。
payload
Content-Type: application/xml。并在body增加
<?xml version="1.0" ?>
<!DOCTYPE aaa [<!ENTITY bbb SYSTEM "file://home/ctf/flag.txt" >]>
<ccc>&bbb;</ccc>
总结
要时时刻刻抱着一颗搞事的心,到处改()
这次的题目其实是做过的,但是又不记得了……虽然说温故知新,但是怎么温出这么多故(),参考资料明天再看吧我困了……