1. 程式人生 > 其它 >php strcmp()漏洞(搬運)

php strcmp()漏洞(搬運)

php strcmp()漏洞

原文連結:https://blog.csdn.net/cherrie007/article/details/77473817

strcmp漏洞

注:這一個漏洞適用與5.3之前版本的php

我們首先看一下這個函式,這個函式是用於比較字串的函式

int strcmp ( string $str1 , string $str2 )

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

可知,傳入的期望型別是字串型別的資料,但是如果我們傳入非字串型別的資料的時候,這個函式將會有怎麼樣的行為呢?實際上,當這個函式接受到了不符合的型別,這個函式將發生錯誤,但是在5.3之前的php中,顯示了報錯的警告資訊後,將return 0 !!!! 也就是雖然報了錯,但卻判定其相等了。這對於使用這個函式來做選擇語句中的判斷的程式碼來說簡直是一個致命的漏洞,當然,php官方在後面的版本中修復了這個漏洞,使得報錯的時候函式不返回任何值。但是我們仍然可以使用這個漏洞對使用老版本php的網站進行滲透測試。看一段示例程式碼:

<?php
    $password="***************"
     if(isset($_POST['password'])){

        if (strcmp($_POST['password'], $password) == 0) {
            echo "Right!!!login success";n
            exit();
        } else {
            echo "Wrong password..";
        }
?>

對於這段程式碼,我們能用什麼辦法繞過驗證呢, 只要我們$_POST[‘password’]是一個數組或者一個object即可,但是上一個問題的時候說到過,只能上傳字串型別,那我們又該如何做呢。

其實php為了可以上傳一個數組,會把結尾帶一對中括號的變數,例如 xxx[]的name(就是$_POST中的key),當作一個名字為xxx的陣列構造類似如下的request

POST /login HTTP/1.1
Host: xxx.com
Content-Length: 41
Accept: application/json, text/javascript
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Accept
-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.8 Connection: close password[]=admin

即可使得上述程式碼繞過驗證成功。

轉載於:https://blog.csdn.net/cherrie007/article/details/77473817

不忘初心,方得始終。