命令执行及代码执行漏洞
命令执行漏洞
由于开发人员编写源码,没有针对代码中可执行的特殊函数入口做过滤,导致客户端可以提交恶意构造语句提交,并交由服务器端执行。命令注入攻击中WEB服务器没有过滤类似system(),eval(),exec()等函数是该漏洞攻击成功的最主要原因。
漏洞成因
应用在调用这些函数执行系统命令的时候,如果将用户的输入作为系统命令的参数拼接到命令行中,在没有过滤用户的输入的情况下,就会造成命令执行漏洞。
php相关函数
- system(args) 有回显
- passthru(args)(有回显)
- exec(args) (回显最后一行-必须echo输出)
- shell_exec(args) (无回显-必须输出)
- 反引号:``
- popen(handle,mode)(无回显)
- proc_open(‘cmd’,‘flag’,‘flag’)(无回显)
- $process = proc_open(‘dir’,$des,$pipes);
- echo stream_get_contents($pipes[1]);
漏洞危害
- 继承Web服务程序的权限去执行系统命令或读写文件
- 进一步内网渗透
- 反弹shell
- 控制整个网站
命令拼接符
windows
1
2
3
4
|
1. “|”:直接执行后面的语句。 2. “||”:如果前面的语句执行失败,则执行后面的语句,前面的语句只能为假才行。 3. “&”:两条命令都执行,如果前面的语句为假则直接执行后面的语句,前面的语句可真可假。 4. “&&”:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真。 |
linux
1
2
3
4
5
|
1. “;”:执行完前面的语句再执行后面的语句。 2. “|”:显示后面语句的执行结果。 3. “||”:当前面的语句执行出错时,执行后面的语句。 4. “&”:两条命令都执行,如果前面的语句为假则执行执行后面的语句,前面的语句可真可假。 5. “&&”:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真。 |
代码执行漏洞
PHP代码执行漏洞可以将代码注入到应用中,最终到webserver去执行。该漏洞主要存在于eval()、assert()、preg_replace()、call_user_func()、array_map()以及动态函数中。
漏洞成因
在Web应用中有时候程序员为了考虑灵活性、简洁性,会在代码调用eval函数(PHP函数)去处理。比如当应用在调用一些能将字符串转化成代码的函数时,没有考虑用户是否能控制这个字符串,将造成代码执行漏洞。
相关函数
eval()
将输入的字符串当做PHP代码执行
assert()
会检查指定的 assertion 并在结果为 FALSE 时采取适当的行动
call_user_func()
把第一参数作为回调函数
call_user_func_array()
调用回到函数,并把第一个数组参数作为回到函数的参数
array_map()
为数组的每个元素应用回调函数
还有一些危险函数
preg_replace()、str_replace()、call_user_func()这些函数跟eval、exec等函数地特性相同,都属于危险函数
preg_replace(mixed pattern,mixed replacement,mixed subject [,int limit]):此函数可以用来执行一个正则表达式的搜索和替换
$pattern:正则表达式匹配的内容
$replacement:用于替换的字符串或字符串数组
$subject:要搜索替换的目标字符串或字符串数组
当$pattern存在/e模式修正符,允许代码执行
漏洞危害
- 执行任意代码
- 向网站写WebShell
- 控制整个网站甚至服务器