目錄
2.MD5 compare漏洞
3.ereg函數漏洞:00截斷
4.$key是什麼?
5.變數覆蓋
6.strcmp
7.is_numeric
8.preg_match
9.parse_str
字串比較" >10.字串比較
11.unset
12.intval()
13.switch()
14.in_array()
#15.serialize 和unserialize漏洞
16.session 反序列化漏洞
首頁 後端開發 php教程 PHP中有漏洞的函數總結

PHP中有漏洞的函數總結

Mar 08, 2018 pm 05:41 PM
php 函數

這篇文章講述了PHP中存在這一些帶有小漏洞的PHP函數,沒有了解過PHP中有漏洞函數的可以看看,在實際的PHP開發中用到這些函數時需要注意哪些東西,我們廢話少說,一起來看看這篇文章吧!

1.弱型別比較


PHP中有漏洞的函數總結


2.MD5 compare漏洞

#PHP在處理雜湊字串時,如果利用”!=”或”==”來將雜湊值進行比較,它把每一個以”0x”開頭的雜湊值都解釋為科學計數法0的多少次方(為0),所以如果兩個不同的密碼經過哈希以後,其哈希值都是以”0e”開頭的,那麼php將會認為他們相同。

常見的payload有

0x01 md5(str)
    QNKCDZO
    240610708
    s878926199a
    s155964671a
    s214587387a
    s214587387a
0x02 sha1(str)
    sha1('aaroZmOk')  
    sha1('aaK1STfY')
    sha1('aaO8zKZF')
    sha1('aa3OFF9m')
登入後複製

同時MD5不能處理數組,若有下列判斷則可用數組繞過

if(@md5($_GET['a']) == @md5($_GET['b']))
{
    echo "yes";
}
//http://127.0.0.1/1.php?a[]=1&b[]=2
登入後複製

3.ereg函數漏洞:00截斷

ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE
登入後複製

字串比較解析 
在這裡如果$_GET['password']為數組,則傳回值為NULL  
如果為123 || asd || 12as || 123%00&&&**,則傳回值為true  
其餘為false

4.$key是什麼?

別忘記程式可以把變數本身的key也當變數提取給函數處理。

<?php
    print_r(@$_GET); 
    foreach ($_GET AS $key => $value)
    {
        print $key."\n";
    }
?>
登入後複製

5.變數覆蓋

主要涉及到的函數為extract函數,看個例子

<?php  
    $auth = &#39;0&#39;;  
    // 这里可以覆盖$auth的变量值
    print_r($_GET);
    echo "</br>";
    extract($_GET); 
    if($auth == 1){  
        echo "private!";  
    } else{  
        echo "public!";  
    }  
?>
登入後複製

extract可以接收數組,然後重新給變數賦值,過程頁很簡單。

PHP中有漏洞的函數總結


同時! PHP的特性$可以用來賦值變數名稱也能導致變數覆蓋!

<?php  
    $a=&#39;hi&#39;;
    foreach($_GET as $key => $value) {
        echo $key."</br>".$value;
        $$key = $value;
    }
    print "</br>".$a;
?>
登入後複製

建構http://127.0.0.1:8080/test.php?a=12 即可達到目的。

6.strcmp

