就是记录下这次的 ctf 过程,总的来说,亮点不在题目,而是两道题的结合。
题目分析
按照出题的思路,大致就是要我们上传一些可执行的代码,然后找出服务器上的 flag 文件。因此,我们这次的题目就很简单了,只需要我们绕过上传限制,并且能访问到
自己的上传的脚本就好了呀。
尝试上传
首先,我们访问 ip 地址是 122 的靶机,其界面如下:
我们先尝试将自己写好的 php 脚本上传,看下服务器的返回提示:
它提示我们只能上传 jpg 格式的文件,同时,我们也可以看出,该服务器为 Nginx 的,因此,我们可以利用 Nginx 的解析漏洞,来完成这次执行。我们直接将下图中,
1.php 文件名称改为 1.jpg,然后提交就可以了,看下服务器返回信息。
从图中可以看到,服务器返回了文件的存放位置,因此,我们这里就用到了 Nginx 的解析漏洞。
Nginx 解析漏洞原理
大致原理就是,当服务器中设置了 “cgi.fix_pathinfo=1” 的时候,php 就会以 “/” 作为分隔符,从最右边一个文件开始向左找去执行,因此,假设我们
上传了
http://x.x.x.x/webshell.jpg
那么我们通过伪造一个不存在的文件去访问,例如
http://x.x.x.x/webshell.jpg/a.php
如果服务器找不到 a.php,那么就会去尝试执行 a.php 前面的 webshell.jpg 文件,因为该文件存在,所以其中的 php 代码会被服务器所执行。当然这里要注意漏洞的利用版本
为
nginx 0.5.*
nginx 0.6.*
nginx 0.7<=0.7.65
nginx 0.8<=0.8.37
利用漏洞
因此,我们根据服务返回的文件存储路径信息,直接访问/upload/1529515750.jpg/a.php,然后得到服务器的路径信息如下:
到了这里,利用漏洞的过程已经出来了,我们只需要修改 php 文件代码就可以了,php 的代码分别如下,通过这里的代码,我们可以找到服务器中的 flag 信息。
system("pwd");
?>
system("ls ../");
?>
system("cat ../flag.php");
?>
前端校验
接下来是访问 123 的靶机,我们其实可以很容易地看出,这是一个简单的前端校验,只需要上传的时候将后缀名改成 jpg,然后通过 burpsuite 抓包,再将其改成 php 就可以
绕过限制啦。
两道题的结合
拿到了这两个 flag 后,就会发现,两个 flag 拼接在一起,就会是一段,base64 加密的字符串,我们将其解密,得到如下:
因此我们发现了另一道题的 ip 地址,哈哈哈哈。
头文件欺骗
第三道题就用到了头文件的欺骗,利用过程都一样,这里就不重复叙述了,其实是写到这里我有点不想写了,…….
总结
emmmm,总结起来,这次的 CTF 让我学到了以下几个方面吧
Nginx 解析漏洞的条件,版本是有限制的
关于 php 代码的编写
文件的头文件欺骗
emmmm,前天赌球,压了十块钱比利时 2:0 英格兰,结果赢了,翻了 12 倍,啊哈哈哈,简直美滋滋,第一次赌球。。。然后昨天的世界杯决赛,并没有押中,看着大家的
4:2,翻了 18 倍,简直羡慕,不过,权当娱乐,啊哈哈哈哈。