任意命令执行漏洞分析和防御

简介

1、命令执行(Command Execution)漏洞即黑客可以直接在Web应用中执行系统命令,从而获取敏感信息或者拿下shell权限
2、命令执行漏洞可能造成的原因是Web服务器对用户输入命令安全检测不足,导致恶意代码被执行
3、更常见的命令执行漏洞是发生在各种Web组件,包括Web容器、Web框架、CMS软件、安全组件等

函数

命令执行函数

System:system函数可以用来执行一个外部的应用程序并将相应的执行结果输出,函数原型如下:
string system(string command, int&return_var)
其中,command是要执行的命令,return_var存放执行命令的执行后的状态值。

Exec:exec函数可以用来执行一个外部的应用程序
string exec (string command, array&output, int &return_var)
其中,command是要执行的命令,output是获得执行命令输出的每一行字符串,return_var存放执行命令后的状态值。
Passthru:passthru函数可以用来执行一个UNIX系统命令并显示原始的输出,当UNIX系统命令的输出是二进制的数据,并且需要直接返回值给浏览器时,需要使用passthru函数来替代system与exec函数。Passthru函数原型如下:
void passthru (string command, int&return_var)
其中,command是要执行的命令,return_var存放执行命令后的状态值。
Shell_exec:执行shell命令并返回输出的字符串,函数原型如下:
string shell_exec (string command)
其中,command是要执行的命令。
popen()
proc_popen()
等等。

代码执行函数

eval(PHP代码)
payload:

<? eval('phpinfo();');?>

assert(PHP代码)
payload:

<? assert('phpinfo();');?>

preg_replace
preg_replace()函数的第一个参数存在e修饰符时,第二个参数和第三个参数可能当作PHP代码被执行
preg_replace漏洞触发有两个前提:
第一个参数需要e标识符,有了它可以执行第二个参数的命令
第一个参数需要在第三个参数中的中有匹配,不然echo会返回第三个参数而不执行命令
payload:

<?php preg_replace('/(.∗)/e','\\1','$_GET['a']);?>

请求1.php?a=[phpinfo()]
call_user_func()和array_map()
call_user_func()和array_map()等函数的作用就是调用其他函数,并将第二个参数作为回调函数的参数
payload:

<?php $b='phpinfo()'; call_user_func($_GET['a'],$b);?>

储备知识

转义字符:

windows下转义字符为^
linux下转义字符\

多条命令执行

windows下

&&
||
%0a

linux下

&&
||
;
$()
``	eg:`ls`
%0a
%0d

注:``和 ( ) 被 双 引 号 包 裹 的 字 符 串 被 当 做 命 令 执 行 , " ()被双引号包裹的字符串被当做命令执行," ()"(id)"

注释符

windows下

::BAT批处理脚本中用的较多

linux下

# 在bash脚本用的较多

小技巧

绕过空格过滤

1、通过其他空格形式替换
%0a,%0b,%0c,%0d,%09等等

2、截取空格
windows下

%ProgramFiles:~10,1%

~相当于截取符,表示获取环境变量%ProgramFiles%的值,一般为C:\Program Files,第10个位置上是空格。

linux下
$IFS$9

bash有效,zsh、dash无效

{cmd,args}

{ecjo,aaa}

读取文件时:

cat<>flag

可使用${IFS}注入
;IFS=,; 修改IFS变量为逗号来进行注入

黑名单关键字

过滤了cat,flag等关键字
1、利用变量拼接

Linux
a=c;b=at;c=he;d=llo;$a$b ${
    
    c}${
    
    d}
cat hello

2、通配符
?代表任意一个字符,*代表任意个字符

cat /tmp/f??

3、借用已有的字符串
会用substr等函数截取

执行无回显

1、HTTP通道

2、DNS通道

3、时间盲注

4、写入文件,二次返回

无字母数字构造命令

通过一些非字母数字运算获取字母数字
1、异或
2、取反
3、自增
详细参考
无字母数字webshell总结
无字母数字webshell之提高篇

未完待续。

猜你喜欢

转载自blog.csdn.net/weixin_44033675/article/details/116279329