簡介
談到 Python 中的路徑拼接,大家會想到什么?
- os
- pathlib
以上兩個模塊都是 Python 內置的模塊,可以很方便的幫助我們完成路徑的拼接而不需要擔心不同系統下的路徑格式問題,但卻存在一個嚴重的安全風險:路徑穿越
# os.path.join
>>> os.path.join('/home/download', '../../opt/logo.png')
/home/download/../../opt/logo.png
# pathlib
>>> pathlib.Path('/home/download') / '../../opt/logo.png'
/home/download/../../opt/logo.png
倘若你未加校驗便寫入檔案,期望中,檔案被寫入到 /home/download 目錄下,實際卻被寫入到了 /opt 目錄中
file_path = os.path.join('/home/download', '../../opt/logo.png')
with open(file_path, 'w') as f:
f.write('hello')
利用
假設一個場景:
-
你想要爬取一個 mm 網站的圖片
-
抓包之后,發現網站竟 “友善“ 地提供一個介面:

-
不加思索,寫下如下代碼:
for item in d: img_content = requests.get(item['download_url']).content with open(os.path.join('/home/download', item['file_name']), 'wb') as f: f.write(img_content) -
當你美滋滋的查看美女圖片時,殊不知,一個惡意檔案已經下載到了你的電腦
進階
也許,你會存在僥幸心理,只能拼接相對路徑有什么用,我換一個路徑執行不就失效了嗎?
且慢,通過 Python 檔案,我們可以發現這個方便卻又危險的機制:

效果如下:
>>> os.path.join('/home/download', '/opt/logo.png')
/opt/logo.png
>>> pathlib.Path('/home/download') / '/opt/logo.png'
/opt/logo.png
基于此,惡意檔案便可以存盤至任意位置!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/389431.html
標籤:其他
