PHP反序列化總結(jié)

問題原因:漏洞的根源在于unserialize()函數(shù)的參數(shù)可控徽惋。如果反序列化對象中存在魔術(shù)方法儡炼,而且魔術(shù)方法中的代碼或變量用戶可控擎浴,就可能產(chǎn)生反序列化漏洞伦吠,根據(jù)反序列化后不同的代碼可以導致各種攻擊,如代碼注入惹骂、SQL注入憔涉、目錄遍歷等等。
魔術(shù)方法:PHP的類中可能會包含一些特殊的函數(shù)叫魔術(shù)函數(shù)析苫,魔術(shù)函數(shù)命名是以符號__開頭的; 有以下的魔術(shù)方法: __construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set(), _state(), __clone(), __debugInfo()

參考文章

http://www.reibang.com/p/631606cc5b76
https://www.freebuf.com/vuls/116705.html
https://blog.csdn.net/qq_42196196/article/details/81217375
https://blog.spoock.com/2016/11/08/hitcon-babytrick-writeup/

<?php
 
include "config.php";
 
class HITCON{
    private $method;
    private $args;
    private $conn;
    //私有類型:該類型的屬性或方法只能在該類中使用兜叨,在該類的實例、子類中衩侥、子類的實例中都不能調(diào)用私有類型的屬性和方法
 
    public function __construct($method, $args) {
    //__construct:當使用 new 操作符創(chuàng)建一個類的實例時国旷,構(gòu)造方法將會自動調(diào)用
        $this->method = $method;
        $this->args = $args;
 
        $this->__conn();
    }
 
    function show() {
        list($username) = func_get_args();//func_get_args()返回一個包含函數(shù)參數(shù)列表的數(shù)組,即傳入show()函數(shù)的參數(shù)
        $sql = sprintf("SELECT * FROM users WHERE username='%s'", $username);
        //sprintf()把百分號(%)符號替換成一個作為參數(shù)進行傳遞的變量
 
        $obj = $this->__query($sql);
        if ( $obj != false  ) {
            $this->__die( sprintf("%s is %s", $obj->username, $obj->role) );
        } else {
            $this->__die("Nobody Nobody But You!");
        }
        
    }
 
    function login() {
        global $FLAG;
        list($username, $password) = func_get_args();
        $username = strtolower(trim(mysql_escape_string($username)));//strtolower()轉(zhuǎn)小寫trim()去空格mysql_escape_string()轉(zhuǎn)義在 SQL 語句中使用的字符串中的特殊字符。
        $password = strtolower(trim(mysql_escape_string($password)));
 
        $sql = sprintf("SELECT * FROM users WHERE username='%s' AND password='%s'", $username, $password);
        if ( $username == 'orange' || stripos($sql, 'orange') != false ) {                //特殊字符?繞過;
        //stripos() 函數(shù)查找字符串在另一字符串中第一次出現(xiàn)的位置(不區(qū)分大小寫)
            $this->__die("Orange is so shy. He do not want to see you.");
        }
 
        $obj = $this->__query($sql);
        if ( $obj != false && $obj->role == 'admin'  ) {
            $this->__die("Hi, Orange! Here is your flag: " . $FLAG);
        } else {
            $this->__die("Admin only!");
        }
    }
 
    function source() {
        highlight_file(__FILE__);
    }
 
    function __conn() {
        global $db_host, $db_name, $db_user, $db_pass, $DEBUG;
 
        if (!$this->conn)
            $this->conn = mysql_connect($db_host, $db_user, $db_pass);
        mysql_select_db($db_name, $this->conn);
 
        if ($DEBUG) {
            $sql = "CREATE TABLE IF NOT EXISTS users ( 
                        username VARCHAR(64), 
                        password VARCHAR(64), 
                        role VARCHAR(64)
                    ) CHARACTER SET utf8";
            $this->__query($sql, $back=false);
 
            $sql = "INSERT INTO users VALUES ('orange', '$db_pass', 'admin'), ('phddaa', 'ddaa', 'user')";
            $this->__query($sql, $back=false);
        } 
 
