当前位置:  编程技术>python

精确查找PHP WEBSHELL木马的方法(1)

    来源: 互联网  发布时间:2014-09-04

    本文导语:  先来看下反引号可以成功执行命名的代码片段。代码如下: 代码如下: `ls -al`; `ls -al`; echo "sss"; `ls -al`; $sql = "SELECT `username` FROM `table` WHERE 1"; $sql = 'SELECT `username` FROM `table` WHERE 1' /* 无非是 前面有空白字符,或者在一行代码的结...

先来看下反引号可以成功执行命名的代码片段。代码如下:
代码如下:

`ls -al`;
`ls -al`;
echo "sss"; `ls -al`;
$sql = "SELECT `username` FROM `table` WHERE 1";
$sql = 'SELECT `username` FROM `table` WHERE 1'
/*
无非是 前面有空白字符,或者在一行代码的结束之后,后面接着写,下面两行为意外情况,也就是SQL命令里的反引号,要排除的就是它。
*/

正则表达式该如何写?
分析:
对于可移植性的部分共同点是什么?与其他正常的包含反引号的部分,区别是什么?
他们前面可以有空格,tab键等空白字符。也可以有程序代码,前提是如果有引号(单双)必须是闭合的。才是危险有隐患的。遂CFC4N给出的正则如下:【(?:(?:^(?:s+)?)|(?:(?P["'])[^(?P=quote)]+?(?P=quote)[^`]*?))`(?P[^`]+)`】。
解释一下:
【(?:(?:^(?:s+)?)|(?:(?P["'])[^(?P=quote)]+?(?P=quote)[^`]*?))】
匹配开始位置或者开始位置之后有空白字符或者前面有代码,且代码有闭合的单双引号。(这段PYTHON的正则中用了捕获命名以及反向引用)
【`(?P[^`]+)`】这个就比较简单了,匹配反引号中间的字符串。

某检测PHP webshell的python脚本考虑欠佳。
再看看下一个列表的第一个元素。【(system|shell_exec|exec|popen)】,这个正则的意思是只要字符串里包含“system”、“shell_exec”、“exec”、“popen”这四组字符串即判定为危险字符。很明显,这个方法太不严谨。如果程序员写的代码中,包含了这四组字符,即可被判定为危险函数。很不准确,误报率极高。见下图

某检测PHP webshell的python脚本考虑欠佳。
到底什么样的代码是可疑的代码?关键词是什么?

可疑的代码肯定是由可以执行危险操作的函数构成,可以执行危险操作的PHP函数最重要的就是“eval”函数了,对于加密的PHP代码(仅变形字符串,非zend等方式加密),肯定要用到“eval”函数,所以,对于不管是用哪种加密方法的代码,肯定要用到“eval”函数。其次就是可以执行系统命令的函数了,比如上面某牛的代码中提到的四个“system”、“shell_exec”、“exec”、“popen”。当然还有其他的,比如passthru等。PHP还支持“·”字符(ESC键下面那个)直接执行系统命令。我们可以把正则写成这样【b(?Peval|proc_open|popen|shell_exec|exec|passthru|system)bs*(】。

检测PHP webshell的python脚本相对较为严谨的匹配
解释一下:

大家都知道【bb】用来匹配单词两边的位置的。要保证【bb】中间的是单词,即使函数名前面加特殊字符,也一样通过匹配,比如加@来屏蔽错误。后面的【s*】用来匹配空白字符的,包括空格,tab键,次数为0到无数次。前面的【(?P)】是捕获命名组。用来当作python代码直接引用匹配结果的key。

还有的网友提到了,如果我把代码放到图片拓展名的文件里呢?那你只检测.php,.inc的文件,还是找不到我的呀。嗯,是的,如果恶意代码在gif、jpg、png、aaa等乱七八糟的拓展名文件里,是不能被apache、IIS等web Services解析的,必须通过include/require(_once)来引入。那么,我们只要匹配include/require(_once)后面的文件名是不是常规的“.php”、“.inc”文件。如果不是,则为可疑文件。正则如下【(?Pb(?:include|require)(?:_once)?b)s*(?s*["'](?P.*?(?b(?:include|require)(?:_once)?b)s*(?s*["'](?P.*?(?

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • SQL查找某一条记录的方法
  • grep不查找隐藏文件的方法
  • Linuc中C函数查找方法
  • 内存泄露和段错误的查找的好方法
  • RedHat 下查找文件的方法?(不好意思,只能给21pts)
  • mssql查找备注(text,ntext)类型字段为空的方法
  • js查找某元素中的所有图片地址的方法
  • 在CMP的实体BEAN中怎么添加用户自定义的查找方法
  • C# 递归查找树状目录实现方法
  • php查找任何页面上的所有链接的方法
  • 查找oracle数据库表中是否存在系统关键字的方法
  • 请教,在RHLinux9 下 如何查找某个隐藏目录. ls -a一个一个查太麻烦,有快一点的方法吗?
  • 在jsp或java中有没有查找子串在父串中位置的通用方法?
  • ejb中的实体bean要不要实现查找方法 “select * from name where name='name'"
  • WinForm实现按名称递归查找控件的方法
  • C#中查找Dictionary中重复值的方法
  • 各位高手:java中查找字符串并替换用什么方法?
  • jquery中的查找parents与closest方法之间的区别
  • 查找php配置文件php.ini所在路径的二种方法
  • linux c 查找使用库的cflags与libs的方法详解
  • C++ Strings(字符串) 成员 rfind():查找最后一个与value相等的字符(逆向查找)
  • Linux查找包含指定文字的文件(linux查找指定文件)
  • C++ Maps 成员 find():查找一个元素
  • php顺序查找与二分查找实例
  • C++ MultiMaps 成员 find():查找元素
  • php顺序查找和二分查找示例
  • C++ Strings(字符串) 成员 find():在字符串中查找字符
  • 在unix查找某个目录下一小时前的生成的文件,怎么查找?find只能按天来查。
  • C++ Strings(字符串) 成员 find_first_of():查找第一个与value中的某值相等的字符
  • vim怎么查找并替换 “[bx][si]”呢。。貌似是因为两个中括号连在一起查找不到。。
  • C++ Strings(字符串) 成员 find_last_of():查找最后一个与value中的某值相等的字符


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3