CTF入門web篇17命令執行相關函數及繞過技巧講解

命令注入和代碼注入區別
之前我們講過的都是代碼注入,注入的代碼相當於網頁中新的代碼,比如去執行數據庫讀取的操作,我們想辦法插入一段代碼去執行,這就是代碼執行。
在這裏插入圖片描述

命令注入
命令注入執行的是系統中的命令,使目標服務器的命令在目標服務器上去執行我們想要執行的命令,系統命令的執行還是要基於某些函數的調度去實現的。
在這裏插入圖片描述

1、system函數

例如system函數執行系統命令並輸出相應的結果:

String system(string command, int&return_var)

這裏就給了個代碼示例。
在這裏插入圖片描述

2、exec函數

system函數是關鍵函數,不論是CTF還是挖洞最初都要對弱點函數做追蹤,第一個就是system,第二個就是exec。

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
不會因爲返回值受限一定要把它把傳遞給某個變量纔可以。
在這裏插入圖片描述

3、 passthru函數
在這裏插入圖片描述

String shell _exec(string command) command是要執行的命令
在這裏插入圖片描述

4、運算符

與shell_exec功能相同,執行shell命令並返回輸出的字符串
在這裏插入圖片描述

加引號後會直接執行系統命令,比如說echo,執行ls那麼它是輸出的是ls,如果要執行的是反引號中的ls,相當於打印出ls命令執行之後的一個結構。
在這裏插入圖片描述

在實際過程中,想去嵌入還是比較困難的,變量可控,存在反引號之間的,反引號傳遞不了,我們可以控制變量靠後的值,不管是get還是post單引號還是雙引號,傳遞上去的值肯定是在引號之間的。

命令執行的繞過
在這裏插入圖片描述

  1. 換行符

換行符,比如說%0a就相當於換了一行,%0d也就是回車符。連續指令,理解上可能就相當於SQL語句,比如說第一句select 123那麼理論上來說,如果你真的是寫完整語法的,肯定是用分號去結尾,然後另起一行下一句,包括PHP它也是以分號來做換一行一行結束的。那麼在shell中也是用這樣去使用的。我用把0d換成一個分號的時候,一樣是能夠去實現執行的,就是這樣一個效果,分號的作用就是說它會忽視掉兩者之間的關係,就無論你上一條什麼狀態,就是你執行完了,或者你報錯了,然後就執行下一句一句就是兩者互不影響。
在這裏插入圖片描述

  1. 後臺進程

後臺進程,是看有沒有用後臺進程,比如echo 123,放後臺之後,它其實就會產生一個ID號的。你在實際這個裏面去執行的時候,它這裏是沒有回顯所以說你實際過程中要去試看能不能回顯,以及爲什麼不回顯都可以去考慮。

管道符|,其實這個地方用的場景也是非常多的,因爲Linux是shell比如說echo 123,我們知道echo 123,它打印出來的就是123,那麼如果說把它作爲參數去傳遞給一個試試看這個地方,echo 123如果說作爲參數去傳遞給echo $0了,它這也沒有什麼效果。就是說echo你會看到是這樣的一個效果。

在這裏插入圖片描述
如果沒有bash,它是沒有回顯的你會看到上面執行一個ls的一個效果,echo ls相當於把它分割開來,然後ls作爲參數傳遞給bash,那bash其實類似一個shell就相當於新開一個窗口,實際執行的就是ls兩個語句是能夠合併的,它能夠作爲參數傳遞給它。第二個就是把它作爲參數傳遞給第二個命令去使用。
在這裏插入圖片描述

  1. 雙豎線||和&&

雙豎線||和一個&&,它其實有點類似於互和和的作用。雙豎線的話其實就是類似於或,上一個命令爲false的時候,它會執行下一條語句。我要像前面是一個PWD的時候,它就會只會去執行PWD而不會去執行ls所以是這樣的一個效果。所以說對應的它就是&&,它其實就是一個和邏輯,就只有上一條爲true的時候,它會執行下一條語句。

在這裏插入圖片描述
如果它是管道符|的話傳遞過去,這個要注意它做可能編碼之後能夠傳遞過去的狀態。其實它這個地方,會作爲去分割變量的一個問題。就是1=2,然後接下來就可能是第二個變量名,很多時候其實命令執行的時候,就是不讓你去使用某些符號,因爲過濾,你敲的都是字母,那麼字母的話肯定沒問題,但是很多時候它就比如說去過濾空格這種之類的,經常講到一個東西,如何去繞過一個空格的過濾,空格過濾的時候就用到這些。這邊提到相當於一個像<,我們知道,如果說你是向右,就是把它輸出到什麼東西里面,那麼向左的時候,它其實可以起到一個空格的作用。可以看到這裏還要提到那些什麼IFS西IFS等等這些東西,這裏的話你就可以把它理解成一個內部的預分割符,它這裏的話就相當於理解成了一個空格,然後IFS ${IFS} $IFS$9暫時也不用太過於關注,後面會提這個問題。

