CTF的php內置函數bypass技巧


in_array

in_array函數用來判斷一個值是否在一組數組中

 總共三個參數,如果最后一個type為true,則為嚴格類型校驗 類似於===

如果沒有type=true則為弱類型匹配,此時存在類型強制轉換導致繞過校驗的風險

比如:

 
        
        $whitelist = ["hit"];
        if (in_array($page, $whitelist)) {
            echo "yes";
            return true;

以上就是驗證這個page是否滿足這個hit,那么傳入page=hit#即可進行繞過

經過測試,目前只發現#可以繞過這個字符串in_array校驗的

下面是數字型的繞過

        $whitelist = [1,2,3];
        if (in_array($page, $whitelist)) {
            echo "yes";
            return true;

 可以傳入page=1wff 1; 1,(前面是數字后面是字符串或者符號 進行繞過)審計代碼時,留意可能存在注入點

include

include("index.php?../../../../../etc/passwd");

這樣可以繞過文件包含限制,達到任意文件包含的目的

is_numeric

<!--
    ~~~post money and password~~~
if (isset($_POST['password'])) {
    $password = $_POST['password'];
    if (is_numeric($password)) {
        echo "password can't be number</br>";
    }elseif ($password == 404) {
        echo "Password Right!</br>";
    }
}
-->

如果遇上情況,傳入:password=404%00即可

此函數還可以導致sql注入,傳入1' or '1的hash即可

is_numeric('%201') 返回true

s_numeric('%0a1') 返回true

 

 

php中的strcmp漏洞
說明:

 

int strcmp ( string $str1 , string $str2 )

 

參數 str1第一個字符串。str2第二個字符串。如果 str1 小於 str2 返回 < 0; 如果 str1 大於 str2 返回 > 0;如果兩者相等,返回 0。

 

可知,傳入的期望類型是字符串類型的數據,但是如果我們傳入非字符串類型的數據的時候,這個函數將會有怎么樣的行為呢?實際上,當這個函數接受到了不符合的類型,這個函數將發生錯誤,但是在5.3之前的php中,顯示了報錯的警告信息后,將return 0 ,傳入money[]=1 即可繞過。
也就是雖然報了錯,但卻判定其相等

 

php://input 如何post提交和data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY= 進行繞過file_get_contents()

 

escapeshellarg/escapeshellcmd([BUUCTF 2018]Online Tool 講解了這個漏洞)

詳細分析一下:

傳入的參數是:172.17.0.2' -v -d a=1
經過escapeshellarg處理后變成了'172.17.0.2'\'' -v -d a=1',即先對單引號轉義,再用單引號將左右兩部分括起來從而起到連接的作用。
經過escapeshellcmd處理后變成'172.17.0.2'\\'' -v -d a=1\',這是因為escapeshellcmd對\以及最后那個不配對兒的引號進行了轉義:http://php.net/manual/zh/function.escapeshellcmd.php
最后執行的命令是curl '172.17.0.2'\\'' -v -d a=1\',由於中間的\\被解釋為\而不再是轉義字符,所以后面的'沒有被轉義,與再后面的'配對兒成了一個空白連接符。所以可以簡化為curl 172.17.0.2\ -v -d a=1',即向172.17.0.2\發起請求,POST 數據為a=1'。
回到mail中,我們的 payload 最終在執行時變成了'-fa'\\''\( -OQueueDirectory=/tmp -X/var/www/html/test.php \)@a.com\',分割后就是-fa\(、-OQueueDirectory=/tmp、-X/var/www/html/test.php、)@a.com',最終的參數就是這樣被注入的。


免責聲明!

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



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