1. 程式人生 > >過狗菜刀原理以及繞過魔術引號的配置

過狗菜刀原理以及繞過魔術引號的配置

頻繁 () 難度 都是 不用 conf ase 討論 post

本文作者:i春秋簽約作家——涼風

首先感謝@我是salf 給我的靈感

我之前發了一個帖子:過了D盾掃描的一句話木馬。

裏面分析了一句話木馬的原理,以及過狗、D盾的木馬的編寫。

傳送門:

https://bbs.ichunqiu.com/thread-25644-1-1.html

tips:下文需要知道一句話木馬的原理,可看上面說的帖子

tips2:還是在這裏簡單的說一下吧,例如木馬 assert($_POST[XYZ]),會把用戶post的 XYZ=asdfasdf中的asdfasdf作為php代碼執行,這是assert這個函數的特性,eval同理。

也許有人用了我的馬兒還是被狗攔了,是因為你們的刀子不是過狗刀。

菜刀的官網在去年更新了最新的刀子,可以過狗的刀子。(附件)

為什麽能過狗?原理是什麽?
之前我們分析了一句話木馬的原理,今天我們就來分析一下菜刀的工作原理以及過狗原理吧。

新版菜刀多了一個叫做caidao.conf的配置文件,自帶過狗配置,看圖

技術分享

紅框中的配置就是這次文章的重點,也是過狗的重點所在(只討論php)

單單看配置可能看不明白,我們用fidder抓包看看,拿過狗菜刀和舊版菜刀做一個對比

看看究竟有什麽區別,為何能過狗。

舊版菜刀:

技術分享

舊版post了兩個參數,但是被安全狗攔截。

新版菜刀:

技術分享

post了一個參數,繞過了安全狗,並且返回了正常的數據

我們來對比一下post的數據

技術分享

好長,可以看到有大部分都是base64編碼,我們通過仔細觀察,或者是拿去解密,就能知道這是菜刀需要執行的命令。

為了方便看,我做個簡單的處理,去掉命令,把裏面的url編碼還原成字符

技術分享

可以看出

舊版幾乎沒有經過處理,語句的作用是:執行經過base64解密後的命令(這裏看不懂的一定要看的之前發的帖子,或者文章開頭的tips)

新版和舊版語句的最終的作用是一樣的,也是執行經過base64解密後的命令,但是新版做了過狗處理,安全狗已經不認識這段代碼了(不懂叫什麽就叫代碼吧。。)

(新版的語句一堆反斜杠,是轉義,因為代碼用了雙引號嵌套,雙引號裏的雙引號需要進行轉義不然語法錯誤,大家自行忽略轉義符就能看明白了)

我們看看能不能自己寫一個過狗的配置,學以致用嘛。

大家如果是像我一樣的菜比的話,就先備份好配置文件,以防不備

打開配置文件,看看配置文件正確改法的格式要求、註意事項什麽的。

看圖:

技術分享

現在我們能看明白:紅框中的是我們post的數據中,“密碼”= xxxxx中 的 xxxxx

而xxxxx就是服務器一句話木馬執行的代碼

可以看到,菜刀執行命令(圓圈中的%s)用到的函數是菜刀自己構造的assert與eval變形木馬,(即紅框中代碼)為方便理解,這個菜刀自己構造的木馬可以稱之為“木馬函數”,我們傳到服務器的一句話木馬在這裏只是用來執行菜刀傳遞的這一個“木馬函數”,而菜刀傳遞的其他關鍵的命令(圓圈中的%s),都由這個“木馬函數”來執行。就像是:老板命令經理,經理命令員工 —> 老板通過經理來命令員工。

這麽設計是有道理的:

1. 沒有人知道一句話木馬的形式是怎麽樣的,變形的一句話木馬有好多種,除了assert和eval以外仍有其他函數可以成為一句話木馬,有些不能支持多語句執行,使用“木馬函數”這個方法大大增加了兼容性,因為服務器的一句話木馬只需要執行這個“木馬函數”就可以了。

2. 這樣子,可以在用戶操作菜刀時,所有命令集合在一起給“木馬函數”一起執行,不用頻繁的向服務器進行多次請求,一個命令一個命令的執行會很慢滴。(請求過於頻繁會不會被封ip?)

(好了紅字終於結束了,感覺紅色好難看,但是表重點還好吧。)

