上周参加了CTF比赛,虽然结果一般般,但还是学到了不少东西,比如RPO攻击。RPO(Relative Path Overwrite) 攻击又称为相对路径覆盖攻击,依赖于浏览器和网络服务器的反应与服务器的 Web 缓存技术和配置差异,利用前端代码中加载的css/js的相对路径来加载其他文件,最终浏览器将服务器返回的不是css/js的文件当做css/js来解析,从而导致XSS,信息泄露等漏洞产生。这种攻击在网络上资料较少,如果不是参加比赛还真不会去了解这种攻击技术,所以这里分享给大家。
了解RPO
如果让我来解释RPO,大概就是利用css、js的相对路劲分析漏洞进行的攻击,原理:
1.在Url中使用%2f来代替/
2.Url在浏览器分析时,会把%2f解码为/,然后就正常返回页面
3.但是css/js在解析时,不会进行解码,所以就出现了目录覆盖的情况
4.产生这种漏洞的最大原因是CSS/js解析器的一个特性:浏览器在解析CSS/js样式时,会忽略非法的部分,直到找到正确的开始然后进行解析一直到结束。所以当我们植入CSS/js代码,欺骗CSS/js解析器忽略之前不合法的语法内容,从而加载我们注入的CSS/js内容。
5.一般来说,在phpinfo框架中出现这种情况的可能性比较大
(phpinfo框架:1.2.3.4:80/index.php/pp/123/,并不是有pp和123这两个目录,url在phpinfo模式下会解析成index.php?mode=pp&id=123)
比赛实例
周末CTF的比赛要求对一个系统进行审查,然后提交漏洞,管理员会进行查看。这一看就是要的钓管理员的cookie,目测就是xss。于是先开始观察系统
所以大概了解到,是通过写文章注入xss语句,然后在查看文章中确定语句可行性,然后提交钓cookie。不过发现<>标签被过滤,且没法写入script标签,但是在发现index.php页面发现js是调用的相对路径:
在查看文章发现系统是phpinfo的url解析框架:
于是决定采用RPO攻击,基本思路是通过写文章写入不含script标签的xss语句,然后通过RPO攻击将文章内容当成js来执行。经过尝试,当标题有内容时,会引入”< h >”标签,这会影响js解析,所以标题设为空,只在内容出写入xss语句:
然后构造url:
http://39.107.33.96:20000/index.php/view/article/2525/..%2f..%2f..%2f
这里解释一下,当url在服务器端执行时,会被解析为index.php/view/article/2525/../../../
,也就是等价于index.php
,所以返回了index.php的资源。但是在客户端进行显示时,客户端发现要执行js代码,于是向服务器端发出了资源申请,申请的url为:
http://39.107.33.96:20000/index.php/view/article/2525/..%2f..%2f..%2f/static/js/jquery.min.js
但是这里出现了一个问题,由于css/js解析器的会无视非法部分,于是..%2f..%2f..%2f/这段就被忽略了,于是url变成了:
http://39.107.33.96:20000/index.php/view/article/2525/static/js/jquery.min.js
然后该url传给服务器,很显然,在服务器端并不存在这么一个js文件,但并没有关系,由于服务器采用的phpinfo的url解析模式,于是这条url便被解析成了
http://39.107.33.96:20000/index.php?mode=view&article=2525&static=js&jquery.min.js=
于是服务器返回了index.php/view/article/2525/
的内容,也就是alert(1)。这时客户端拿到资源后,将这段代码当成了js语句来执行,成功进行了RPO攻击:
找到了xss点,剩下的就简单了,提交我们精心构造的url和xss页面去调取管理员cookie,由于本章主要讲解RPO攻击,剩下的就不写了,有兴趣的小伙伴可以去继续做下去:题目点我。
其他
小白兔的团队又加入了三位小伙伴,欢迎他们的加入(~ ̄▽ ̄)~ (~ ̄▽ ̄)~ (~ ̄▽ ̄)~ ,希望今后一起成长,一起努力,干巴爹o( ̄▽ ̄)d 。