        mysql_query("SET names utf8");                          //使用utf8編碼方式
        mysql_query("SET sql_mode = 'strict_all_tables'");//嚴格模式
    }
 
    function __query($sql, $back=true) {
        $result = @mysql_query($sql);//mysql_query() 函數(shù)執(zhí)行一條 MySQL 查詢茫死。
        if ($back) {
            return @mysql_fetch_object($result);
        }
    }
 
    function __die($msg) {
        $this->__close();
 
        header("Content-Type: application/json");
        die( json_encode( array("msg"=> $msg) ) );
    }
 
    function __close() {
        mysql_close($this->conn);
    }
 
    function __destruct() {
        $this->__conn();             //將數(shù)據(jù)寫入數(shù)據(jù)庫跪但;
 
        if (in_array($this->method, array("show", "login", "source"))) {
            @call_user_func_array(array($this, $this->method), $this->args);
        } else {
            $this->__die("What do you do?");
        }
 
        $this->__close();
    }
 
    function __wakeup() {
        foreach($this->args as $k => $v) {
            $this->args[$k] = strtolower(trim(mysql_escape_string($v)));
        }
    }
}
 
if(isset($_GET["data"])) {                        //偵測有無data的get獲取峦萎;
    @unserialize($_GET["data"]);                  //跳過 __wakeup()函數(shù)屡久;調(diào)用析構(gòu)函數(shù)
} else {
    new HITCON("source", array());
}
?>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市爱榔,隨后出現(xiàn)的幾起案子被环,更是在濱河造成了極大的恐慌,老刑警劉巖详幽,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件筛欢,死亡現(xiàn)場離奇詭異,居然都是意外死亡唇聘,警方通過查閱死者的電腦和手機版姑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來迟郎,“玉大人剥险,你說我怎么就攤上這事∠苄ぃ” “怎么了表制?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵宇姚,是天一觀的道長。 經(jīng)常有香客問我夫凸,道長,這世上最難降的妖魔是什么阱持? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任夭拌,我火速辦了婚禮,結(jié)果婚禮上衷咽,老公的妹妹穿的比我還像新娘鸽扁。我一直安慰自己,他們只是感情好镶骗,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布桶现。 她就那樣靜靜地躺著,像睡著了一般鼎姊。 火紅的嫁衣襯著肌膚如雪骡和。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天相寇,我揣著相機與錄音慰于,去河邊找鬼。 笑死唤衫,一個胖子當著我的面吹牛婆赠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播佳励,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼休里,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了赃承?” 一聲冷哼從身側(cè)響起妙黍,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瞧剖,沒想到半個月后废境,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡筒繁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年噩凹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毡咏。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡驮宴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出呕缭,到底是詐尸還是另有隱情堵泽,我是刑警寧澤修己,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站迎罗,受9級特大地震影響睬愤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜纹安,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一尤辱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧厢岂,春花似錦光督、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至卒茬,卻和暖如春船老,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背圃酵。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工努隙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辜昵。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓荸镊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親堪置。 傳聞我的和親對象是個殘疾皇子躬存,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容

  • php對象注入是一個非常常見的漏洞,這個類型的漏洞雖然有些難以利用舀锨,但仍舊非常危險岭洲。為了理解這個漏洞,請讀者具備基...
    BerL1n閱讀 3,561評論 0 2
  • 序列化與反序列化了解 serialize ()serialize() 返回字符串坎匿,此字符串包含了表示 value ...
    雞翅兒閱讀 2,154評論 0 2
  • 機場上盾剩,圓圓剛走出來,小鄭就喊道:“你怎么才出來替蔬?我都等了2個小時了告私!” “飛機誤點了,我不是讓你查航班信息了么承桥?...
    春梅cm閱讀 208評論 0 0
  • 昨天 媽媽家養(yǎng)的小魚 死掉了兩條 兩條小魚 一黑一紅 翻著肚皮飄在鮮紅的水面上 我問媽媽 他們是不是打架了 媽媽搖...
    宛錦閱讀 162評論 0 0
  • 我這兩天白に凇!超不得了凶异!α在瘋狂躍動蜀撑!ヽ(?Д?;)? 是不是一顆星星太孤獨了呢挤巡!(*/ω\*) 月色真美啊……
    星宮社閱讀 119評論 0 0