xctf之unseping
这是一道,让我头皮发麻的题,前期感觉一般,后面感觉好像搞不定了。。。看了writeup才知道php还能这样用。大开眼界了属实。
题目如上,一眼就可以看出这就是考察php的反序列化,感觉这不so easey?好像还真不是(菜鸡挠头)。
首先就是正常的反序列化,在反序列化的时候首先触发__wakeup()函数,迭代args参数中的值进行过滤,解题的关键就是绕过这个过滤。可以看到,|,&,;,空格,/,cat,flag,tac,php,ls这些字符全部被过滤,其实正常来讲这里面空格被过滤是最难受的,我在网上找到了好多空格被过滤怎么绕过的,但是实际上能用的很少,并且有的符号在某些指令运行时会产生异常的问题。。
那下一步先构造php类
被拦截了。
下一步我们使用双引号在指令中间。
哟呵,好像可以了。那下一步是不是直接读取flag_1s_here?
我们使用<>代替空格,然后。
返回的是空。。。。下一步是不是应该使用ls -l看下文件信息?那么问题来了,我们可以使用ls<>-l指令吗?
没错,执行出现差错了,没有展示出我们想要的信息,并且创建了一个名叫 -l 的文件
这才是我们想要的信息。
我尝试了很多代替空格的方法,但是都不行。总而言之,我测试很多都不行。包括base64转码然后解码,可是这些需要的空格,|,;都被过滤了。
最后没办法了,看了writeup,让我大开眼界了属实。
这是writeup的关键点,没了,就这些,直接给你。。
我看了半天没看明白printf(“\154\163\40\55\154\40\57\146\154\141\147\137\61\163\137\150\145\162\145”);这是什么编码,为什么可以直接执行。后来百度才找到,这是字符八进制,然后使用\并且双引号才可以转码成正常字符,并且可以被执行在exec()函数中。
这道题关键点就在于使用编码直接绕过函数检查,是我太菜了。
出来了,发现flag_1s_here是一个目录。(但凡这是一个文本文件,直接ca”“t<>fla””g_1s_here结束,当然这道题确实是一道不错的题。)
下一步直接ls -al flag_1s_here
显示出在flag_1s_here文件夹下有一个flag_831b69012c67b35f.php,下一步cat flag_1s_here/flag_831b69012c67b35f.php。
出来了。。。
这道题如果flag_1s_here不是目录,那这道题难度就会下降很多,多了这个目录,你会发现过滤的这些东西导致我们很多手法没办法用,最后发现八进制的奥秘。(当然大佬们可能还有别的方法,希望给菜鸡弟弟指点下。)
参考链接
ctf php审计从题目中的过滤学习绕过:https://blog.csdn.net/eliforsharon/article/details/120615961
在CTF比赛中,命令中空格被过滤的解决方法:https://blog.csdn.net/a3320315/article/details/99773192
cat命令读取一部分_命令注入绕过方式总结:https://blog.csdn.net/weixin_42373789/article/details/113451481?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-4-113451481-blog-99773192.pc_relevant_multi_platform_whitelistv4&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-4-113451481-blog-99773192.pc_relevant_multi_platform_whitelistv4&utm_relevant_index=5