常见的webshell检测方法及绕过思路

上传人:简****9 文档编号:109667534 上传时间:2019-10-27 格式:DOCX 页数:12 大小:78.03KB
返回 下载 相关 举报
常见的webshell检测方法及绕过思路_第1页
第1页 / 共12页
常见的webshell检测方法及绕过思路_第2页
第2页 / 共12页
常见的webshell检测方法及绕过思路_第3页
第3页 / 共12页
常见的webshell检测方法及绕过思路_第4页
第4页 / 共12页
常见的webshell检测方法及绕过思路_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《常见的webshell检测方法及绕过思路》由会员分享,可在线阅读,更多相关《常见的webshell检测方法及绕过思路(12页珍藏版)》请在金锄头文库上搜索。

1、常见的webshell检测方法及绕过思路一句话webshell基本结构:两个步骤:数据的传递、执行所传递的数据数据的传递&绕过检测对于数据的传递,我们通常的做法是$_GET/$_POST/$_SERVER/$_COOKIE等获取客户端数据,但是这类关键词直接出现的话,可以很容易回溯到,我们有以下集中方案来解决:1. 利用本身所在的框架2.利用变种:$“_G”.”ET”。不过这种不过这种方式也有自身的缺点,可以跟踪“$”;不过这种跟踪又可以通过“$/*a*/”这种方式绕过(当然其又有被跟踪的可能性)。3.使用其他数据获取方式来获取数据,譬如$_REQUEST、$GLOBALS“_GET”、$_F

