滲透攻防Web篇-深入淺出SQL註入

来源:https://www.cnblogs.com/Jcloud/archive/2022/08/26/16626772.html
-Advertisement-
Play Games

1 背景 京東SRC(Security Response Center)收錄大量外部白帽子提交的sql註入漏洞,漏洞發生的原因多為sql語句拼接和Mybatis使用不當導致。 2 手工檢測 2.1 前置知識 mysql5.0以上版本中存在一個重要的系統資料庫information_schema,通過 ...


1 背景

京東SRC(Security Response Center)收錄大量外部白帽子提交的sql註入漏洞,漏洞發生的原因多為sql語句拼接和Mybatis使用不當導致。

2 手工檢測

2.1 前置知識

mysql5.0以上版本中存在一個重要的系統資料庫information_schema,通過此資料庫可訪問mysql中存在的資料庫名、表名、欄位名等元數據。information_schema中有三個表成為了sql註入構造的關鍵。

1)infromation_schema.columns:
  • table_schema 資料庫名
  • table_name 表名
  • column_name 列名
2)information_schema.tables
  • table_schema 資料庫名
  • table_name 表名
3)information_schema.schemata
  • schema_name 資料庫名

SQL註入常用SQL函數

  • length(str) :返回字元串str的長度
  • substr(str, pos, len) :將str從pos位置開始截取len長度的字元進行返回。註意這裡的pos位置是從1開始的,不是數組的0開始
  • mid(str,pos,len) :跟上面的一樣,截取字元串
  • ascii(str) :返回字元串str的最左面字元的ASCII代碼值
  • ord(str) :將字元或布爾類型轉成ascll碼
  • if(a,b,c) :a為條件,a為true,返回b,否則返回c,如if(1>2,1,0),返回0

2.2 註入類型

2.2.1 參數類型分類
  • 整型註入
    例如?id=1,其中id為註入點,類型為int類型。

  • 字元型註入
    例如?id=”1”,其中id為註入點,類型為字元型,要考慮閉合後端sql語句中的引號。

2.2.2 註入方式分類
  • 盲註
    • 布爾盲註:只能從應用返回中推斷語句執行後的布爾值。
    • 時間盲註:應用沒有明確的回顯,只能使用特定的時間函數來判斷,例如sleep,benchmark等。
  • 報錯註入:應用會顯示全部或者部分的報錯信息
  • 堆疊註入:有的應用可以加入 ; 後一次執行多條語句
  • 其他

2.3 手動檢測步驟(字元型註入為例)

// sqli vuln code
Statement statement = con.createStatement();
String sql = "select * from users where username = '" + username + "'";
logger.info(sql);
ResultSet rs = statement.executeQuery(sql);
// fix code 如果要使用原始jdbc,請採用預編譯執行
String sql = "select * from users where username = ?";
PreparedStatement st = con.prepareStatement(sql);

 

使用未預編譯原始jdbc作為demo,註意此demo中sql語句參數採用單引號閉合。

2.3.1 確定註入點

對於字元類型註入,通常先嘗試單引號,判斷單引號是否被拼接到SQL語句中。推薦使用瀏覽器擴展harkbar作為手工測試工具。https://chrome.google.com/webstore/detail/hackbar/ginpbkfigcoaokgflihfhhmglmbchinc

正常頁面應該顯示如下:

admin後加單引號導致無信息回顯,原因是後端sql執行報錯,說明引號被拼接至SQL語句中

  1. select * from users where username = 'admin' #正常sql
  2. select * from users where username = 'admin'' #admin'被帶入sql執行導致報錯無法顯示信息
2.3.2 判斷欄位數

mysql中使用order by 進行排序,不僅可以是欄位名也可以是欄位序號。所以可以用來判斷表中欄位數,order by 超過欄位個數的數字就會報錯。

判斷欄位數

當order by 超過4時會報錯,所以此表共四個欄位。

後端所執行的sql語句

select * from users where username = 'admin' order by 1-- '

 

此處我們將原本username的值admin替換為admin’ order by 1 —+,其中admin後的單引號用於閉合原本sql語句中的前引號,—+用於註釋sql語句中的後引號。—後的+號主要作用是提供一個空格,sql語句單行註釋後需有空格,+會被解碼為空格。

2.3.3 確定回顯位置

主要用於定位後端sql欄位在前端顯示的位置,採用聯合查詢的方式確定。註意聯合查詢前後欄位需一致,這也就是我們為什麼做第二步的原因。

通過下圖可知,後端查詢並回顯的欄位位置為2,3位。

聯合查詢後的欄位可以隨意,本次採用的是數字1到4直觀方便。

2.3.4 利用information_schema庫實現註入

group_concat()函數用於將查詢結果拼接為字元串。

  • 查看存在資料庫

  • 查看當前資料庫中的表

  • 查看指定表中欄位

  • 利用以上獲取信息讀取users表中username和password

3 自動化檢測

3.1 sqlmap 使用

sqlmap相容python2和python3,可以自動化檢測各類註入和幾乎所有資料庫類型。

