第 四 周 write up (BJDCTF-2020-Web-Cookie is so subtle! Bugku 蹭网先解开密码 [网鼎杯 2020 青龙组]AreUSerialz)

我的博客https://tothemoon2019.github.io


BJDCTF-2020-Web-Cookie is so subtle!(twig,ssti)

先百度

image-20201010200127760

瞎测了一下,居然测出给git泄露了?

image-20201012194341050

跑了下脚本,不是git泄露。 淦

image-20201012194822379

重新开始

在hint下面发现了提示

image-20201012200132199

在flag.php页面登陆后,抓包发现,cookie里面多了变量user。

image-20201014123841249

看了大佬的提示:是模板注入,靠,这怎么想得到啊。菜鸡我是真的涨姿势了。

如果输入{ {7*’7’}}如果 输出7777777 则是jinja2模板 如果是 49 则是 twig模板

这里输出了49 则这是 twig模板注入

img

大佬的在博客中指出了怎样构造pauload

https://www.k0rz3n.com/2018/11/12/%E4%B8%80%E7%AF%87%E6%96%87%E7%AB%A0%E5%B8%A6%E4%BD%A0%E7%90%86%E8%A7%A3%E6%BC%8F%E6%B4%9E%E4%B9%8BSSTI%E6%BC%8F%E6%B4%9E/#2-Twig

我这里简单总结一下

twig提供了一个_self,它可以调用env(env是指属性Twig_Environment对象,Twig_Environment对象有一个 setCache方法可用于更改Twig尝试加载和执行编译模板(PHP文件)的位置)

不过call_user_function()函数一般被php禁用了,不过有一个getFile() 可以调用call_user_function()

image-20201013213830021

然后利用registerUnderfinedFilterCallback()函数将exec作为回调函数传进去。

img

至此payload创建成功,只需要在后面加上自己想要执行的命令就行了

payload:

{ {_self.env.registerUndefinedFilterCallback("exec")}}{ {_self.env.getFilter("cat /flag")}}

img

success

img

https://www.k0rz3n.com/2018/11/12/%E4%B8%80%E7%AF%87%E6%96%87%E7%AB%A0%E5%B8%A6%E4%BD%A0%E7%90%86%E8%A7%A3%E6%BC%8F%E6%B4%9E%E4%B9%8BSSTI%E6%BC%8F%E6%B4%9E/#2-Twig

https://blog.csdn.net/Aidang/article/details/108182487

https://zhuanlan.zhihu.com/p/28823933

https://xz.aliyun.com/t/7518




Bugku 蹭网先解开密码(hashcat)

无意中得知了hashcat这个神奇 ,但是第一次接触不会用啊,于是在网上找题目实战,刚好bugku就有一道用hashcat破解wifi密码的杂项题。

image-20201012121753825

下载wifi.cap文件,这个文件是wifi的握手包,即为采用的wpa加密方式的无线ap与无线客户端连接前的认证信息包,可以通过这个握手包暴力破解密码。

因为是破解,所以得写一个电话号码的字典给它跑。电话号码一般都是11位的,而且这里还告诉了前8位,所以用脚本生成一个11位的电话号码字典。

a = 1391040
f = open('pass.txt', 'w')
for i in range(0,1000):
    psd = a + str(i).zfill(4)
	f.write(psd+'\n')

hashcat

然后到 https://hashcat.net/hashcat/ 下载 hashcat binaries 文件

image-20201012122440823

到 https://hashcat.net/cap2hccapx/ 将 .cap文件转换成 .hccapx文件

image-20201012122529106

然后将hccapx文件与字典放入hashcat的文件夹

输入命令 vhashcat.exe -m 2500 1.hccapx pass.txt

image-20201012185323925

image-20201012185651596

成功跑出手机号码

image-20201012185354618

EWSA

导入握手包

image-20201012192803014

点击ok

image-20201012192924479

导入字典

image-20201012192956249

image-20201012193026204

开始爆破

image-20201012193201785

success

image-20201012185459965





[网鼎杯 2020 青龙组]AreUSerialz(序列化,protected)

参考:https://www.cnblogs.com/Cl0ud/p/12874458.html

打开就是源码,加上名字已经暗示的很清楚了,这是一道反序列化的代码审计题

image-20201013204701298

注入点是在最后,要给str传参,传的值得经过is_valid()函数进行判断

function is_valid($s) {
    
    
    for($i = 0; $i < strlen($s); $i++)
        if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))
            return false;
    return true;
}


if(isset($_GET{
    
    'str'})) {
    
    

    $str = (string)$_GET['str'];
    if(is_valid($str)) {
    
    
        $obj = unserialize($str);
    }

}

ord()函数返回字符的ascll值,这里的判断条件是str字符串里的每个字符的都得ascll都得大于32,或小于125。

具体可以去查表,大概也就是说以下和一些不可取。

image-20201013205945042

不管怎样,先把源码放进本地环境跑跑

image-20201013211156123

image-20201013211206892

给str传参,回显bad hacker!这时就该去FileHandler () 里面看看有没有可以利用的函数了。

image-20201013211235721image-20201013211244198

太菜了,都忘记会先调用构造函数destruct()了。它会先进行强类型比较通过的话把1赋给op,然后将content赋为空,转到process去

function __destruct() {
    
    
    if($this->op === "2")
        $this->op = "1";
    $this->content = "";
    $this->process();
}

image-20201014211510289

如果op为1就执行write(),如果op为2就执行read(),read函数后面还有一个output函数输出。感觉这里应该可以利用来输出flag。

public function process() {
    
    
    if($this->op == "1") {
    
    
        $this->write();
    } else if($this->op == "2") {
    
    
        $res = $this->read();
        $this->output($res);
    } else {
    
    
        $this->output("Bad Hacker!");
    }
}

read 里面有file_get_contents() 应该可以用来读取文件

private function read() {
    
    
    $res = "";
    if(isset($this->filename)) {
    
    
        $res = file_get_contents($this->filename);
    }
    return $res;
}

毕竟是读文件感觉write应该没用。

为了进行读flag,op必须为2,但这里可以用强类型绕过只要两边值的类型不同就直接false,所以给op赋值为整型的2,因为比较的时候op比较的是str类型的2,就直接false了。

image-20201014211510289image-20201015165739104

在构造函数里将op赋值整型2,filrname为flag.php

image-20201015171118170

这时看到序列化后的字符串有方块,这事实上是ascll为0的空字符,用这个去当payload肯定是不行了。

image-20201015171300459

image-20201015172331260

上网查了下,因为前面设置变量的时候设置的私有变量,私有变量序列化后就会有空字符。为了去掉这个,大佬说可以将

protected属性改为public

image-20201015172542221

跑payload:

image-20201015172651092

success

image-20201013213251591

猜你喜欢

转载自blog.csdn.net/qq_43478096/article/details/109104930