成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python代碼審計實戰案例總結之SQL和ORM注入

安全 應用安全
Python代碼審計方法多種多樣,但是總而言之是根據前人思路的遷移融合擴展而形成。目前Python代碼審計思路,呈現分散和多樣的趨勢。

Python代碼審計方法多種多樣,但是總而言之是根據前人思路的遷移融合擴展而形成。目前Python代碼審計思路,呈現分散和多樣的趨勢。Python微薄研發經驗以及結合實際遇到的思路和技巧進行總結,以便于朋友們的學習和參考。

[[285489]]

SQL注入和ORM注入

這兩者注入相似度較高,所以打算放在一起分析和總結。它們所用原理OWASP TOP TEN 中的描述非常合適,“將不受信任的數據作為命令或查詢的一部分發送到解析器時,會產生諸如SQL注入、NoSQL注入、OS注入和LDAP注入的注入缺陷。攻擊者的惡意數據可以誘使解析器在沒有適當授權的情況下執行非預期命令或訪問數據。”。

1. SQL注入

Python 中常見存在風險SQL語句,在id或者Name可控的情況下存在安全隱患??煽貐悼梢詫⒃勖雌谕麍绦械拇a按照語法進行拼接,從而執行原本預期之外的代碼。

  1. sql = "select id,name from user_table where id = %s and name = %s" % (id, name) 
  2. cur.execute(sql) 

然而在實際案例中,這種執行SQL語句并不多,比較典型的案例。實例代碼如下:

  1. import urllib 
  2. import MySQLdb 
  3. import SocketServer 
  4. from SimpleHTTPServer import SimpleHTTPRequestHandler 
  5. class MyHandler(SimpleHTTPRequestHandler): 
  6.     def _set_headers(self): 
  7.         self.send_response(200) 
  8.         self.send_header('Content-type', 'text/html') 
  9.         self.end_headers() 
  10.     def do_GET(self): 
  11.         print("got get request %s" % (self.path)) 
  12.         hql = urllib.splitquery(self.path)[1] 
  13.         uri_c = str(hql) 
  14.         print('cmd===%s' % (uri_c)) 
  15.         sql = "select id from user_table where id = %s" % uri_c 
  16.         db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8'
  17.         cursor = db.cursor() 
  18.         cursor.execute(sql) 
  19.         data = cursor.fetchone() 
  20.         self.wfile.write(data) 
  21. def start_server(): 
  22.     httpd = SocketServer.TCPServer(("127.0.0.1", 8090), MyHandler) 
  23.     print('Starting httpd...') 
  24.     httpd.serve_forever() 
  25. if __name__ == "__main__": 
  26.     start_server() 

這是一個簡單的HTTP服務器,目前在Python2中可以正常運行。通過urllib.splitquery獲取GET請求的參數,uri_c 里面為請求參數的值。用值傳遞到SQL語句中拼接,從而產生注入問題。這是比較簡單的一種,正常情況下調用鏈可能會比較長,長短取決于平臺的設計架構。

2. ORM注入

(1) sqlalchemy ORM注入(CNVD-2019-17301)

