打开题目
我们用cmd
curl --head +url 查看网站使用的是什么服务器
此题用的是openresty,OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台
我们上传php,phtml的一句话木马都显示不合法
那我们试试传a.jpg的一句话木马
显示我们一句话木马内容里面包含了<?
我们上传2.jpg
那用其他姿势再看看
上传1234.png
可以制作成图片马,但是需要解析成php文件
正常想到的是.htaccess,但是这个服务器是nginx,而.htaccess是针对apache的
我们先打开user.ini文件,auto_prepend_file=1234.png,意思在执行php第一个代码前先执行包含的文件。即1234.png
注意:我们需要在ini文件开头上写上GIF89a作为文件幻术头,才能上传成功
访问一下
发现上传成功,接下来 我们用蚁剑连接下面的这个目录
uploads/cc551ab005b2e60fbdc88de809b2c4b1/
蚁剑连接,在根目录下找到了flag
即使我们这里把ini文件里面的函数改成apppend_file函数
上传目录依旧不变
知识点:
- ./htaccess文件和user.ini文件有何区别?
.htaccess(“分布式配置文件”)是一种Apache服务器配置文件,只能在支持Apache服务器的环境中使用,例如在Linux和Windows系统中安装了Apache服务器。 .htaccess文件应该被用在内容提供者需要针对特定目录改变服务器的配置而又没有root权限的情况下
php.ini(“全局配置文件”),对整个web服务起作用。user.ini是用户自定义的php.ini,通常构造后门和隐藏后门。虽然.user.ini也有限制条件,但是相比.htaccess的用于更加广泛,不仅适用于Apache,还可以在Nginx上操作。不管是nginx/apache/IIS,只要是以fastcgi运行的php都可以用这个方法
auto_prepend_file 表示加载第一个PHP代码之前执行指示(包含的)PHP文件
auto_append_file 表示加载第一个PHP代码之后执行指示(包含的)PHP文件
.user.ini实际上就是一个可以由用户“自定义”的php.ini,我们能够自定义的设置是模式为“PHP_INI_PERDIR 、 PHP_INI_USER”的设置
auto_prepend_file是在文件前插入,而auto_append_file是在文件最后才插入。
- 如何查看网站所使用的服务器是什么?
我们可以用cmd,curl --head 域名/IP(如果对方做了版本隐藏可能会看不到是什么服务器)
以上面的题目为例
可以看出网站使用的是 openresty服务器,而OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台
或者使用站长之家查询,网页404报错等等(不适用于此题)
- 如何生成图片马?
图片马——就是在图片中隐藏一句话木马,和以jpg等为文件后缀的一句话木马不同,前者的本质是图片,后者的本质其实还是文档
图片马就是把一句话木马,通过二进制的方式追加到图片文件末尾,将木马文件和图片合并为另一个图片文件,合并后的图片包含一句话木马而且不影响图片显示,但用记事本等文本编辑器打开,能看到图片末尾的恶意代码。然后将图片上传到网站中,利用网站的漏洞,通常是文件包含漏洞,让网站把上传的图片当成脚本代码解析,从而达到运行恶意代码控制网站服务器的目的。
简单来说就是以文件上传漏洞为基本条件,将可执行的条件写入图片中去,再利用文件包含漏洞来执行图片中存在的一句话木马,从而获取目标服务器的权限。
制作方法:
1.将图片用文本方式打开,在末尾粘贴一句话木马(记事本,notepad++等,可能修改后图片无法正常显示)
2.cmd中使用命令 copy 1.jpg/b + 2.php 3.jpg
/b是二进制形式打开,/a是ascii方式打开
实操:桌面上有1.png图片,还有2.php一句话木马文件,在cmd终端下打开,注意三者须在一个目录下
copy 1.png/b + 2.php/a 5.jpg
用记事本打开5.jpg,在乱码的末尾发现了我们加上去的一句话木马(图片是能正常显示的)
copy 2.php/a +1.png/b 6.jpg
接下来
我们依旧用记事本打开6.jpg,在乱码开头便发现了一句话木马(图片无法正常显示)
我们总结知道,两个代码都可以执行得到相同的结果,只是后者的结果,一句话木马在文件内容的首行,不推荐用后者
3.16进制打开图片在末尾添加一句话木马(如010editor)
4.用ps打开图片,在文件简介里面写上一句话木马
知识点见:https://www.cnblogs.com/1ink/p/15101706.html
- exif_imagetype()函数
exif_imagetype() 读取一个图像的第一个字节并检查其签名,可以使用exif_imagetype()来避免调用其他具有不受支持的文件类型的exif函数
图像类型常量
如果无法从文件中读取足够的字节来确定图像类型,exif_imagetype() 将发出 E_NOTICE
并返回 false
。
文章参考wp:[SUCTF 2019]CheckIn 1_succ3的博客-CSDN博客