天天看點

CTFweb類型(十九)15位、7位可控字元下的任意指令執行

​​某些特殊情況下指令執行的Getshell中對應某個函數的内容可控,可控字元長度分為長可控和短可控。我們先來看15個字元可控。

CTFweb類型(十九)15位、7位可控字元下的任意指令執行

條件:get方式傳值,能夠傳的最大字元串數是14個,傳shell_exec 

CTFweb類型(十九)15位、7位可控字元下的任意指令執行

思路:如果要getshell,相當于我們在裡面寫進去一個檔案。這個檔案是來自于我們伺服器發給目标伺服器,或者說是除我們之外的其它伺服器在帶給目标伺服器的。

如果是從其他伺服器送到伺服器裡面去的,就是讓其他伺服器向目标受害伺服器發起一個下載下傳請求,那麼外部檔案就會下載下傳進去了。那麼怎麼去下載下傳?我們這裡是14個字元串可控,可用wget,比如說存在一個URL/1.php,相當這個1.php寫進去了,但這裡已經14個字元串了 

CTFweb類型(十九)15位、7位可控字元下的任意指令執行

如果不能控制這麼短的域名,可以稍微長一點,比如1.php就是個1,那麼就相當于在裡面能夠去寫入一個1,就會多一個檔案1,就知道我們已經寫入一個檔案了。我們隻要把它再次變成我們想要的檔案就可以了。比如說mv 1重命名為1.php。

CTFweb類型(十九)15位、7位可控字元下的任意指令執行

示範:

檔案名是A,wget一下,輸入localhost,就會有a出來,但這個長度已經超過了。然後mv a a.php,這時候這個檔案就已經變成可控的,可以進行getshell了。

CTFweb類型(十九)15位、7位可控字元下的任意指令執行

如果直接寫入生成,echo能夠直接把内容輸出到一個檔案裡面去,如果跟1.php,它自己占用十一個字元,隻能再輸四個字母,即使開頭不是<?,輸進去是有點困難的。

CTFweb類型(十九)15位、7位可控字元下的任意指令執行

所有符号都有特殊意義,?沒有目錄,就要對?做轉義, 如果隻寫1的話,就等于你能構成最短的一個shell的結構,最短的shell的結構是php,然後eval(),$_ GET比POST短,然後數組形式,裡面加個1,這樣子,這個就是比較短的一種形式。

換行分割一下, a等于\<?php >1。這裡就是十四位,剛好可以執行。

CTFweb類型(十九)15位、7位可控字元下的任意指令執行

 接下來想寫入的時候,其實是不希望寫出的内容把原來我們已經寫的内容給它覆寫掉,想做的是追加,如果資料内容能夠直接寫到後面最好,否則我們就換行寫,那麼如果用追加的形式,比如說echo,用兩個尖括号,結果如圖:

CTFweb類型(十九)15位、7位可控字元下的任意指令執行

如果是字元串的形式,如圖

CTFweb類型(十九)15位、7位可控字元下的任意指令執行

我們發現如果是字元串的話,用數字的時候一定要加空格分割,不是數字的時候,就不用空格分割,在重命名之後,它能夠正常運作。

我們中間能控制的字元就是六位字元。$因為是關鍵字,肯定不能分割

CTFweb類型(十九)15位、7位可控字元下的任意指令執行
CTFweb類型(十九)15位、7位可控字元下的任意指令執行

注意,寫$_GET的$的時候肯定要加反斜線。這裡其實要加兩個反斜杠才能生效。我們來整理一下寫了哪些内容。

CTFweb類型(十九)15位、7位可控字元下的任意指令執行
CTFweb類型(十九)15位、7位可控字元下的任意指令執行

15個字元的方法就是這樣,而且技巧性也不是非常高,基本思路就是這些,接下來的所有思路都是基于這種方式的一個擴充。

接下來看就是15個可控字元的一個基本的思路。

CTFweb類型(十九)15位、7位可控字元下的任意指令執行

七個字元

CTFweb類型(十九)15位、7位可控字元下的任意指令執行

執行的結果作為内容輸出類似檔案名,如果存在,會直接覆寫原有檔案,如果不存在,會生成這個檔案,并把前面的内容輸出到檔案裡面。

例如:如果要ls輸出一個a,你會發現a裡面的内容是1.php、2.php a,包括它生成的新的a,如果沒有也是會生成的。如果ls是指令,l并不是指令,理論上執行不了,但是還是會去執行後面輸出的這個環節。雖然指令不存在,但也會去生成a檔案。

CTFweb類型(十九)15位、7位可控字元下的任意指令執行

ls輸出到a時,a裡面有兩個内容,比如a index.php。我們去控制ls的結果,去輸到a裡面,ls的結果我們可控。

CTFweb類型(十九)15位、7位可控字元下的任意指令執行

思路:ls輸出一個a,就是檔案名。如果能控制檔案名就能控制a,這中間欠缺的就是順序,sh後面跟一個檔案名稱的話,而且裡面是可執行的内容,就能夠去執行。如果所有内容都寫入a,内容可控,再用sh寫入a,構成了一句shell。

CTFweb類型(十九)15位、7位可控字元下的任意指令執行

欠缺點在哪裡?第一個,就是檔案名順序不可控。

CTFweb類型(十九)15位、7位可控字元下的任意指令執行

 第二個,檔案名寫得非常短。

CTFweb類型(十九)15位、7位可控字元下的任意指令執行
CTFweb類型(十九)15位、7位可控字元下的任意指令執行

 檔案順序怎麼控制?ls展示指令的預設情況下,應該是根據檔案名的大小寫來控制的,其實排序的方式非常多,那麼基于時間排序,比如說ls -t、比如說l>bbbb那麼abb index.php,ls -t的時候,我們看到bbbb排到最前面去了,就會把最新的檔案排在最前面。

CTFweb類型(十九)15位、7位可控字元下的任意指令執行

思路:

生成檔案名,然後ls一下寫入,但是如果隻用ls的話,它是不可控整個順序的。是以說解決的方法就是ls -t生成檔案之後,就用-t來代替了,然後執行寫入的a,就能換行分割。

示例

ECHO 1下寫一個很長一串shell,可以用base64轉一下符号,會發現任何特殊的符号都會不存在,然後用base64 -D去做一個解碼就可以了。你就能夠拿到一個檔案名,最後再把它追加到比如說1.php裡面。

CTFweb類型(十九)15位、7位可控字元下的任意指令執行

它能夠寫入一個phpinfo的檔案,接下來隻對它做一個分割就可以了,最終會實作一個demo。用腳本來構造一下結構。 

CTFweb類型(十九)15位、7位可控字元下的任意指令執行
CTFweb類型(十九)15位、7位可控字元下的任意指令執行

思路:

生成檔案名,ls -t去控制它的順序,然後SH執行生成檔案的内容,才能去執行任何指令,隻不過就在于去如何去構造指令,然後用這個來做分割。

​​​