文件上傳漏洞

文件上傳漏洞

文件上傳漏洞是開發者在開發功能時沒有做足夠充分的驗證(包括前端和后端),導致用戶可以上傳惡意文件,比如木馬、病毒、惡意腳本和webshell等。

利用條件:

  1. 能夠獲取文件上傳后的文件名及路徑;(有的服務器上傳成功后會修改文件名及或者隱藏路徑,攻擊者首先必須知道文件上傳在哪個路徑下)
  2. 服務器能夠解析上傳的文件:
    比如如果上傳的文件名為test.php,服務器能解析php代碼并執行,那么就能獲取webshell,但是如果服務器無法解析php文件,那么該webshell就是無效的。
    比如上傳的文件名為test.php55,服務器無法解析php55后綴的文件,因此無法利用。
    各個webserver服務器能解析的文件格式在配置文件里配置,比如apache2的配置文件是/etc/apache2路徑下的apache2.json文件,該文件里有如下配置,即apache2會加載mods-enabled目錄下的文件,在mods-enabled文件夾里php.conf文件則定義了哪種文件后綴可以被php解析器解析
# apache2.json
# Include module configuration:
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf

# php.conf
# 正則表達式配置能解析的php文件后綴
<FilesMatch ".+\.ph(p[345]?|t|tml)$">
    SetHandler application/x-httpd-php
</FilesMatch>

繞過方法

思路:進行繞過嘗試時,需要判斷:

  1. 是否能控制上傳的文件路徑
  2. 是否能控制上傳的文件名

黑名單限制繞過

特殊后綴繞過

服務器設置黑名單,比如限制aps、aspx、php等后綴的文件,可以根據服務器類型,判斷哪種文件類型后綴能繞過黑名單限制且能被服務器解析來進行后綴繞過。
比如黑名單設置為php asp aspx,可以嘗試php3
特殊后綴:
".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2","pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf"

.htaccess繞過

.htaccess文件(分布式配置文件)提供了一種方式,使得配置文件可以隨文件夾不同而不同,它配置了網站或文件夾的訪問規則。
可以利用 .htaccess文件來繞過限制較為全面的黑名單過濾,白名單過濾無法進行這種方式的繞過。

利用方式:

  1. 上傳 .htaccess文件,文件內容設置為AddType application/x-httpd-php .test,即將 .test 文件以php格式進行解析,
  2. 上傳一句話木馬文件,文件名為shell.test,服務器即可以php格式解析shell.test

如果服務器修改上傳的文件名,該方法無用

大小寫繞過

主要針對黑名單限制,可以把php改為pHp
原因:
windows平臺大小寫不敏感,linux平臺大小寫敏感,但是很多web平臺開發人員會為了用戶方便將網頁配置修改為大小寫不敏感,可以以這種方式進行繞過。

空格或點繞過

空格或點繞過,在文件后綴名后加空格或點,windows在存儲文件時會自動去掉后面的空格,linux則不行。
比如.php.php.

白名單限制繞過

%00截斷繞過

利用條件

  • 能夠控制文件路徑和文件名;
  • 服務器在解析文件結尾時以.進行判斷;
  • 服務器能成功解析到%00

利用方法:盡量在上傳路徑中使用,在文件名處使用能繞過前端檢測,如果后端繼續對文件后綴進行校驗,無法繞過。
原理
在url中 %00代表的是ascii碼中的0, 在ascii碼中0是特殊字符,會被解析為文件終止符,因此當讀到%00時程序會停止繼續往下解析。
可以使用burp進行抓包,然后在需要使用%00截斷的地方打一個空格,然后切換到hex16進制模式,找到20字符,修改為00,這是回到正常編碼模式,空格就變為文件終止符了。

一般的文件上傳代碼示例:

$uploaded_name = $_FILES[ 'file' ][ 'name' ];
$uploaded_ext  = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1); // 獲取上傳文件后綴
$target_name = md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext; // 對上傳文件進行重命名
if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" )) 
{  
    move_uploaded_file($_FILES["file"]["tmp_name"], $dir . $target_name); // 將臨時文件移動到指定目錄
    $result = $dir . $target_name;
    echo "Stored in: $result"; 
}
else{
    echo "Invalid file";
}

結合上述代碼來詳解%00截斷在文件名中使用和在上傳路徑中使用的區別:
當在文件名中使用%00時
假設文件名為test.php,將文件名修改為test.php%00.jpg,前端檢測到文件名結尾為.jpg,這樣可以繞過前端檢測,但是后端php substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1); 這一行代碼對文件名后綴進行了提取,此時%00截斷已經發揮了作用,即此時uploaded_ext.php。因此在下面的文件名后綴檢驗中,后綴名已經是.php,無法繞過。
即如果在上傳文件名中使用%00截斷的方法,能否繞過需要看前后端的代碼。
當在上傳路徑中使用%00時
假設上傳路徑為./upload,我們修改上傳路徑為./upload/test.php%00,上傳的文件名為test.jpg,這樣可以成功上傳文件。
代碼的前三行都正常運行,獲取的文件后綴為.jpg,服務器生成了隨機的文件名,假設為new.jpg,if語句成功執行。
在If語句里,php代碼將上傳路徑和新生成的文件名進行拼接生成新的文件名,即./upload/test.php%00new.jpg。然后上傳成功。
在接下來訪問url時,訪問的路徑就是http://xxx.com//upload/test.php%00new.jpg,此時就會發生00截斷,瀏覽器會解析為http://xxx.com/upload/test.php
因此,在實際測試中,%00截斷要配合文件上傳路徑使用效果最好。

