由於看了朋友的一篇分析又回頭想了想本身去年遇到的這個糾結的問題。php
去年寫過一篇phpmyadmin後臺文件包含的文章,寫的很是的草草,並無分析的過程,只是把本身的問題記了下來。當時糾結於最後一步能經過兩次urlencode問號就能再跨出路徑了呢,css
payload:html
db_sql.php%253f/../../../../../../windows/system.ini
回頭來看其實很容易理解,以前也看到了一篇RPO攻擊,裏面的路徑有點類似,也讓我回頭來,理解了這個payload。nginx
當時雖然我放上來別人的圖片做爲個人問題的解答web
其實當時看錯了一個地方,致使最後的分析鑽了牛角尖。sql
關鍵的代碼在於最後第一個urldecode出了問題windows
$_page = urldecode($page); $_page = mb_substr( $_page, 0, mb_strpos($_page . '?', '?') ); if (in_array($_page, $whitelist)) { return true; }
咱們兩次編碼?後,瀏覽器解析一次%253f轉化成%3f,而後這裏又解析一次,轉化成?,截斷到前面的db_sql.php,使其符合了白名單。可是關鍵的是最後包含的是target,傳入的參數,而不是兩次urldecode的參數。瀏覽器
也就是包含的是bash
db_sql.php%3f/../../../../../../windows/system.ini
爲何能包含成功呢。服務器
這裏的原理就是php將db_sql.php%3f 做爲了一個目錄,無論他是否是存在的,由於後面有../,會跨越到上級目錄。
因此據個人分析,當php遇到這樣的包含路徑時,不會去檢索這個目錄是否會存在,只要後面存在../跨越目錄,即直接包含後面的路徑,直接將這個不存在的路徑做爲一個目錄處理。
形象點比喻就是,執行者無論這個db_sql.php%3f是否是能走的路,他看到了../,他就不會走進這條路,直接按着接下來的路繼續走(../../../../etc/passwd)。
再講的可以理解點就是執行者將db_sql.php%3f/../看做了一個總體,看到了../,他就無論db_sql.php%3f是否是條路了。
文件夾A中有a.php,b.php,上層目錄B中有echoa.php
echoa.php <?php $a='php_test_heihei'; ?>
a.php <?php include "b.php/../../echoa.php"; echo $a;
測試特殊字符串:!@#$%^&*()-_ []{}<>~`+=,.;:/?|"'\
fuzz發現,只有出現?或者*時候,include會包含錯誤,輸出不了$a。
其餘的拼接特殊字符都可以完成目錄穿越。include到echoa.php
結束
是暑假時候經過鬱離歌強網杯的WP瞭解到的RPO攻擊,忘記寫了,這裏補上。
這裏簡單概述下記錄下,Freebuf有篇講的很詳細的,放在文章下方連接處l。
RPO (Relative Path Overwrite)相對路徑覆蓋,做爲一種相對新型的攻擊方式,由 Gareth Heyes在2014年首次提出,利用的是nginx服務器、配置錯誤的Apache服務器和瀏覽器之間對URL解析出現的差別,並藉助文件中包含的相對路徑的css或者js形成跨目錄讀取css或者js,甚至能夠將自己不是css或者js的頁面當作css或者js解析,從而觸發xss等進一步的攻擊手段。
觸發這個漏洞有兩個基本的前提:
①Apache 配置錯誤致使AllowEncodedSlashes這個選項開啓(對Apache來講默認狀況下 AllowEncodedSlashes 這個選項是關閉的),或者nginx服務器。
②存在相對路徑的js或者css的引用
對於第一個場景,服務端對url的解析,將%2f自動解碼爲/。而瀏覽器對url的解析,不認得%2f,服務器返回的頁面後,在加載相對路徑下的js時,瀏覽器將..%2f..%2fxxx看成一個文件,而不會解析爲路徑,因此連接到相對路徑的js文件時,會跨目錄,連接
對於第二個場景,好比訪問/index.php/view/article/98749/..%2F..%2F..%2F..%2Findex.php,服務器解析url,請求的時index.php,index.php下有一個外部腳本js連接,scr=1.js。客戶端解析後,將..%2F..%2F..%2F..%2Findex.php看成一個文件,而後在當前目錄連接1.js,即連接/index.php/view/article/98749/1.js(然而這是個98749.html文件,這裏個人理解是,直接將這個頁面看成1.js解析),而且不須要script標籤,直接做爲外部引入的js文件處理。所以能夠結合xss漏洞利用。
參考連接:
https://www.freebuf.com/articles/web/166731.html