2、ILE等。4. 人为构造语言缺陷或应用漏洞,并且这种缺陷是不易察觉的,譬如伪造管理员session等。数据执行&绕过检测对于数据执行,我们通常使用的函数或方式有:eval、create_function、exec、preg_replace等。当然这类关键词如果直接出现的话,我们的自动化webshell检测脚本可以很轻易的进行识别,目前看我们可以绕过检测的方案较少:1、通过$a()这种方式来执行函数。不过这种方式也有自身规律在里面,有很多扫描器已经内置了“$.*($.*”这种规则,同样我们可以通过$a/*a*/()这种方式以及相应的变通方式来绕过。(当然其又有被跟踪的可能性)2、尝试去找到不在黑

3、名单中的函数,或者极其常见的函数。两句话webshell$a = $_GETa;eval($a);这没有任何意义。而是说采取一些方式,隐藏数据传递者和数据执行者。这里简单举一个例子,譬如我们在a.php中插入了这样的代码,以便在必要时生成一个shell文件:file_put_contents(“/home/www/abc.txt”, str_rot13 (some code already encode);然后我们在b.php中再实现一个数据执行者,最简单的莫过于:include “/home/www/abc.txt”;此外我们还可以使用virtual、php_check_syntax、arr

4、ay_filter、array_map、array_walk、call_user_func、preg_replace、usort等一般不在黑名单中的函数来绕过shell脚本检测,或者直接在应用代码中找上述的函数,看其所引用的变量是否可以稍加改变变成我们的数据提供者。所以我们看出“两句话”与一句话webshell的最大的区别在于不构造新的数据执行者或者可以完全隐匿数据执行者(利用已有的代码逻辑等),仅通过变换或构造数据提供者的前提下完成shell的功能。而$_GET、$_POST、$_SERVER、$_COOKIE、$_FILE、$_REQUEST、$GLOBALS“_GET”、$/*hello

5、*/_G.ET都是我们的数据传送者;file_get_contents、file、file_put_contents甚至print_r、unserialize都可以隐匿我们要传输的数据。当然扫描代码隐患的工具(譬如Rips)肯定能够扫描到这些隐患,但是这类工具毕竟不是用于扫描webshell的,且误报率是相当的高。逻辑后门当然如上的利用方式中还是少不了特殊的函数的存在的。因此除此之外,我们可以尝试留下另一种后门:逻辑后门,譬如: $value) /由攻击者添加 $key = $value;/ . some codeif (logged_in() | $authenticated) /原有逻辑/

6、 . administration area?变种加密webshell:还有从http:/ (isset($_REQUESTasc)eval(stripslashes($_REQUESTasc);wp_theme_icon=create_function(”,file_get_contents(/path/wp-content/themes/themename/images/void.jpg);$wp_theme_icon();$auth_pass = “63a9f0ea7bb98050796b649e85481845;$color = “#df5;$default_action = “SQL

7、”;$default_charset = “Windows-1251;$protectionoffer = “ficken”;preg_replace(“/.*/e”,x65x76x61x6C.);?php $XKsyG=as;$RqoaUO=e;$ygDOEJ=$XZKsyG.s.$RqoaUO.r.t;$joEDdb=b.$XZKsyG.$RqoaUO.(64)._.d.$RqoaUO.c.o.d.$RqoaUO;$ygDOEJ($joEDdb(ZXZhbChiYXNlNjRfZGVjb2RlKCJhV1lvYVhOelpY还有某人发现的:$k = $phpinfo();从上述的这些she

8、ll中我们已经能找到规律,虽然我们没有非常完善的办法定位数据传递这个步骤,但是我们能比较方便地找到数据执行的位置:“(”。从我目前掌握的情况来看,一个数据执行(当然include这几个和“”反引号执行另作考虑)的基本条件一定会包含这个小括号,如果哪位大牛有什么可以在代码中不使用小括号就可以达到代码执行的方法,请一定不吝赐教。所以我们可以很容易的做出我们的webshell检测方法:使用token_get_all将php代码打成token,然后找到每一个”(”,判断括号前面的数据是不是合法的即可。至于如何判断合法,我们遵循一个原则:如果是空格、注释之类,则采取忽略方式(即continue,继续往前

9、判断);如果是分支、条件判断或运算符,则我们认为是合法的;如果是字符串,并且在黑名单,我们认为是非法的,否则是合法的;如果不满足上述条件,我们先暂认为是非法的(通过此项不断完善我们的配置和算法)。两句话webshell$a = $_GETa;eval($a);这没有任何意义。而是说采取一些方式,隐藏数据传递者和数据执行者。这里简单举一个例子,譬如我们在a.php中插入了这样的代码,以便在必要时生成一个shell文件:file_put_contents(“/home/www/abc.txt”, str_rot13 (some code already encode);然后我们在b.php中再实现

10、一个数据执行者,最简单的莫过于:include “/home/www/abc.txt”;此外我们还可以使用virtual、php_check_syntax、array_filter、array_map、array_walk、call_user_func、preg_replace、usort等一般不在黑名单中的函数来绕过shell脚本检测,或者直接在应用代码中找上述的函数,看其所引用的变量是否可以稍加改变变成我们的数据提供者。所以我们看出“两句话”与一句话webshell的最大的区别在于不构造新的数据执行者或者可以完全隐匿数据执行者(利用已有的代码逻辑等),仅通过变换或构造数据提供者的前提下完成

11、shell的功能。而$_GET、$_POST、$_SERVER、$_COOKIE、$_FILE、$_REQUEST、$GLOBALS“_GET”、$/*hello*/_G.ET都是我们的数据传送者;file_get_contents、file、file_put_contents甚至print_r、unserialize都可以隐匿我们要传输的数据。当然扫描代码隐患的工具(譬如Rips)肯定能够扫描到这些隐患,但是这类工具毕竟不是用于扫描webshell的,且误报率是相当的高。基于上述理论,我们实现我们的算法如下(其中部分代码做省略处理,如需完整代码,请见后面链接):?phpfinal class

12、 Confpublic static $strict = false;/有可能有危害的函数public static $vul_func = array(create_function, eval, . usort);public static $allow_chars = array(.,=,+,-,*,/,%,&,|,!,);/无危害的token类型public static $allow_type = array(T_AND_EQUAL,T_BOOLEAN_AND,.T_SWITCH);/需要被忽略的token类型public static $ignore_type = array(T_

13、WHITESPACE,T_COMMENT,T_DOC_COMMENT,);function check_callable($code)$token = token_get_all($code);$vul = array();$flag = false;for($i=0;$i0;$i-)if(is_array($token$i)if(in_array($token$i1,Conf:$vul_func) if(Conf:$strict)/严格检验if(has_varparam($token,$idx+1) return $token$i;/从“(”开始return false;return $token$i;if(in_array($token$i0,Conf:$ignore_type) continue;if

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号