3.1.1 常用命令
-u 可能存在註入的url鏈接
-r讀取http數據包
--data 指定post數據
--cookie 指定cookie
--headers 指定http頭 如採用token認證的情況下
--threads 指定線程數
--dbms 指定後端的資料庫
--os 指定後端的操作系統類型
--current-user 當前用戶
--users 所有用戶
--is-dba 是否是dba
--sql-shell 互動式的sqlshell
-p指定可能存在註入點的參數
--dbs 窮舉系統存在的資料庫
-D指定資料庫
--tables 窮舉存在的表
-T指定表
--column 窮舉欄位
-C指定欄位
--dump dump數據

 

直接檢測
其中—cookie用於指定cookie,—batch 自動化執行,—dbms指定資料庫類型

檢測結果

讀取系統中存在資料庫
—dbs讀取當前用戶下的資料庫

讀取指定庫下的表
-D java_sec_code —tables

dump users表數據
-D java_sec_code -T users —dump

4 進階

4.1 Mybatis註入
1)$錯誤使用導致註入
//採用#不會導致sql註入,mybatis會使用預編譯執行
@Select("select * from users where username = #{username}")
User findByUserName(@Param("username") String username);
//採用$作為入參可導致sql註入
@Select("select * from users where username = '${username}'")
List<User> findByUserNameVuln01(@Param("username") String username);

 

2)模糊查詢拼接
//錯誤寫法
<select id="findByUserNameVuln02" parameterType="String" resultMap="User">
select * from users where username like '%${_parameter}%'
</select>
//正確寫法
<select id="findByUserNameVuln02" parameterType="String" resultMap="User">
select * from users where username like concat(‘%’,#{_parameter}, ‘%’)
</select>

 

3)order by 註入

order by 後若使用#{}會導致報錯,因為#{}預設添加引號會導致找不到欄位從而報錯。

//錯誤寫法
<select id="findByUserNameVuln03" parameterType="String" resultMap="User">
select * from users
<if test="order != null">
order by ${order} asc
</if>
</select>
//正確寫法 id指欄位id 此表欄位共四個 所以id為1-4
<select id="OrderByUsername" resultMap="User">
select * from users order by id asc limit 1
</select>

 

以上測試均在本地進行,請勿未授權進行滲透測試

5 文章及資料推薦

slqmap手冊:https://octobug.gitbooks.io/sqlmap-wiki-zhcn/content/Users-manual/Introduction.html
sql註入詳解:http://sqlwiki.radare.cn/#/

 
作者:羅宇(物流安全小分隊)

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

-Advertisement-
Play Games
更多相關文章
  • Jetpack Joyride 2瘋狂噴氣機是一款非常經典有趣的橫版射擊游戲,游戲畫風Q萌,具有新的高清圖形、新動畫、新機制和新的游戲方式,游戲非常易上手,只需用滑鼠點擊屏幕即可,目標是躲避障礙,儘可能長時間地生存,並獲得大量金幣,非常受網友歡迎! 詳情:Jetpack Joyride 2(瘋狂噴氣 ...
  • NCH Prism Plus for mac是一款Mac視頻格式轉換器,NCH Prism Plus mac版輕鬆轉換視頻!Prism轉換avi,mpg,vob,asf,wmv,mp4,amv以及所有具有基於DirectShow的編解碼器的視頻格,如果您可以使用Prism Plus mac版下載播放 ...
  • 未完待續...... 把一些有用的命令記錄下來,後期需要用到的時候就過來查詢吧。這篇文章沒啥營養,就當個字典用吧。 查看當前登錄用戶 w 查看登錄用戶數、IP、運行命令 查看進程 top 最常用的方法 查看所有進程 ps 兩個命令功能一樣的,寫法不一樣而已; ps aux # BSD操作系統格式 參 ...
  • Texpad是一個LaTeX編輯軟體,Texpad(現更名為 Texifier),Texpad 在與 LaTeX 同等的基礎上支持 Markdown,專為任何規模的項目的直接導航、編輯和排版而設計,使用 Texpad 內置的 TexpadTeX 排版機進行即時實時排版,並且Texpad 的編輯器具有 ...
  • 第一章 (p1-p10) 1、安裝環境 1、配置環境變數到/bin 2、創建my.ini.txt目錄 輸入內容:(直接複製) 【 client 】 port=3306 default-character-set=utf8 [mysqld] #設置為自己MYSQL的目錄 basedir=D:\AppG ...
  • ###前置條件:已安裝nodejs,安裝詳情可參考鏈接:https://www.cnblogs.com/zhen9436/p/16617383.html 1. cmd視窗安裝newman npm install -g newman 2. cmd視窗安裝newman-html報告 nnpm insta ...
  • 上一期我們介紹了幾種常見的構建鏡像方式,並給出了功能對比、決策樹等作為選型參考。本期我們將演示如何使用 Alpine 構建一個 Redis 鏡像。 Alpine 系統使用 apk 包管理工具,文中相關 apk 使用技巧不再贅述。 我們將構建鏡像 Dockerfile 中的幾個部分單獨講解,最後提供一 ...
  • 摘要:本文主要著重介紹資源池資源監控以及用戶資源監控。 本文分享自華為雲社區《GaussDB(DWS)資源監控之用戶、隊列資源監控》,作者: 一隻菜菜鳥。 GaussDB(DWS)資源監控功能包含實例資源監控、記憶體資源監控、資源池資源監控、查詢監控以及用戶資源監控,本文主要著重介紹資源池資源監控以及 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...