IIS網(wǎng)站安全管理之URL路徑穿越漏洞
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
路徑穿越其實(shí)就是目錄遍歷,它可以讓攻擊者查看運(yùn)行了存在此漏洞的應(yīng)用的服務(wù)器上的任意文件,包括: 程序代碼、數(shù)據(jù); 后臺(tái)系統(tǒng)憑證; 敏感的操作系統(tǒng)文件。 在某些情況下還可能允許攻擊者上傳文件到任意目錄下(比如文件上傳漏洞同時(shí)存在路徑穿越),從而使得攻擊者可以修改服務(wù)器的配置文件,甚至最終完全控制服務(wù)器。 1、文件、模版下載; 2、URL參數(shù),如 file、f、path、download、filename、load 等,相關(guān)的字典網(wǎng)上多的是我就不列舉了; 3、圖片鏈接。 測(cè)試方法 這沒什么好說的 ../ 就完事了,再不濟(jì) ..%2F。 其實(shí)要預(yù)防路徑穿越漏洞的方法就是不要把用戶提供的參數(shù)完全輸入給文件系統(tǒng)的API,而是寫死在代碼里,限制用戶只能下載指定的文件。 那如果必須要用戶輸入呢,可以添加下面的驗(yàn)證流程: 如果可能得話,驗(yàn)證用戶輸入是否在白名單列表中;如果不行,就驗(yàn)證用戶輸入是否只包含文字或數(shù)字;如果再不行,就校驗(yàn)用戶輸入是否包含 ../ ..%2F 之類的 payload 設(shè)置指定的文件路徑,在拼接用戶輸入后獲取真實(shí)的文件路徑,查看其是否與預(yù)設(shè)相同,示例代碼如下: import os input_path = input("請(qǐng)輸入路徑: ") full_path = os.path.realpath(os.path.join("D:\ProjectPython\\test", input_path)) # 將用戶輸入的路徑與/etc/abc拼接成完整的路徑,使用os.path.realpath()函數(shù)獲取完整路徑的真實(shí)路徑 common_path = os.path.commonpath([full_path, "D:\ProjectPython\\test"]) # 使用os.path.commonpath()函數(shù)找到完整路徑和/etc/abc的共同路徑。如果共同路徑為/etc/abc,則表示路徑合法;否則,表示路徑不合法。 if common_path == "D:\\ProjectPython\\test": print("路徑合法") else: print("路徑不合法")
一個(gè)簡(jiǎn)單的路徑穿越 任務(wù)簡(jiǎn)報(bào) 這個(gè)實(shí)驗(yàn)室包含路徑穿越漏洞,你要讀取到 /etc/passwd 文件。 任務(wù)過程 在網(wǎng)站上有一些商品的圖片,這些圖片的src=/image?filename=48.jpg,那我們是不是可以修改它的值來查看對(duì)應(yīng)的文件呢? 現(xiàn)在我們把 filename 的值改成 "/../../../../../etc/passwd" 看看: 修改之后它的圖片就沒有啦,我們看看 burp 的流量是什么: OK 成功拿下。 絕對(duì)路徑繞過 有些應(yīng)用會(huì)檢測(cè)用戶輸入中是否含有 ../ 這種跨越目錄的命令,但是如果它們使用的是一些函數(shù)進(jìn)行目錄拼接時(shí)如果你輸入的是一個(gè)絕對(duì)路徑,那么它們就會(huì)自動(dòng)忽略你前面預(yù)設(shè)的目錄,這里我使用 python 作為演示,輸入正常的文件名: 此時(shí)一切安好,那我們輸入帶有 payload 的路徑呢: 此時(shí)雖然最終執(zhí)行的 /etc/passwd 但是我們的規(guī)則校驗(yàn)已經(jīng)識(shí)別出它有問題了,在實(shí)際中并不會(huì)被執(zhí)行,那么我們輸入絕對(duì)路徑試試 /etc/passwd,按照我們的理解,這里最后應(yīng)該執(zhí)行的是 /home/test/etc/passwd 這個(gè)路徑,那么結(jié)果是不是這樣呢,下面揭曉: 哈 傻了吧,最后的結(jié)果是 /etc/passwd 而且我們的校驗(yàn)規(guī)則認(rèn)為這個(gè)用戶輸入是沒有問題的,這也就使得對(duì)方的攻擊成功了,他成功繞過了我們的校驗(yàn)。 這主要是因?yàn)椋琽s.path.join() 函數(shù)會(huì)根據(jù)傳入的參數(shù)自動(dòng)拼接路徑,并處理其中的目錄分隔符。然而,如果傳入的參數(shù)中包含了絕對(duì)路徑(以根目錄開始的路徑),則之前的路徑部分將被忽略。 那么我們接下來就在靶場(chǎng)中看一下吧。 任務(wù)簡(jiǎn)報(bào) 這個(gè)網(wǎng)站設(shè)置了一個(gè)默認(rèn)的工作目錄,應(yīng)用程序阻止遍歷序列,但將提供的文件名視為相對(duì)于默認(rèn)工作目錄,你要做的是讀取到 /etc/passwd 文件。 任務(wù)過程 我們還是使用 ../ 試一下運(yùn)行的結(jié)果。 可以看到是不行的,現(xiàn)在我們換成絕對(duì)路徑看看 /etc/passwd。 看 和我們的演示代碼是一樣的結(jié)果,絕對(duì)路徑繞過了它的 ../ 檢測(cè)。 雙寫繞過 有的開發(fā)會(huì)在識(shí)別到 ../ 之后將其直接置換為空,以此對(duì)抗路徑穿越,但是我們都知道,這種策略我們可以通過雙寫來繞過,下面我們來看看。 任務(wù)簡(jiǎn)報(bào) 這個(gè)網(wǎng)站會(huì)把用戶提交的 ../ 剝離,你要做的是讀取到 /etc/passwd 文件。 任務(wù)過程 我們還是提交一個(gè) ../ 看看情況。 這里我們可以看到在使用 ../3.jpg 的情況下還是正常顯示了圖片,這說明程序就是把 ../ 給去掉了,畢竟上一層目錄是不會(huì)有 3.jpg 這個(gè)文件的,那我們就開始工作吧 ....//....//....//....//....//etc/passwd。 成功繞過,收工。 URL 編碼繞過 對(duì)于上面的情況,我們也可以使用 URL 編碼進(jìn)行繞過,有時(shí)候也可以嘗試 雙層 URL 編碼繞過。 任務(wù)簡(jiǎn)報(bào) 這個(gè)實(shí)驗(yàn)室包含路徑穿越漏洞,你要讀取到 /etc/passwd 文件。 任務(wù)過程 還是輸入 ../ 看看情況。 這里可以看到,還是和上一節(jié)一樣的情況,這次我們改一下,用 ..%2F 試試。 還是不行,好好好,那我就直接雙重編碼。 這次應(yīng)該是成了,我們直接上: payload %25%32%65%25%32%65%25%32%66%25%32%65%25%32%65%25%32%66%25%32%65%25%32%65%25%32%66%25%32%65%25%32%65%25%32%66%25%32%65%25%32%65%25%32%66%25%32%65%25%32%65%25%32%66%25%36%35%25%37%34%25%36%33%25%32%66%25%37%30%25%36%31%25%37%33%25%37%33%25%37%37%25%36%34 OK 成功繞過,下班下班。 截?cái)嗬@過 有些網(wǎng)站可能會(huì)通過驗(yàn)證文件后綴來判斷要訪問的是不是系統(tǒng)文件,畢竟大多數(shù)Linux系統(tǒng)的文件都是沒有后綴的,對(duì)于這種情況,我們可以通過之前文件上傳漏洞時(shí)使用的 00 截?cái)鄟砝@過。 任務(wù)簡(jiǎn)報(bào) 這個(gè)實(shí)驗(yàn)室包含路徑穿越漏洞,你要讀取到 /etc/passwd 文件。 任務(wù)過程 這次我們直接用 ../images/38.jpg 試試水。 這里可以正?;仫@圖片,說明這個(gè)地方?jīng)]有對(duì) ../ 做處理,那我們就直接上 payload 了。 這里可以看到是不行的,那我們?cè)囋?00 截?cái)?/p> OK 現(xiàn)在就可以了,具體原理可以參考上一篇文件上傳的文章,這里就不過多贅述了。 好了,本篇文章主要就是介紹了一些路徑穿越的常見位置、測(cè)試方法、常見的繞過手段、修復(fù)建議,相同的方法都可以用在文件下載上面,這兩個(gè)的原理都是一樣的,就不單獨(dú)介紹啦。 該文章在 2024/3/18 18:39:37 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |