欢迎来到天天文库
浏览记录
ID:38344410
大小:22.34 KB
页数:7页
时间:2019-06-10
《php escapeshellcmd多字节编码漏洞解析及延伸》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、phpescapeshellcmd多字节编码漏洞解析及延伸 PHP5<=5.2.5 PHP4<=4.4.8 一些允许如GBK,EUC-KR,SJIS等宽字节字符集的系统都可能受此影响,影响还是非常大的,国内的虚拟主机应该是通杀的,在测试完这个漏洞之后,发现还是十分有意思的,以前也有过对这种类型安全漏洞的研究,于是就把相关的漏洞解释和一些自己的想法都写出来,也希望国内的一些有漏洞的平台能迅速做出响应,修补漏洞。 这个漏洞出在php的用来转义命令行字符串的函数上,这些函数底层是用的php_escape_
2、shell_cmd这个函数的,我们先来看看他的处理过程:/*{{{php_escape_shell_cmd Escapeallcharsthatcouldpossiblybeusedto breakoutofashellcommand Thisfunctionemalloc'sastringandreturnsthepointer. Remembertoefreeitwhendonewithit. *NOT*safeforbinarystrings*/ char*php_escape_shell_cmd
3、(char*str){ registerintx,y,l; char*cmd; char*p=NULL; l=strlen(str); cmd=safe_emalloc(2,l,1); for(x=0,y=0;x4、l-x-1))){ /*noop*/ }elseif(p&&*p==str[x]){ p=NULL; }else{ cmd[y++]='\'; } cmd[y++]=str[x]; break; #endif case'#':/*This5、ischaracter-setindependent*/ case'&': case';': case'`': case'6、': case'*': case'?': case'~': case'<': case'>': case'^': case'(': case7、')': case'[': case']': case'{': case'}': case'$': case'\': case'x0A':/*excludingthesetwo*/ case'xFF':#ifdefPHP_WIN32 /*sinceWindowsdoesnotallowustoescapethesechar8、s,justremovethem*/ case'%': cmd[y++]=''; break;#endif cmd[y++]='\'; /*fall-through*/ default: cmd[y++]=str[x]; } } cmd[y]=' '; returncmd;}/*}}}*/ 9、可以看到,php通过将",',#,&,;.....等等在shell命令行里有特殊意义的字符都通过在前面加上变成".',#,&,;......来进行转义,使得用户的输入被过滤,来避免产生commandinjection漏洞。在php看来,只要过滤了这些字符,送入到system等函数中时,参数就
4、l-x-1))){ /*noop*/ }elseif(p&&*p==str[x]){ p=NULL; }else{ cmd[y++]='\'; } cmd[y++]=str[x]; break; #endif case'#':/*This
5、ischaracter-setindependent*/ case'&': case';': case'`': case'
6、': case'*': case'?': case'~': case'<': case'>': case'^': case'(': case
7、')': case'[': case']': case'{': case'}': case'$': case'\': case'x0A':/*excludingthesetwo*/ case'xFF':#ifdefPHP_WIN32 /*sinceWindowsdoesnotallowustoescapethesechar
8、s,justremovethem*/ case'%': cmd[y++]=''; break;#endif cmd[y++]='\'; /*fall-through*/ default: cmd[y++]=str[x]; } } cmd[y]=' '; returncmd;}/*}}}*/
9、可以看到,php通过将",',#,&,;.....等等在shell命令行里有特殊意义的字符都通过在前面加上变成".',#,&,;......来进行转义,使得用户的输入被过滤,来避免产生commandinjection漏洞。在php看来,只要过滤了这些字符,送入到system等函数中时,参数就
此文档下载收益归作者所有