它這地方把這一串給合併掉了那麼這裏就要加引號,要是不加引號沒有IFS其實就是不行的。那麼其實這裏也提到一個問題,就是命令在識別的時候,它如何知道$IFS到哪裏結尾到底是IFS 還是exec,所以就推出了一個像剛纔那樣子。IFS這個地方,它就用它的大括號去把它給括起來,括起來的作用是和直接執行命令是一致的,這樣的話它能夠更加明確你命令就這個命令到底是多長,而不會說它不認識。
在這裏插入圖片描述

思路:相當於把它第幾個參數給拿過來意思就是,我們寫一個shell的時候,比如說a.sh後面是跟好幾個參數,那麼它就是把你第幾個參數渠道傳給shell,就是這個意思,$9這些都是空的,所以它是沒有值的,是不會有影響。這個%09的話,它其實是用一個在URL中做傳遞的,剛纔我們看到PWD就是能夠實現的,比如說我echo 222,這個地方是因爲有空格才能夠去實現的如果沒有空格,它是沒有用的,但是我要是跟上一個%09的時候,它又是能夠實現的,所以說%09在這裏的作用其實又是一個空格的一個作用。

接下來再看一下一些命令執行的一些繞過。這些繞過的話其實就是一些思路了。因爲我們知道命令的話,其實就是一些字母組成的東西,對不對?那麼像a=1;b=s;aab拼接起來是不是就是ls它的效果就可以看一下。
在這裏插入圖片描述

思路:它就實現了一個ls,這種時候你就能去實現任何的命令拼接也不會出現說非常敏感的那種關鍵詞,比如說它檢測的是ls,這裏是沒有ls,那你就可以實現一個繞過。那麼像下面這種可能用的更多了,就是用base64的編碼去做一個繞過,因爲base64是命令在Linux中是一般來說都是存在的,整個可能參數上會有點區別,大寫的就是像第二個參數,base64-D,那麼我們對它打印出來的結果做base64編碼就是base64-D大寫的D那麼這樣的話其實解出來之後,它其實就是打一個whoami並沒有去執行命令,對不對?所以說我還對它多執行一步,那麼這裏用的就是一個反引號,反引號以後對它這個是這條語句執行的最終結果去做一個命令執行,那麼它就會去執行whoami命令,去輸出一個我是誰的效果。那麼所以說編碼方式在實際利用中其實是比較多的,因爲用通過base64的話,基本上會過濾掉任何關鍵字。

4.語法substr string pos len
在這裏插入圖片描述

它就有點類似於叫什麼SQL注入中的節長度的一個過程。所以的話它相當於比如說PATH:0:101{PATH:0:1},就01肯定就取的是開始這個變量的第一個字符串。

expr去配合的話思路上也是一樣的,就是去從字符串中去讀到某個位置的字符串,比如說像命令去執行的時候。反斜槓的作用是它其實就是去分隔開。因爲之前IFS如果說沒有槓的話,它直接黏粘在一起,它可能無法分辨自己命令到底有多長。
在這裏插入圖片描述

思路:之前提到了IFS其實是因爲空格的作用,那麼這條命令的實質就expr substr然後加一個命令,然後取從第一位開始,就是相當於你能夠獲取到一串字符串,你從這個字符串中去選取命令,從這個字符串中去選取那個位置某個字母,那麼下面這個也是一樣的,只不過最終語句實現上可能會有點區別,PWD和pwd有什麼區別?以及{}裏面有什麼區別?其實就是{PWD}和PWD是一樣的,是沒有任何區別的,只不過剛纔提到這種的形式,它會更加明確你的命令語句是哪一些。pwd是純粹的命令去執行,PWD代表是環境變量,就是它肯定能讀取到。比如$PWD它是代表是環境變量,然後像下面也是一樣,就是這個地方。所以說的話,如果你知道這些環境變量的名稱,那麼你可以通過這些方法去讀任何你想要的內容。比如像這個地方沒有這槓的話,就是IFS1那麼它可能就不知道自己是個IFS這是這樣的一個效果。所以的話就是命令執行的話,這些空格的一些過濾,我就先講這麼多了,那麼在下一次過程中可能會找到一些例題來講,或者說去講一些無字母效的一些問題,這次就先這樣了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章