码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • [安洵杯 2019]easy_serialize_php1


    打开题目

    题目源码:

    1. $function = @$_GET['f'];
    2. function filter($img){
    3. $filter_arr = array('php','flag','php5','php4','fl1g');
    4. $filter = '/'.implode('|',$filter_arr).'/i';
    5. return preg_replace($filter,'',$img);
    6. }
    7. if($_SESSION){
    8. unset($_SESSION);
    9. }
    10. $_SESSION["user"] = 'guest';
    11. $_SESSION['function'] = $function;
    12. extract($_POST);
    13. if(!$function){
    14. echo 'source_code';
    15. }
    16. if(!$_GET['img_path']){
    17. $_SESSION['img'] = base64_encode('guest_img.png');
    18. }else{
    19. $_SESSION['img'] = sha1(base64_encode($_GET['img_path']));
    20. }
    21. $serialize_info = filter(serialize($_SESSION));
    22. if($function == 'highlight_file'){
    23. highlight_file('index.php');
    24. }else if($function == 'phpinfo'){
    25. eval('phpinfo();'); //maybe you can find something in here!
    26. }else if($function == 'show_image'){
    27. $userinfo = unserialize($serialize_info);
    28. echo file_get_contents(base64_decode($userinfo['img']));
    29. }

    我们简单代码审计一下

    $function = @$_GET['f'];  //从 GET 请求中获取名为 'f' 的参数,并赋值给 $function 变量。使用 @ 符号来抑制可能的未定义变量警告,

    function filter($img){   //定义了一个名为 filter 的函数,接受一个参数 $img。
        $filter_arr = array('php','flag','php5','php4','fl1g');  //$filter_arr 数组包含了需要过滤掉的关键词列表,如 'php', 'flag', 'php5', 'php4', 'fl1g'。
        $filter = '/'.implode('|',$filter_arr).'/i';  //将关键词数组连接成一个以竖线 | 分隔的字符串,形成一个正则表达式模式,如 (php|flag|php5|php4|fl1g)。/.../i 是一个正则表达式模式,用于在 preg_replace() 函数中替换匹配到的内容。这里的 i 标志表示不区分大小写
        return preg_replace($filter,'',$img);  //将匹配到的字符串替换为空字符串,实现了过滤功能。

    if($_SESSION){
        unset($_SESSION);  //用 unset($_SESSION) 将整个会话数据清除
    }

    $_SESSION["user"] = 'guest';  //将 $_SESSION['user'] 设置为字符串 'guest'
    $_SESSION['function'] = $function; //将 $_SESSION['function'] 设置为从 $_GET 或者其他地方获得的值 $function

    extract($_POST); //使用 extract() 函数将 $_POST 数组中的键值对提取到当前的符号表中,使得这些键名变成了当前作用域的变量名,对应的值变成了这些变量的值

    if(!$function){
        echo 'source_code';  //如果 $function 为空,则输出一个链接到 index.php?f=highlight_file 的 标签,显示为 "source_code"
    }

    if(!$_GET['img_path']){           //$_GET['img_path']如果为空
        $_SESSION['img'] = base64_encode('guest_img.png');  //则将 $_SESSION['img'] 设置为经 base64 编码后的 'guest_img.png'。
    }else{   //如果不为空
        $_SESSION['img'] = sha1(base64_encode($_GET['img_path']));  //将 $_GET['img_path'] 进行 base64 编码,并用 sha1 编码,将结果存储到 $_SESSION['img'] 中
    }

    $serialize_info = filter(serialize($_SESSION));  //serialize() 函数将 $_SESSION 数组序列化,并将结果传递给 filter() 函数进行过滤。

    if($function == 'highlight_file'){  //如果 $function 的值为 'highlight_file'
        highlight_file('index.php');  //highlight_file() 函数来显示 'index.php' 文件的代码
    }else if($function == 'phpinfo'){  //如果 $function 的值为 'phpinfo',则使用 eval() 函数执行 phpinfo()
        eval('phpinfo();'); //maybe you can find something in here!
    }else if($function == 'show_image'){  如果 $function 的值为 'show_image'
        $userinfo = unserialize($serialize_info);   //通过 unserialize() 函数尝试将 $serialize_info 字符串反序列化为 PHP 数据结构,并将结果存储在 $userinfo 变量
        echo file_get_contents(base64_decode($userinfo['img']));  //使用 file_get_contents() 读取并输出对应图像文件的内容
    }

    做题

    首先题目给了我们提示

    那我们就get传参一个f(就相当于function),让f=phpinfo看看提示

    在页面里面看到了flag文件的名字

    知识点:

    implode函数

    implode() 函数,把数组元素组合为字符串。

    语法

    implode(separator,array)
    
    参数描述
    separator可选。规定数组元素之间放置的内容。默认是 ""(空字符串)。
    array必需。要组合为字符串的数组。

    例子:

    1. $arr = array('Hello','World!','I','love','Shanghai!');
    2. echo implode(" ",$arr);
    3. ?>

    运行结果为:

    Hello World! I love Shanghai!

    extract函数

    定义和用法

    extract() 函数从数组中将变量导入到当前的符号表。

    该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。

    第二个参数 type 用于指定当某个变量已经存在,而数组中又有同名元素时,extract() 函数如何对待这样的冲突。

    该函数返回成功导入到符号表中的变量数目。

    语法

    extract(array,extract_rules,prefix)
    
    参数描述
    array必需。规定要使用的数组。
    extract_rules

    可选。extract() 函数将检查每个键名是否为合法的变量名,同时也检查和符号表中已存在的变量名是否冲突。对不合法和冲突的键名的处理将根据此参数决定。

    可能的值:

    • EXTR_OVERWRITE - 默认。如果有冲突,则覆盖已有的变量。
    • EXTR_SKIP - 如果有冲突,不覆盖已有的变量。
    • EXTR_PREFIX_SAME - 如果有冲突,在变量名前加上前缀 prefix。
    • EXTR_PREFIX_ALL - 给所有变量名加上前缀 prefix。
    • EXTR_PREFIX_INVALID - 仅在不合法或数字变量名前加上前缀 prefix。
    • EXTR_IF_EXISTS - 仅在当前符号表中已有同名变量时,覆盖它们的值。其它的都不处理。
    • EXTR_PREFIX_IF_EXISTS - 仅在当前符号表中已有同名变量时,建立附加了前缀的变量名,其它的都不处理。
    • EXTR_REFS - 将变量作为引用提取。导入的变量仍然引用了数组参数的值。
    prefix

    可选。请注意 prefix 仅在 extract_type 的值是 EXTR_PREFIX_SAME,EXTR_PREFIX_ALL,EXTR_PREFIX_INVALID 或 EXTR_PREFIX_IF_EXISTS 时需要。如果附加了前缀后的结果不是合法的变量名,将不会导入到符号表中。

    前缀和数组键名之间会自动加上一个下划线

    参考下面这个实例就能很清楚看明白如果变量有冲突,该怎么设置

    实例

    1. $a = "Original";
    2. $my_array = array("a" => "Cat", "b" => "Dog", "c" => "Horse");
    3. extract($my_array, EXTR_PREFIX_SAME, "dup");
    4. echo "\$a = $a; \$b = $b; \$c = $c; \$dup_a = $dup_a";
    5. ?>

    运行结果为:$a = Original; $b = Dog; $c = Horse; $dup_a = Cat

    unset函数

    unset() 函数用于销毁给定的变量。

    PHP Filter

    PHP 过滤器用于对来自非安全来源的数据(比如用户输入)进行验证和过滤。

    具体使用见:

    PHP Filter 函数 | 菜鸟教程

     

    反序列化字符串逃逸

    知识点的参考文章:

    PHP extract() 函数

    PHP implode() 函数

  • 相关阅读:
    数字化转型系列主题:战略咨询常用术语解释和样例说明
    ACM第三周总结
    js中,函数的两种命名方式-声明式、函数表达式 & 自执行匿名函数 (function(){})()之删除对象中的属性
    Jquery入门和案例
    一次分表的技术方案分享
    如何隐藏这个 columns: [ { title: ‘操作‘, dataIndex: ‘action‘,
    Creo 9.0 基准特征:基准轴
    dockerfile的优化和本地私有仓库的搭建
    整数智能·迪拜GITEX 2023 |探索未来科技,感受创新脉搏
    Cesium之Web Workers
  • 原文地址:https://blog.csdn.net/m0_75178803/article/details/136364559
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号