分析
拿到题目观察了一下,题目有两个选项,一个是flag,一个是hint
先看hint,是一个hint.php文件,从页面上看,啥也没有。所以看看源代码有啥内容(一个比较好的习惯就是先对网页信息进行详细的搜集)
源代码也没什么特别的,只有一句提示:
hint页应该找不到什么信息了,那就看看flag页吧。
flag页有显示自己的ip地址
所以重点应该就是获取ip的方法。
我最初想到的是RCE的ping命令执行,但是不太对,命令执行是去执行自己设置的命令,通过绕过的手段达到获取信息的目的,但是这个是直接显示了ip,,太久没搞ctf了知识都搞忘了
X-Forwarded-For
回归正题!我能想到的关于ip的题就是X-Forwarded-For伪造ip
关于X-Forwarded-For:
X-Forwarded-For 是一个事实标准,标准定义,每次代理服务器转发请求到下一个服务器时,要把代理服务器的 IP 写入 X-Forwarded-For 中,这样在最末端的应用服务收到请求时,就会得到一个 IP 列表:X-Forwarded-For: client, proxy1, proxy2
所以题目中获取的ip有可能是通过X-Forwarded-For读取的,那我可以用burp抓包,然后添加一行X-Forwarded-For的内容来检验一下自己的猜测
X-Forwarded-For:127.0.0.1
可以看到ip变了,说明猜测是对的
SSTI模板注入
找到了这扇“门”,那利用什么工具能撬开这扇门呢?
最常见的方法就是注入,而sql注入显然是不行的,这又没什么数据库的交互,所以就剩下了SSTI注入(毕竟我知道的其他方法也不多)
SSTI就是服务器端模板注入(Server-Side Template Injection)和常见Web注入的成因一样,也是服务端接收了用户的输入,将其作为 Web 应用模板内容的一部分,在进行目标编 译渲染的过程中,执行了用户插入的恶意内容,因而可能导致了敏感信息泄露、代码执行、GetShell 等问题。其影响范围主要取决于模版引擎的复杂性。
测试SSTI的方法就是输入一个被俩大括号包起来的乘法,如果输出的是乘法的答案,那说明存在SSTI注入
X-Forwarded-For:{{3*6}}
存在注入,那就最后构造命令了。尝试在{}中构造系统命令
X-Forwarded-For:{system('ls')}
测试后发现可以执行,不过没看到flag文件,于是我‘ls /’查看上一级的文件夹,发现有一个flag,于是构造命令:
X-Forwarded-For:{system('cat /flag')}
成功找到flag