日志注入(也稱日志文件注入)
很多應(yīng)用都維護(hù)著一系列面向授權(quán)用戶责循、通過 HTML 界面展示的日志,因而成為了攻擊者的首要目標(biāo),這些攻擊者試圖偽裝其他攻擊陨溅、誤導(dǎo)日志讀者,甚至對閱讀和分析日志監(jiān)測應(yīng)用的用戶安裝后續(xù)攻擊程序绍在。
日志的脆弱性取決于對日志編寫過程的控制门扇,以及是否確保對日志條目進(jìn)行任何監(jiān)控或分析時,日志數(shù)據(jù)被看作非置信數(shù)據(jù)源偿渡。
簡單的日志系統(tǒng)可能使用file_put_contents()函數(shù)向文件中寫入文本行臼寄。比如,程序員可能采用以下格式的字符串來記錄登錄失敗的情形:
sprintf("Failed login attempt by %s", $username);
那么萬一攻擊者使用諸如“AdminnSuccessful login by Adminn”形式的用戶名呢溜宽?
如果把來自非置信輸入的該字符串插入日志中吉拳,攻擊者就能順利將其失敗登錄偽裝為管理員用戶無辜的失敗登錄。如再成功添加一次重試适揉,數(shù)據(jù)的可信度甚至?xí)摺?/p>
當(dāng)然留攒,重點(diǎn)在于攻擊者可以添加各種日志條目,還可注入XSS矢量嫉嘀,甚至還能注入字符炼邀,擾亂日志條目在控制臺的顯示。
日志注入的目的
注入的目標(biāo)也可能為日志格式解釋程序吃沪。如果分析器工具使用正則表達(dá)式解析日志條目汤善,將其分解成數(shù)據(jù)字段,那么票彪,注入的字符串可以通過精心構(gòu)造以確保正則表達(dá)式與注入的多余字段相匹配红淡,而非正確字段。例如降铸,以下條目便可能造成問題:
$username = "iamnothacker! at Mon Jan 01 00:00:00 +1000 2009"; sprintf("Failed login attempt by $s at $s", $username, )
更過分的使用日志注入的攻擊者可能試圖建立目錄遍歷攻擊在旱,使日志出現(xiàn)在瀏覽器中。正常情況下推掸,向日志消息中注入PHP代碼并在瀏覽器中打開日志文件便可成功進(jìn)行代碼注入桶蝎,攻擊者可用精心設(shè)計并隨意執(zhí)行這類代碼注入驻仅。這一點(diǎn)無需多講。如果攻擊者能在服務(wù)器上執(zhí)行PHP登渣,那么問題就大了噪服,此時你的系統(tǒng)最好有足夠的深度防御來將損害降至最低。
防御日志注入
最簡單的日志注入防御方法是利用受認(rèn)可的字符白名單對所有出站日志消息進(jìn)行清理胜茧。比如粘优,我們可以將所有日志限制為字母數(shù)字字符和空格。不屬于該字符列表的消息可能被認(rèn)定為有害消息呻顽,進(jìn)而出現(xiàn)有關(guān)潛在本地包含漏洞(LFI)的日志消息雹顺,以便告知你攻擊者可能進(jìn)行的嘗試。這種方法很簡單廊遍,適用于簡單文本日志嬉愧,此類日志消息無法避免非置信輸入的出現(xiàn)。
第二種防御則是將非置信輸入部分編碼為類似base64的編碼喉前,其中保存著數(shù)量有限的認(rèn)可的字符描述没酣,同時還可在文本中存儲大量信息。
路徑遍歷(也稱目錄遍歷)
路徑遍歷(也稱目錄遍歷)攻擊通過讀取或?qū)懭?web 應(yīng)用的文件而試圖影響后端操作卵迂,其方法為注入能控制后端操作所采用文件路徑的參數(shù)四康。照此,通過推進(jìn)信息披露以及本地/遠(yuǎn)程文件注入狭握,這類攻擊可以順利取得成功闪金。
我們將分別對這類后續(xù)攻擊進(jìn)行闡述,但路徑遍歷是使這些攻擊達(dá)成的根本漏洞之一论颅。盡管以下功能特定于操縱文件路徑這一概念哎垦,但值得一提的是,許多PHP函數(shù)都不僅僅接受單純的文件路徑恃疯。譬如漏设,PHP中的include()
或file()
等函數(shù)能接受URI。這似乎很違反常理今妄,但這使得以下兩種采用絕對文件路徑(即不依靠相關(guān)文件路徑的自動加載)的函數(shù)調(diào)用方法帶來相同的效果郑口。
include(‘/var/www/vendor/library/Class.php’); include(‘file:///var/www/vendor/library/Class.php‘);
關(guān)鍵在于,在相關(guān)路徑處理的同時(php.ini和可用自動加載器的 include_path
設(shè)定 )盾鳞,類似的PHP函數(shù)在各種形式的參數(shù)操縱下顯得尤其脆弱犬性,其中包括文件URI 方案替換——一旦文件路徑初始處注入了非置信數(shù)據(jù),攻擊者便可注入HTTP或 FTP URI腾仅。后面我們將在遠(yuǎn)程文件包含攻擊中對這一點(diǎn)進(jìn)行進(jìn)一步闡述乒裆,現(xiàn)在繼續(xù)探討文件系統(tǒng)路徑遍歷的問題。
路徑遍歷缺陷的各種情況有一個共同特點(diǎn)推励,即文件路徑因受操縱而指向不同的文件鹤耍。這一點(diǎn)通常通過向參數(shù)注入一系列 ../
(點(diǎn)-點(diǎn)-斜線)序列來實(shí)現(xiàn)肉迫,上述參數(shù)被整個添加或插入到 include()
、require()
稿黄、file_get_contents()
等函數(shù)喊衫,甚至在有的人看來不那么可疑的函數(shù)中,比如DOMDocument::load()
杆怕。
點(diǎn)-點(diǎn)-斜線序列允許攻擊者使系統(tǒng)導(dǎo)航或回溯至父目錄格侯。因此像/var/www/public/../vendor
這樣的路徑實(shí)際上會指向/var/www/public/vendor
。/public
后的點(diǎn)-點(diǎn)-斜線序列會回溯到該目錄的父目錄财著,也就是/var/www
。從該簡單示例可以看出撑碴,利用這一方法撑教,攻擊者便可讀取通過網(wǎng)站服務(wù)器可訪問的/public
目錄以外的文件。
當(dāng)然醉拓,路徑遍歷不僅僅用于回溯伟姐。攻擊者也可注入新的路徑元素,從而訪問無法通過瀏覽器訪問的子目錄亿卤,無法訪問的原因可能為子目錄或其父目錄之一中的.htaccess
中的deny from all
指令愤兵。PHP的文件系統(tǒng)操作不考慮Apache或其他網(wǎng)站服務(wù)商是如何配置并控制非公共文件和目錄的入口的。
路徑遍歷示例
防御路徑遍歷估計
本文系 OneAPM 工程師編譯整理排吴。OneAPM 是應(yīng)用性能管理領(lǐng)域的新興領(lǐng)軍企業(yè)秆乳,能幫助企業(yè)用戶和開發(fā)者輕松實(shí)現(xiàn):緩慢的程序代碼和 SQL 語句的實(shí)時抓取。想閱讀更多技術(shù)文章钻哩,請?jiān)L問 OneAPM 官方博客屹堰。
本文轉(zhuǎn)自 OneAPM 官方博客