2023NewStarCTF week2 webwp

        第一题:考察无参数RCE(前置是一个git泄露,用Githack拿到源码即可)

        首先看这个正则表达式,\W 表示匹配非单词字符(即除了字母、数字和下划线之外的字符),^ 在字符类内表示取反,+多次匹配,后面就是一个括号,即它会匹配类似这种形式:a(),a(b()),只要没参数就行。

        注意preg_replace运行后不会改变$_GET[star]的值,它只是规定$_GET[star]必须是这种无参数的形式,后面再加个分号。

        接下来对$_GET[star]进行匹配,这里很关键的几个无参函数都被过滤掉了,尤其是scandir,这样我们根本就不清楚某路径下的文件有什么(虽然我们能用getcwd();)。经过查阅资料,我们可以使用getallheaders(),效果如下:2023NewStarCTF week2 webwp_第1张图片

        我们使用这个函数的目的就是要自己在http请求头中加一部分,让其作为php代码运行,这里我们加上:2023NewStarCTF week2 webwp_第2张图片

再观看一下结果:

2023NewStarCTF week2 webwp_第3张图片

        到这里之后,我想过将phpinfo();取出来,但是并不能这么做,因为它的位置很尴尬,离开头和结尾都很远,如果离开头近,直接current(next())或者pos+next,pos是current的别名。注意这里过滤的是curent,所以我们还是可以用current。如果里结尾近,那我们使用array_reverse()将数组逆置即可,但是这个在中间就不好去取出来了,因为next不能嵌套使用,next里传的是数组,但是next一次以后的值就变为了字符串类型,所以考虑别的方法。

        查阅资料后,我们可以使用array_flip()函数,它会将传进来的数组进行一个键和值的互换,这样的话phpinfo();就变成键了,接下来我们只要取键就可以了,这时与之想配合的另一个函数array_rand(),它会随机的取数组中的一个或多个元素的键,不给参数就是默认取一个,这样就好办了,构造Payload:?star=eval(array_rand(array_flip(getallheaders())));

多发几次包,就能发现phpinfo()成功运行!

2023NewStarCTF week2 webwp_第4张图片

注意这里Payload必须要再加一个eval,如果不加这个eval,那麽到下面的这里时,得到的结果只是phpinfo()这个字符串,它只是将我们构造的array_rand(array_flip(getallheaders()))给执行了而已,所以我们要先用一个eval将array_rand(array_flip(getallheaders()))变为phpinfo();,下面才能正确eval(phpinfo();),可以自行体会一下。

        接下来,更换语句即可,2023NewStarCTF week2 webwp_第5张图片

2023NewStarCTF week2 webwp_第6张图片

根目录下找到flag,最后拿到:

2023NewStarCTF week2 webwp_第7张图片

        第二题:反序列化

2023NewStarCTF week2 webwp_第8张图片

这里需要注意的是Private这个点,记得url编码。接下来复刻一下我做这道题的过程:

构造Payload:2023NewStarCTF week2 webwp_第9张图片

2023NewStarCTF week2 webwp_第10张图片

发现web根目录下没有flag,那么我们查看一下网站根目录,2023NewStarCTF week2 webwp_第11张图片

这里改一下$cmd即可,

2023NewStarCTF week2 webwp_第12张图片

        这里发现竟然没有结果,到这里其实我也没太想明白为什么不行,不过该有的想法总要试试,这里想到全编码可不可以,php的urlencode并没有全部进行url编码,刚开始我先将序列化的结果拿到:O:4:"evil":1:{s:9:"evilcmd";s:4:"ls /";},然后把它放到burp中进行全编码,结果当然是不对的,因为我复制这个字符串时就少了一些东西,因为是Private类型的变量,所以我先将这段没有完全进行url编码的Payload拿到burp中解码,再进行全编码,这样就和直接复制那段序列化结果不一样了,最后也是成功看到了跟目录下的文件:

2023NewStarCTF week2 webwp_第13张图片

注意:这里不是复制过来的是,是上图的Payload解码过来的,接下来将它全编码:

作为payload传入:2023NewStarCTF week2 webwp_第14张图片

成功看到flag,接下来改命令(我用的nl,也可用其它,比如unique、cp等)重新构造Payload即可完成。

        其余的题做的时候就比较顺了,这俩道题卡的时间稍微长了一些,也学到了一些东西。

你可能感兴趣的:(安全,web安全,php)