自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

【干貨】Python自動化審計及實現(xiàn)

開發(fā) 后端 自動化
Python由于其簡單,快速,庫豐富的特點在國內(nèi)使用的越來越廣泛,但是一些不好的用法卻帶來了嚴重的安全問題,本文從Python源碼入手,分析其語法樹,跟蹤數(shù)據(jù)流來判斷是否存在注入點。

[[197554]]

Python由于其簡單,快速,庫豐富的特點在國內(nèi)使用的越來越廣泛,但是一些不好的用法卻帶來了嚴重的安全問題,本文從Python源碼入手,分析其語法樹,跟蹤數(shù)據(jù)流來判斷是否存在注入點。

0x01 引言

Python注入問題是說用戶可以控制輸入,導致系統(tǒng)執(zhí)行一些危險的操作。它是Python中比較常見的安全問題,特別是把python作為web應(yīng)用層的時候這個問題就更加突出,它包括代碼注入,OS命令注入,sql注入,任意文件下載等。

0x02 注入的場景

主要是在web應(yīng)用場景中,用戶可直接控制輸入?yún)?shù),并且程序未做任何參數(shù)判斷或者處理,直接就進入了危險函數(shù)中,導致執(zhí)行一些危險的操作。主要的注入類型有:

(一)OS命令注入

主要是程序中通過Python的OS接口執(zhí)行系統(tǒng)命令,常見的危險函數(shù)有

os.system,os.popen,commands.getoutput,commands.getstatusoutput,subprocess

等一些接口。例如:def myserve(request,fullname):os.system('sudo rm -f %s'%fullname),fullname是用戶可控的,惡意用戶只需利用shell的拼接符;就可以完成一次很好的攻擊。

(二)代碼注入

是說在注入點可以執(zhí)行一段代碼,這個一般是由python的序列話函數(shù)eval導致的,例如:def eval_test(request,login):login = eval(login),如果惡意用戶從外界傳入import('os').system('rm /tmp -fr')就可以清空tmp目錄。

(三)Sql注入

在一般的Python web框架中都對sql注入做了防護,但是千萬別認為就沒有注入風險,使用不當也會導致sql注入。例如:

def getUsers(user_id):sql = ‘select * from auth_user where id =%s’%user_idres = cur.execute(sql)

(四)任意文件下載

程序員編寫了一個下載報表或者任務(wù)的功能,如果沒有控制好參數(shù)就會導致任意文件下載,例如:def export_task(request,filename):return HttpResponse(fullname)

0x03 判斷原理

從以上四種情況來看,都有一個共同點,那就是危險函數(shù)中使用了可控參數(shù),如system函數(shù)中使用到的('sudo rm -f %s'%fullname),如eval中使用到的login參數(shù),如execute函數(shù)中使用到的user_id參數(shù),如HttpResponse中使用到的fullname參數(shù),這些參數(shù)直接從函數(shù)中傳進來,或者經(jīng)過簡單的編碼,截斷等處理直接進入危險函數(shù),導致了以上危險行為。如果在執(zhí)行危險函數(shù)前對這些可控參數(shù)進行一定判斷,如必須是數(shù)字,路徑必須存在,去掉某些特殊符號等則避免了注入問題。 有了這個基礎(chǔ)理論,這個參數(shù)數(shù)據(jù)在傳遞的過程中到底有沒有改變?怎么順利的跟蹤可控參數(shù)呢?接下來分析Python的語法樹。

0x04 Python語法樹

很顯然,在參數(shù)不停傳遞過程中,普通的正則表達式已經(jīng)無能為力了。這個時候就可以體現(xiàn)Python庫豐富的特點。Python官方庫中就提供了強大的Python語法分析模塊ast。我們可以利用根據(jù)ast優(yōu)化后的PySonar模塊,PySonar相對于ast模塊而言有性能上的提升,另外是以Python的dict來表示的。

(一)語法樹的表示-文件

一個文件中可以有函數(shù),類,它是模塊的組成單位。大體結(jié)構(gòu)如下:{"body":[{},{}],"filename":"test.py","type":"module"},這是文件test.py得到的語法樹結(jié)構(gòu),body里面包含兩個dict,實際里面會存放函數(shù),類,全局變量或者導入等,它是遞歸嵌套的,type字段表明類型,在這里是模塊,filename則是它的文件名。

(二)語法樹的表示-函數(shù)

函數(shù)的作用就不用多說了,django的view層基本都是以函數(shù)為單位的。下面來看一個函數(shù)的語法樹,如圖:

我們簡單分析一下這個結(jié)構(gòu),首先是type,這里是FunctionDef,說明這個結(jié)構(gòu)體是一個函數(shù),_fields中的name,args,body,decorator_list等是函數(shù)的基本組成單位。name是函數(shù)名稱,上述函數(shù)名為is_this_subdomain;args是函數(shù)的參數(shù),它包含普通參數(shù)args,默認參數(shù)kwarg;lineno是標明該語句所在的文件的行數(shù);decorator_list則是函數(shù)的修飾器,上述為空。