考慮到的理解上比較容易,用模塊進行舉例,并不涉及到框架。ORM注入是SQL注入的一種特殊情況,ORM模塊將SQL語句進行模板化,所以找SQL語句字符串的辦法不好用了。那么應該怎么辦?根據模塊來找尋執行方法,如果模塊存在問題和未妥善過濾或轉義、存在可控變量則可能會產生問題。如何去發現和查找Python ORM模塊,展現朋友們搜索技能的時候到了,不再老生常談。下面進入案例:

  1. from sqlalchemy import create_engine 
  2. from sqlalchemy.orm import sessionmaker 
  3. import sqlalchemy 
  4. print("sqlalchemy_version:",sqlalchemy.__version__) 
  5. engine = create_engine('mysql://root:123456@192.168.56.101:3306/mysql?charset=utf8') 
  6. DB_Session = sessionmaker(bind=engine
  7. session = DB_Session() 
  8. session.execute('use mysql;') 
  9. print( 
  10.         session.execute( 
  11.             """ 
  12.                 select * from user where User='root' and 11=1; 
  13.             """ 
  14.     ).fetchall() 

這個是使用sqlalchemy的ORM注入,它存在任意執行SQL語句的接口。道理上講這個是功能,實際情況大多數程序員都會認為ORM是能夠防御SQL注入,這個可能會成為漏洞。通過轉義可以更好的解決問題,但是官方可能并不重視。另外還有sqlalchemy幾個問題利用order_by注入、利用”limit”和”offset”關鍵詞向”select()”函數傳遞注入等等,方法一樣利用模塊過濾不嚴,暫不多論。

(2) Django JSON SQL注入(CVE-2019-14234)

咱們繼續看來 Django JSON SQL注入,關于這個漏洞已經有前人分析過了。這個分析有些難度需要咱們了解Django和PostgreSQL,如果感覺吃力不妨先去學習一番。了解在PostgreSQL之中關于JSON數據的查詢主要使用ArrayField、JSONField、HStoreField,通過Django如何進行查詢PostgreSQL,Json.objects.filter()和QuerySet.filter()實現,準備工作就緒。

查詢使用方法如下:

  1. # 查詢方法 
  2. # 查詢data數據下名稱為test的內容為'user'的整個字段 
  3. Json.objects.filter(data__test='user'
  4. or 
  5. Json.objects.filter(**{"data__test":'user'}) 

通過補丁判斷實現方法使用了 self.key_name ,QuerySet.filter()的調用和self.key_name傳遞有關。

緊接著發現類 KeyTransformFactory 調用了 KeyTransform 傳入了 self.key_name ,后續是字符串拼接。這里不多詳細闡述感興趣的朋友跟下流程。

  1. class KeyTextTransform(KeyTransform): 
  2.     operator = '->>' 
  3.     ... 
  4.     # 字符串拼接 
  5.     (%s %s %s)" % (lhs, self.operator, lookup) 

結合注入的知識進行實施測試,結果如下。

  1. # 使用注入 
  2. # 拼接補全SQL語法 
  3. Json.objects.filter(**{"""data__breed'='"a"') OR 11=1 OR('d""":'x',}) 

總結

本次總結Python的SQL注入和ORM注入的挖掘方法和相關案例,SQL注入方面沒有找到對應的實際案例,咱們編寫簡單的案例作為參考。ORM注入為兩個案例,分別是關于模塊和框架。綜合作為實戰挖掘的參考,個人之力,恐有疏漏,盼斧正。

責任編輯:趙寧寧 來源: FreeBuf
相關推薦

2020-04-16 10:42:37

Pythonweb安全代碼審計

2019-03-13 08:56:07

JavaSpEL表達式注入

2013-12-02 09:35:10

2014-01-17 12:35:48

2018-02-10 09:44:19

2020-08-30 14:34:42

Java語言安全編碼web安全

2009-09-14 17:40:47

LINQ To SQL

2014-04-14 10:03:16

2018-12-18 09:06:07

2021-04-21 06:15:28

Serverless 云開發 Todo 案例

2023-12-11 06:27:39

MySQL線上業務優化后臺上傳文件

2022-12-06 08:29:01

2010-09-13 14:03:58

2015-07-31 09:27:56

安全編碼代碼審計Python

2020-01-16 18:30:07

技術SQL優化

2020-12-29 07:15:34

TypeScript語言代碼

2010-12-20 16:04:30

2013-04-19 10:56:54

2019-07-11 12:36:01

AR設計圖像檢測法

2009-09-28 11:42:21

KestrelScala
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 伊人啪啪网| 麻豆久久久| 毛片a级| 综合二区 | 国产精品中文字幕在线 | 久综合 | 国产一级片网站 | 狠狠爱一区二区三区 | 国产999精品久久久 精品三级在线观看 | 日韩中文在线 | 亚洲九九色 | 日韩精品极品视频在线观看免费 | 久久福利 | 亚洲在线看 | 91精品久久久久久久久久 | 国产乱精品一区二区三区 | 99精品视频一区二区三区 | h网站在线观看 | 91精品国模一区二区三区 | 精品久久久久久亚洲精品 | 日韩av一区二区在线观看 | 一级欧美一级日韩片免费观看 | 日日拍夜夜 | 欧美日韩国产在线观看 | 国产69精品久久99不卡免费版 | www.9191 | 欧美一级艳情片免费观看 | 毛片免费看 | 国产精品久久久久久一级毛片 | 久久久久久成人 | 亚洲国产精品一区二区三区 | 伊人久久综合影院 | 亚洲精品亚洲人成人网 | 欧美成人精品 | 日韩在线视频免费观看 | 国产高清视频在线观看 | 免费看国产精品视频 | 日本一区二区三区在线观看 | 污书屋| 成人精品鲁一区一区二区 | 在线日韩视频 |