淺析RPO漏洞攻擊原理


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!!!

攻擊過程

  1. 我們向服務器請求URL:
    http://127.0.0.1/RPO/xxx/..%2findex.php

  2. 服務器見多識廣,看到的是:
    http://127.0.0.1/RPO/xxx/../index.php
    也就是返回了
    http://127.0.0.1/RPO/index.php

  3. 瀏覽器比較呆萌,看到的是:
    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文件的包容性比較好,可以讀取更多類型的文件

參考鏈接:https://www.freebuf.com/articles/web/166731.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM