命令执行及代码执行漏洞

命令执行漏洞

 

由于开发人员编写源码,没有针对代码中可执行的特殊函数入口做过滤,导致客户端可以提交恶意构造语句提交,并交由服务器端执行。命令注入攻击中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
  • 控制整个网站甚至服务器

 

posted @ 2021-01-19 20:41  夜布多  阅读(1121)  评论(0编辑  收藏  举报