RPO(Relative Path Overwrite) 相对路径覆盖,是一种利用相对URL覆盖其目标文件的技术。

构成攻击条件的代码:

<html>
<link href="./style.css" rel="stylesheet" />
<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>
</html>

正常访问会以本目录下加载CSS

但是一些框架会使用Pathinfo url格式加载页面,假设此页面也是Pathinfo格式加载的,那么我输入Pathinfo格式访问页面

可见,浏览器把我输入的/C/user/id/777/当成一个实际的路径加载了,这个点我们可以控制,访问localhost/123.php/C/user/id/777/*{background-color:red}/

为什么页面会被渲染呢?

在某些情况下,user agents必须忽略非法样式表的一部分。这个规范定义为忽略,这意味着user agents解析非法部分,除非是明确匹配到了开始和结束,否则予以忽略。

简单的说,简单来说css会解析正确完整的语法,错误的不会被解析。

除了渲染个页面,当然还可以有其他操作,比如:

http://127.0.0.1/a.php/{}*{background-image:url(http://baidu.com/)}/

能够使其访问任意url,可以这样捕获头信息

http://127.0.0.1:8000/a.php/{}*{xss:expression(open(alert(1)))}/`

在IE6,7下可利用expression弹窗

如何避免

1.使用完整的url,或者所有的引用都加/

2.在页面开头,声明<!DOCTYPE html>

浏览器解析页面,分为标准模式(strict mod),和怪异模式(quirks mode)

所谓标准模式是指浏览器按照w3c规定来解析网页上的代码

怪异模式是浏览器使用自己的方式解析网页代码。

两个区分在于你的网页是否声明<!DOCTYPE html>。

在声明<!DOCTYPE html>后,刚刚的渲染效果就会不存在了。

攻击条件

1.网页存在可控输出点

2.网页未声明<!DOCTYPE html>

3.使用相对路径引用css

参考链接:

https://www.cnblogs.com/jenry/archive/2013/01/05/2846557.html

http://bendawang.site/2017/09/16/RPO%E4%BA%8C%E4%B8%89%E4%BA%8B/

https://www.mbsd.jp/Whitepaper/rpo.pdf

http://blog.innerht.ml/cascading-style-scripting/

 

 

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Are you human? Click the Banana...