00截斷編碼問題
為什么網上有的%00不用改動,有的卻要進行urldecode呢?
因為在上傳表單中存在一個enctype的屬性,而且在enctype=”multipart/form-data”這里,是不會對表單中的數據進行解碼的。
而path(路徑)又大多存放在表單中,所以需要對%00進行urldecode
簡單粗暴點說,在碰到multipart/from-data的時候,就需要進行urldecode 了。
為什么有的%00不用改動呢?
因為path也有可能直接存在url、cookie里邊,在提交數據的時候,瀏覽器會對數據進行url編碼。到服務器,則會對數據進行一次解碼操作。
簡單些說,path在url、cookie或者上傳方式不是multipart/from-data的時候,就不用進行url編碼

https://blog.csdn.net/weixin_44840696/article/details/90581104
00截斷與%00截斷 : 講了00截斷的應用
關于上傳中00截斷的理解與分析 講的比較清楚明白

前端驗證繞過

有的服務器只在前端進行驗證,可以繞過前端的驗證

  1. 通過burp抓包,修改并重放網絡包,繞過前端驗證
  2. 刪除或禁用js代碼進行繞過

服務器解析漏洞繞過

IIS 5.x / 6.0解析漏洞

漏洞1: 當創建.asp的文件目錄時,在此目錄下的任意文件,服務器都解析為asp文件。
比如 http://www.xxx.com/xx.asp/xx.jpg會被解析為asp文件
漏洞2: 服務器默認不解析“;”以后的內容
比如http://www.xxx.com/xx.asp;.jpg會被解析為asp文件

Nginx解析漏洞

低版本的nginx中,php配置文件php.ini中的cgi.fix_pathinfo選項默認為開啟狀態,當url中有不存在的文件時,php會默認向前解析,直到找到能解析的文件。
比如http://www.xxx.com/phpinfo.jpg/1.php,在服務器中1.php不存在,會向前解析,解析phpinfo.jpg文件,但是會以php的格式進行解析,即解析為phpinfo.php。

Apache 1.x / 2.x 解析漏洞

Apache從右向左判斷文件后綴,跳過非可識別的后綴,直到找到可識別的后綴然后按照可識別的后綴進行解析。
比如http://www.xxx.com/test.php.abc,apache無法識別abc后綴,向前識別到php后綴,最后該文件以php文件格式進行解析

windows文件流特性繞過

windows文件流

文件內容檢測繞過

有些系統會檢測文件內容,可以將php文件和圖片文件進行結合
比如圖片文件 test.png,php文件為test.php
執行命令cat test.php >> test.png,可以將test.php文件成功追加在test.png文件后面且可以執行

有時網上找的圖片進行拼接時無法運行php,是因為圖片里的有些字符無法被識別,可以刪除一些非關鍵內容,只保留圖片的文件頭,這樣既保存了文件格式,也可以被php解析器解析進行代碼執行。

防御方式

文件類型檢測

使用白名單、黑名單

安全的函數

使用安全啊的函數

webserver安全配置

熟悉webserver,使用安全的webserver版本,進行安全的配置

漏洞鏈

有時單一的漏洞無法完成,可以利用多個漏洞結合的方式來完成繞過
比如 文件上傳漏洞 + 本地文件包含漏洞

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,572評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,071評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,409評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,569評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,360評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,895評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,979評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,123評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,643評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,559評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,742評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,250評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,981評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,363評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,622評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,354評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,707評論 2 370

推薦閱讀更多精彩內容

  • 0x01 文件上傳漏洞 文件上傳漏洞顧名思義就是用戶上傳一個可執行的腳本文件,獲得了執行服務器端命令的能力。通常,...
    Pino_HD閱讀 1,918評論 0 0
  • 文件上傳漏洞 文件上傳漏洞就是用戶上傳一個可執行的文件腳本,并通過腳本獲得執行服務器端命令的的能力。 上傳的文件可...
    L1E6N0A2閱讀 1,452評論 0 2
  • 文件上傳漏洞是指用戶上傳了一個可執行的腳本文件,并通過此腳本文件獲得了執行服務器端命令的能力。這種攻擊方式是最為直...
    付出從未后悔閱讀 1,158評論 0 4
  • 前言: 實習工作以后,我才發現自己對于滲透測試還沒形成自己的測試體系,對于一些常見的漏洞測試方法了解得不夠全,更加...
    book4yi閱讀 2,009評論 0 3
  • 文件上傳漏洞可以說是日常滲透測試用得最多的一個漏洞,因為用它獲得服務器權限最快最直接。但是想真正把這個漏洞利用好卻...
    Splunker閱讀 289評論 0 0