天天看點

sqlmap檢測SQL注入及解決方案(Django)--超詳細

一:場景、示範

場景:查詢等拼接SQL和參數的問題,部落客為了示範,這裡寫一個有注入風險的接口,請勿模仿

class PostMan(View):

    def get(self, request):
        aa = request.GET.get('aa')
        with connections['default'].cursor() as cursor:
            sql = 'select * from sys_dict where pid = %s'%(aa)
            cursor.execute(sql)
            result = cursor.fetchall()
            print(result)
        return api_response(code=200,msg='aaa',data=result)
           

二:注入測試,這裡采用sqlmap檢測(通過postman等傳入" or 1=1 or " 也能看到效果)。

  1. sqlmap安裝及測試:github 下載下傳安裝包,解壓,進入sqlmap.py同級目錄,輸入以下指令測試
python sqlmap.py -hh
           
sqlmap檢測SQL注入及解決方案(Django)--超詳細

2. 注入檢測,-u 後跟的是視圖對應的接口位址

  1. 注入結果檢視,終端檢視輸出資訊或根據日志中的output位置 檢視相應日志,如圖
sqlmap檢測SQL注入及解決方案(Django)--超詳細

危害極大,還可以查詢所有表,庫,dump資料等,不再贅述,指令可以參考這篇部落格sqlmap常見指令

二:Django中sql注入解決方案,主要以下四種:

  1. 參數化查詢,文法如下
sql = '''select * from shixiang_table where id= "%s" limit 10'''
cursor.execute(sql, [pk])
print(data_count)
           
  1. 使用ORM元件,flask的sqlalchemy,django的orm

    使用orm filter等進行查詢操作

  2. 資料庫最小權限原則,滿足業務需求的最小權限,如隻讀賬号等
  3. 危險字元過濾

    主要過濾兩類字元:(1)一些SQL中的标點符号,如@,*以及單引号等等;(2)過濾資料庫關鍵字insert、delete from、drop table、truncate、mid、delete、update、truncate、declare、master、script、exec、net user、drop等關鍵字或者關鍵詞。