如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。 
先将两个参数先转换成string类型。 
当比较数组和字符串的时候,返回是0。 
如果参数不是string类型,直接return
登入後複製
<?php
    $password=$_GET[&#39;password&#39;];
    if (strcmp(&#39;xd&#39;,$password)) {
     echo &#39;NO!&#39;;
    } else{
        echo &#39;YES!&#39;;
    }
?>
登入後複製

建構http://127.0.0.1:8080/test.php?password[]=

7.is_numeric

無需多言:

<?php
echo is_numeric(233333);       # 1
echo is_numeric(&#39;233333&#39;);    # 1
echo is_numeric(0x233333);    # 1
echo is_numeric(&#39;0x233333&#39;);   # 1
echo is_numeric(&#39;233333abc&#39;);  # 0
?>
登入後複製

8.preg_match

如果在進行正規表示式符合的時候,沒有限製字串的開始和結束(^ 和$),則可以存在繞過的問題

<?php
$ip = &#39;asd 1.1.1.1 abcd&#39;; // 可以绕过
if(!preg_match("/(\d+)\.(\d+)\.(\d+)\.(\d+)/",$ip)) {
  die(&#39;error&#39;);
} else {
   echo(&#39;key...&#39;);
}
?>
登入後複製

9.parse_str

與parse_str() 類似的函數還有mb_parse_str(),parse_str 將字串解析成多個變量,如果參數str是URL傳遞入的查詢字串(query string),則將它解析為變數並設定到當前作用域。
時變數覆蓋的一種

<?php
    $var=&#39;init&#39;;  
    print $var."</br>";
    parse_str($_SERVER[&#39;QUERY_STRING&#39;]);  
    echo $_SERVER[&#39;QUERY_STRING&#39;]."</br>";
    print $var;
?>
登入後複製

10.字串比較

#
<?php  
    echo 0 == &#39;a&#39; ;// a 转换为数字为 0    重点注意
    // 0x 开头会被当成16进制54975581388的16进制为 0xccccccccc
    // 十六进制与整数,被转换为同一进制比较
    &#39;0xccccccccc&#39; == &#39;54975581388&#39; ;

    // 字符串在与数字比较前会自动转换为数字,如果不能转换为数字会变成0
    1 == &#39;1&#39;;
    1 == &#39;01&#39;;
    10 == &#39;1e1&#39;;
    &#39;100&#39; == &#39;1e2&#39; ;    

    // 十六进制数与带空格十六进制数,被转换为十六进制整数
    &#39;0xABCdef&#39;  == &#39;     0xABCdef&#39;;
    echo &#39;0010e2&#39; == &#39;1e3&#39;;
    // 0e 开头会被当成数字,又是等于 0*10^xxx=0
    // 如果 md5 是以 0e 开头,在做比较的时候,可以用这种方法绕过
    &#39;0e509367213418206700842008763514&#39; == &#39;0e481036490867661113260034900752&#39;;
    &#39;0e481036490867661113260034900752&#39; == &#39;0&#39; ;

    var_dump(md5(&#39;240610708&#39;) == md5(&#39;QNKCDZO&#39;));
    var_dump(md5(&#39;aabg7XSs&#39;) == md5(&#39;aabC9RqS&#39;));
    var_dump(sha1(&#39;aaroZmOk&#39;) == sha1(&#39;aaK1STfY&#39;));
    var_dump(sha1(&#39;aaO8zKZF&#39;) == sha1(&#39;aa3OFF9m&#39;));
?>
登入後複製

11.unset

unset(bar);用來銷毀指定的變量,如果變數bar 包含在請求參數中,可能出現銷毀一些變數而實現程式邏輯繞過。

<?php  
$_CONFIG[&#39;extraSecure&#39;] = true;

foreach(array(&#39;_GET&#39;,&#39;_POST&#39;) as $method) {
    foreach($$method as $key=>$value) {
      // $key == _CONFIG
      // $$key == $_CONFIG
      // 这个函数会把 $_CONFIG 变量销毁
      unset($$key);
    }
}

if ($_CONFIG[&#39;extraSecure&#39;] == false) {
    echo &#39;flag {****}&#39;;
}
?>
登入後複製

12.intval()

int轉string:

$var = 5;  
方式1:$item = (string)$var;  
方式2:$item = strval($var);
登入後複製

string轉int:intval()函數。

var_dump(intval(&#39;2&#39;)) //2  
var_dump(intval(&#39;3abcd&#39;)) //3  
var_dump(intval(&#39;abcd&#39;)) //0 
// 可以使用字符串-0转换,来自于wechall的方法
登入後複製

說明intval()轉換的時候,會將從字串的開始進行轉換直到遇到一個非數字的字元。即使出現無法轉換的字串,intval()不會報錯而是回傳0
順便說一下,intval可以被%00截斷

if($req[&#39;number&#39;]!=strval(intval($req[&#39;number&#39;]))){
     $info = "number must be equal to it&#39;s integer!! ";  
}
登入後複製

如果當$req['number']=0% 00即可繞過

13.switch()

如果switch是數字類型的case的判斷時,switch會將其中的參數轉換為int類型,效果相當於intval函數。如下:

<?php
    $i ="abc";  
    switch ($i) {  
    case 0:  
    case 1:  
    case 2:  
    echo "i is less than 3 but not negative";  
    break;  
    case 3:  
    echo "i is 3";  
    } 
?>
登入後複製

14.in_array()

$array=[0,1,2,&#39;3&#39;];  
var_dump(in_array(&#39;abc&#39;, $array)); //true  
var_dump(in_array(&#39;1bc&#39;, $array)); //true
登入後複製

在所有php認為是int的地方輸入string,都會被強制轉換

#15.serialize 和unserialize漏洞

这里我们先简单介绍一下php中的魔术方法(这里如果对于类、对象、方法不熟的先去学学吧),即Magic方法,php类可能会包含一些特殊的函数叫magic函数,magic函数命名是以符号开头的,比如 construct, destruct,toString,sleep,wakeup等等。这些函数都会在某些特殊时候被自动调用。 
例如construct()方法会在一个对象被创建时自动调用,对应的destruct则会在一个对象被销毁时调用等等。 
这里有两个比较特别的Magic方法,sleep 方法会在一个对象被序列化的时候调用。 wakeup方法会在一个对象被反序列化的时候调用。
登入後複製
<?php
class test
{
    public $username = &#39;&#39;;
    public $password = &#39;&#39;;
    public $file = &#39;&#39;;
    public function out(){
        echo "username: ".$this->username."<br>"."password: ".$this->password ;
    }
     public function toString() {
        return file_get_contents($this->file);
    }
}
$a = new test();
$a->file = &#39;C:\Users\YZ\Desktop\plan.txt&#39;;
echo serialize($a);
?>
//tostring方法会在输出实例的时候执行,如果实例路径是隐秘文件就可以读取了
登入後複製

echo unserialize觸發了tostring函數,下面就可以讀取了C:\Users\YZ\Desktop\plan.txt檔案了

<?php
class test
{
    public $username = &#39;&#39;;
    public $password = &#39;&#39;;
    public $file = &#39;&#39;;
    public function out(){
        echo "username: ".$this->username."<br>"."password: ".$this->password ;
    }
     public function toString() {
        return file_get_contents($this->file);
    }
}
$a = &#39;O:4:"test":3:{s:8:"username";s:0:"";s:8:"password";s:0:"";s:4:"file";s:28:"C:\Users\YZ\Desktop\plan.txt";}&#39;;
echo unserialize($a);
?>
登入後複製

16.session 反序列化漏洞

主要原因是 
ini_set('session.serialize_handler', 'php_serialize');  
ini_set( 'session.serialize_handler', 'php');  
兩者處理session的方式不同
這個玩意不是很明白,後面專門寫個題解吧!
這裡有個題目嗯!這是一個題目

相關推薦:

PHP函數的基本結構

以上是PHP中有漏洞的函數總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南

CakePHP 專案配置 CakePHP 專案配置 Sep 10, 2024 pm 05:25 PM

CakePHP 專案配置

CakePHP 日期和時間 CakePHP 日期和時間 Sep 10, 2024 pm 05:27 PM

CakePHP 日期和時間

CakePHP 檔案上傳 CakePHP 檔案上傳 Sep 10, 2024 pm 05:27 PM

CakePHP 檔案上傳

CakePHP 路由 CakePHP 路由 Sep 10, 2024 pm 05:25 PM

CakePHP 路由

討論 CakePHP 討論 CakePHP Sep 10, 2024 pm 05:28 PM

討論 CakePHP

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發

CakePHP 快速指南 CakePHP 快速指南 Sep 10, 2024 pm 05:27 PM

CakePHP 快速指南

See all articles