LazyBone's blog

August 7, 2024

Shell 上傳常見繞過手法

Security1.7 min to read

前端判斷

檔案上傳前端處理判斷副檔名的一律將js封鎖停用,停用後重新載入頁面即可上傳

後端判斷

檢查上傳檔案副檔名

通常會檢查各類敏感副檔名,php、php3、php5、pthml、jsp、jsP等等。

多副檔名手法

apache中的主配置httpd.conf有一個DefaultType引數,用來處理未知副檔名,這個引數預設是 text/plain ,遇到未知副檔名,會先判斷有沒有其他副檔名,順序是由右邊往左開始找起,如果沒有,則直接當txt、html處理。

上傳一個檔案shell.php.aaa,apache解析方式為最後的aaa無法解析,則往左檢查,能是一種繞過手法。

圖片馬手法

將圖片檔寫入php指令進行合成

copy filename.jpg/b + shell.php getshell.jpg 

進行合成後上傳getshell.jpg即可,同時配置一個.htaccess上傳,告訴伺服器這個檔案運行php、jsp指令

<FilesMatch "pic.jpg">
SetHandler application/x-httpd-php
</FilesMatch>

副檔名空格、點手法

沒有檢查副檔名是否摻雜空格、點,可在副檔名尾部中加入空白、點。

有以下幾種狀況能使用

windows特性之一,將空白和點會自行修飾掉,windows不允許檔名最後結尾為點或空白。

老舊版本的php漏洞,太少見,但還是提一下,靠的是move_uploaded_file()函式那段時間的漏洞

shell.php .jpg

php在截斷\00,後面的.jpg被丟棄

NTFS特性::$DATA繞過手法

上傳檔案如果沒有檢測::$DATA,可以抓一下包,直接在副檔名後面添加進行繞過。

雙寫手法

移除副檔名php、jsp、asp等等,透過寫兩次檔名繞過,如:shell.pphphp

檢查Content-Type

將Content-Type修改為符合的格式欺騙傳送。

POST封包構造Shell

若網站本身有可以執行任意檔案的漏洞,可在上傳封包裡直接構造,接近無視任何檢測。

像以下這種有include.php檔案在網頁本身上

<?php
/*
本页面存在文件包含漏洞,用于测试图片马是否能正常运行!
*/
header("Content-Type:text/html;charset=utf-8");
$file = $_GET['file'];
if(isset($file)){
    include $file;
}else{
    show_source(__file__);
}
?>

在上傳的檔案後,得到path,直接傳進file做執行裡做執行

http://192.168.178.31/upload-labs/include.php?file=./upload/9420210712102913.gif

條件競爭

開發者忽略了伺服器併發執行多線程而產生的問題,沒有對上傳進行鎖操作或同步操作,上傳shell.php

大致上的邏輯順序是這樣

  1. move_uploaded_file()上傳檔案
  2. 檢查檔案副檔名
  3. 副檔名不允許,刪除檔案

看似沒有問題,但在伺服器執行時,多線並行的特性,可以寫一個php讓伺服器刪除,但在刪除之前訪問這個頁面讓他執行

<?php
	$file = fopen("sh.php","w");
	fputs($file,'<?php phpinfo();?>');
?>

不斷上傳,同時瀏覽shparent.php頁面,一旦瀏覽成功,則代表sh.php生成完畢