RPO的全稱為Relative Path Overwrite
,也就是相對路徑覆蓋,利用客戶端和服務端的差異,通過相對路徑來引入我們想要的js或者css文件,從而實現某種攻擊。
就目前來看此攻擊方法依賴於瀏覽器和網絡服務器的反應,基於服務器的Web緩存技術和配置差異,以及服務器和客戶端瀏覽器的解析差異,利用前端代碼中加載的css/js的相對路徑來加載其他文件,最終瀏覽器將服務器返回的不是css/js的文件當做css/js來解析,從而導致XSS,信息泄露等漏洞產生。
利用條件
①Apache 配置錯誤導致AllowEncodedSlashes這個選項開啟(對Apache來說默認情況下 AllowEncodedSlashes 這個選項是關閉的),或者nginx服務器。
②存在相對路徑的js或者css的引用
這里使用WSL+apache2/nginx+php進行測試
第一個條件
當我們訪問http://127.0.0.1/RPO%2findex.php
時,不同服務器有如下表現
Nginx
nginx服務器可以正常訪問
Apache2
apache2默認配置無法訪問
第二個條件
存在相對路徑的引用,如下
結合條件產生RPO漏洞
簡單復現
現在情況是這樣的,我們在RPO目錄下有這樣的一個index.php
文件
<html>
<head></head>
<body>
<script src="test.js"></script>
</body>
</html>
以及一個test.js
文件如下
alert("this is under RPO");
同時RPO文件夾下還有一個文件夾xxx
,該文件夾下存在test.js
如下
alert("this is under xxx");
當我們訪問http://127.0.0.1/RPO/index.php
時,自然而然彈出了RPO文件夾下的test.js
而我們訪問http://127.0.0.1/RPO/xxx/index.php
,很顯然xxx文件夾下是沒有index.php
這個文件的
但是當我們訪問http://127.0.0.1/RPO/xxx/..%2findex.php
時卻出現了
RPO文件夾下的index.php
竟然讀取了xxx文件夾下的test.js!!!
攻擊過程
-
我們向服務器請求URL:
http://127.0.0.1/RPO/xxx/..%2findex.php
-
服務器見多識廣,看到的是:
http://127.0.0.1/RPO/xxx/../index.php
也就是返回了
http://127.0.0.1/RPO/index.php
-
瀏覽器比較呆萌,看到的是:
http://127.0.0.1/RPO/xxx/..%2findex.php
這里瀏覽器認為..%2findex.php
是一個文件,並且執行了這個文件里面的<script>
,想要讀取當前同目錄下的test.js。而瀏覽器認為的路徑是http://127.0.0.1/RPO/xxx/
,因此我們成功讀取到了xxx文件夾下test.js並當作js解析。
RPO的任意文件讀取
除了跨目錄讀取js,RPO漏洞還可以實現任意文件讀取,前提是網站必須支持URL重寫。
什么是url重寫呢,URL重寫就是首先獲得一個進入的URL請求然后把它重新寫成網站可以處理的另一個URL的過程。舉個例子:(這里沒有成功復現出來,就暫時先用別人的圖來講了,侵刪,,我太菜了)
這里的index.php代碼如下:
<!DOCTYPE html>
<html>
<head>RPO attack test</head>
<body>
<script src="3.js"></script>
</body>
</html>
<?php
error_reporting(E_ALL^E_NOTICE^E_WARNING);
if($_GET['page'])
{
$a=$_GET['page'];
Header('Location:http://localhost/RPO/test/'."$a".'.html');
}
?>
這里其實還開啟了pathinfo模式,url中的/page/3
相當於?page=3
,然后通過Header轉到新的url。這樣看起來url會更加和諧,但是問題也出在這里。
當我們請求http://localhost/RPO/index.php/page%2f..%2f..%2findex.php
時,瀏覽器想要加載同目錄下的3.js:http://localhost/RPO/index.php/3.js
,在瀏覽器眼里這就等同於http://localhost/RPO/index.php
,這就把index.php當作js處理了,然后我們就可以f12直接查看資源獲得index.php的源碼了,css文件的包容性比較好,可以讀取更多類型的文件