(三)語法樹的表示-類

在類的語法樹中,包含body,decorator_list,lineno,name,base等字段type是ClassDef,表明該結(jié)構(gòu)為class,body中則包含著函數(shù)的結(jié)構(gòu)體,base則是繼承的父類。

(四)語法樹的表示-示例

接下來我們將以一個if結(jié)構(gòu)片段代碼作為示例,來解釋Python源碼到其語法樹的對應(yīng)關(guān)系。片段代碼:if type not in ["RSAS", "BVS"]:return HttpResponse("2"),得到的語法樹如圖2:

在這個語法樹結(jié)構(gòu)中,body里包含著if結(jié)構(gòu)中的語句return HttpResponse("2"),type為Compare表示該結(jié)構(gòu)體為判斷語句,left表示左值即源碼中的type,test結(jié)構(gòu)體中則是用來進行if判斷,test中的ops對應(yīng)著源碼中的not in,表示比較判斷,comparators則是被比較的元素。這樣源碼就和Python語法樹一一對應(yīng)起來,有了這些一一對應(yīng)的基礎(chǔ),就有了判斷Python注入問題的原型。

0x05 注入判斷的實現(xiàn)

注入判斷的核心就在于找到危險函數(shù),并且判斷其參數(shù)是可控的,找到危險函數(shù)這個只需要維護一個危險函數(shù)列表即可,當在語法樹中發(fā)現(xiàn)了函數(shù)調(diào)用并且其名稱在危險列表中就可以標記出該行代碼,接下來的難點就在于跟蹤該函數(shù)的參數(shù),默認認為該危險函數(shù)的外層函數(shù)的參數(shù)是可控的,那就只需要分析這個外層函數(shù)參數(shù)的傳遞過程即可。首先分析哪些情況下,從一個參數(shù)賦值給另外一個參數(shù)其值還是可控的,下面列舉了5中基本情況:

(1)屬性取值:對一個變量取屬性,比如request的GET,POST,FILES屬性,屬性的屬性還是可控的,但是request的其他字段如META,user,session,url則得排查開外。 (2)字符串拼接:被拼接的字符串中包含可控參數(shù),則認為賦值后的值也是可控的,需要考慮好各種拼接情況,如使用+,%等進行拼接。 (3)分片符取值:一般認為分片后的值也是可控的。 (4)列表解析式,如果列表解析式基于某個可控因子進行迭代,則認為賦值后的列表也是可控的。 (5)簡單的函數(shù)處理:a,處理函數(shù)是字符串操作函數(shù)(str,unicode,strip,encode等);b,簡單的未過濾函數(shù),也就是說這個函數(shù)的返回參數(shù)是可控的。

對外層函數(shù)中的所有代碼行進行分析,判斷是否是賦值類型,如果賦值類型的操作屬于以上五種情況中任意一種,則將該賦值后的值放入可變參數(shù)列表中,具體的流程如圖3:

另外在分析的過程中還得排除下列情況,提前結(jié)束分析。第一種情況是 if語句中有os.path.exitst,isdigit帶可控參數(shù)并且含有return語句,如(if not os.path.isdir(parentPath):return None);第二種情況是將可控參數(shù)鎖定在某個定值范圍并直接返回的,如(if type not in ["R", "B"]:return HttpResponse("2"))。

0x06 結(jié)束語

對Python源碼實現(xiàn)注入問題的自動審查,大大降低了人為的不可控性,使代碼暴露出來的漏洞更少。當然目前來說這個模塊還是有一定局限性,對類的處理不夠充分,沒有分析導入的函數(shù)對屬性的取值也不夠細分等問題。 

責任編輯:龐桂玉 來源: 馬哥Linux運維
相關(guān)推薦

2015-06-03 09:07:46

白盒審計PHPPHP自動化審計

2022-12-01 09:12:49

CodeQL自動化審計

2023-12-25 09:52:32

2017-04-10 12:25:32

iOS自動化測試

2010-03-03 16:36:02

Python PAMI

2020-03-18 09:23:24

Python數(shù)據(jù)SQL

2018-05-10 15:54:39

2015-10-21 15:08:25

電纜自動化

2016-04-12 10:18:19

代碼審計自動化代碼審計工具

2022-07-05 08:26:10

Python報表自動化郵箱

2017-12-17 21:58:18

2024-06-11 10:41:14

2019-10-31 09:59:36

大數(shù)據(jù)Hadoop大數(shù)據(jù)集群

2018-05-11 08:29:10

Python自動化測試數(shù)據(jù)驅(qū)動

2018-08-31 09:55:38

Ansible網(wǎng)絡(luò)自動化

2023-04-06 07:09:25

自動化部署Actions

2022-11-15 17:07:40

開發(fā)自動化前端

2010-09-27 09:13:36

Visual Stud

2023-02-15 08:21:22

2009-09-04 13:55:04

C#文檔自動化
點贊
收藏

51CTO技術(shù)棧公眾號