圖中紅框就是我們需要修改,替換的地方,我們換成自己的配置。經過分析fidder攔截的數據包,我們要執行的命令是base64編碼的命令,這個加密的命令就是作為“木馬函數”的參數,在配置文件裏用%s表示,我們試著改改,先試著修改成較為簡單的,易於理解的又能過狗的配置。

看圖:

技術分享

很短的一句話,直接 (看圖,這裏被和諧) 就可以過狗,%s就是菜刀傳進去的base64加密命令。

至於菜刀的命令為什麽是base64加密,更高級的玩法,本文暫時不討論,大家可以看自帶的readme.txt

本文就這麽結束麽?這怎麽對得起我的標題!我可不是標題黨!(才怪)(其實對標題起名不是很滿意)

註意,其實以下才是本文的重點,本菜比摸爬滾打走了許多彎路才研究出來的,連菜刀原作者都不曾想到的問題(我臉皮厚hhh)

看了過狗菜刀原本的配置,當我看到了一堆反斜杠,我就想到了gpc魔術引號,如果開啟了,那麽這個菜刀豈不是廢了???

經過測試,新版菜刀廢了。。。好吧,果然跟我想的一樣。

在這裏感謝秦國的 青鳥 @我是salf 他給我靈感,我才想到要弄一個過gpc的配置,不然這篇文章就結束了(本菜比也不會走那麽多彎路,不會廢了一整天頭痛這個。。這篇文章至少提前2天出來)(我終究還是太菜了)

想繞過gpc,那就不能有引號了,舊版菜刀沒有用引號(估計是想到有gpc)。

我們不僅要考慮到引號的問題,還要考慮安全狗,這對本菜比來說難度還是好大的。

既然我菜,為什麽我要做這個??

因為我查過 ,過狗菜刀繞gpc配置,也許是打開的方式不對,沒有查到資料,網上沒有哇

既然這樣我就能拿來裝逼了hhh(。。。)

(不要告訴我網上有,我會很失望的,)

不知不覺又尬聊了,

本php菜比的彎路總結:

1.eval函數可以執行 echo 、if 等,分號結尾必不可少。

2.assert函數內不能有echo,不能有if,

3.安全狗攔截機制:eval後不能跟$_POST,也不能加base64_decode,assert相比eval攔截的要松,

4.assert(0|| xxx) 這個代碼||後面的會被執行,換成&&後,符號兩邊都會執行,就是邏輯運算符,不多介紹。

5.assert可以接著base64解密,然後執行解密後的命令

6.base64_decode()括號裏如果是字符串常量必須帶引號,括號內可以放不帶引號的變量

配置文件開頭提到了分隔符,我們看看分隔符

技術分享

技術分享

右邊的圖是菜刀接收的原本的數據,用的是配置文件中設置的分隔符來隔開,如果有很多命令的話會更直觀。菜刀處理了這個不友好的回顯數據,將數據轉換成我們看到的友好界面。

base64解密我們菜刀的加密部分的命令(%s的地方),可以看到 分隔符是用 echo(”")這樣的形式輸出的,所以不能用assert了,我們選用eval執行菜刀的命令,可是eval會被攔截。。

思路:前面總結5說了assert可以執行base64解密的內容,我們就把eval命令加密,用decode解密後再給assert執行。base64_decode通過$_post[]賦值,加密後的eval也通過post變量賦值

如圖:

技術分享

這樣我們需要改的配置就寫好了,趕快試試看。。

技術分享

成功了成功了,感覺這樣表達有點蠢,但是意思就是成功了,累壞我了,好激動

我這個php菜比走了那麽多彎路終於弄出了有用的東西。

為了過gpc想了很多條思路,但是那些路都因為各種各樣的報錯斷了,本菜比不知道什麽原因,就不貼出來誤導大家了。

ps:剛剛發帖被攔截了,好在我備份了,不過要重新放圖。。

ps:我得意的太早了,攔截x3

ps:聽丞相的話,換成全角就ok了,謝謝丞相大人

大家多交流吧~不懂可以問我哦

附上原版過狗刀,剛出的時候拿到的。後綴是7z,因為不給上傳我就改成rar

密碼是我拿到的時候就自帶的 密碼:www.maicaidao.com

過狗菜刀原理以及繞過魔術引號的配置