pikachu學習——sql注入


sql注入漏洞概述:

     數據庫注入漏洞,主要是開發人員在構建代碼時,沒有對輸入邊界進行安全考慮,導致攻擊者可以通過合法的輸入點提交一些精心構造的語句,從而欺騙后台數據庫對其進行執行,

導致數據庫信息泄露的一種漏洞。

sql注入攻擊流程

 

 

 

 

 

常見注入類型:   

                              數字型  user_id=$id

           字符型 user_id='$id'

           搜索型  text like '%{$_GET['search']}'  "

 

我們就可以開始在pikachu平台去嘗試進行sql注入

 

數字型注入(post):

       選擇一個數字,例如1,查詢並抓包

     

 

 

 將抓包內容發送到repeater模塊,我們可以在1后面添加payload“or 1=1”

 

 

 我們發現所有用戶信息都被爆出,這說明它存在數字型注入漏洞

我們可以查看一下他的源碼,post請求直接把id帶到SQL語句中,沒有做任何處理,所以id這里存在sql注入漏洞;

 

 

 

 

 

字符型注入(get):

輸入數據庫中存在用戶kobe,查詢

 

 

 

因為是get,所以我們可以不用抓包,直接嘗試

字符型的注入,我們可以加單引號、雙引號、括號、以及他們的組合並且注釋,去測試

 

 

 

 

當我們輸入kobe‘--+’時信息全部爆出,所以它存在單引號字符型注入漏洞

查看源碼,發現字符型,name被單引號包裹

 

 

 

 

SQL搜索型注入:

 

 

 

 

這里可以進行用戶名搜索,所以我們可以猜測他是否使用了數據庫中的搜索邏輯

查看源碼,可以發現模糊查詢使用了like,name被單引號和%包裹,所以我們需要構造單引號閉合,且閉合需要加%

 

 

 

 

輸入payload  xxx%’  or 1=1 #信息全部爆出

 

SQLxx型注入:

 

 

 

查看源碼我們發現('$name'),name被單引號及括號包裹,類似搜索型

我們可以輸入payload  xxx’) or 1=1#

 

 

 

 

”insert/update“注入:

         MySQL 表中使用 INSERT INTO SQL語句來插入數據

        以下為向MySQL數據表插入數據通用的 INSERT INTO SQL語法:

      INSERT INTO table_name ( field1, field2,...fieldN ) VALUES ( value1, value2,...valueN );
如果數據是字符型,必須使用單引號或者雙引號,如:"value"。

下面我們打開pikachu此界面,首先進行信息注冊

 

 

 我們輸入用戶名為單引號,密碼隨意,發現語法報錯,這意味着我們輸入的內容在后台參與了mysql的拼接

 

 那我們就可以在用戶名處輸入sql查詢語句,讓他insert到后台數據庫,爆出相應信息

a’or updatexml(1,concat(0x7e,database()),0)or ‘

 

 

 

 

 

 

UPDATE介紹:用於更新表中的現有數據。亦可用UPDATE語句來更改表中單個行,一組行或所有行的列值。

復制代碼
MySQL-UPDATE語法:

UPDATE [LOW_PRIORITY] [IGNORE] table_name 
SET 
    column_name1 = expr1,
    column_name2 = expr2,
    ...
WHERE
    condition;
復制代碼

在上面UPDATE語句中:

第一,在UPDATE關鍵字后面指定要更新數據的表名。

第二,SET子句指定要修改的列和新值。要更新多個列,請使用以逗號分隔的列表。

第三,使用WHERE語句中的條件指定要更新的行。

    WHERE子句是可選的。 如果省略WHERE子句,則UPDATE語句將更新表中的所有行。

 

我們可以登陸進去后,寫入相應語句去爆破數據庫

 a' or  updatexml(1, concat(0x7e,(select (concat_ws('-',username,password)) from pikachu.users limit 0,1)  ),1)  or '

 

 

”delect“注入:

 

 

 

       DELETE FROM 命令用於刪除 MySQL 數據表中的記錄。

            DELETE FROM 表名稱 WHERE 列名稱 = 值

 

查看源碼我們發現他直接把id內容直接拼接到了數據庫中

 

 

 

進入頁面儲存1234567信息刪除並抓包,發送到repertar,我們根據刪除行的信息得出表名

 

 

 輸入1 or updatexml(1,concat(0x7e,database()),0)語句將id轉換,並轉碼

 

 

 

點擊發送,我們可以在最右邊底部,我們可以獲取到數據庫信息

 

 

“http header”注入:

       HTTP頭注入其實並不是一個新的SQL注入類型,而是指出現SQL注入漏洞的場景。有些時候,后台開發人員為了驗證客戶端頭信息(比如常用的cookie驗證),或者通過http header頭信息獲取客戶端的一些資料,比如useragent、accept字段等。會對客戶端的http header信息進行獲取並使用SQL進行處理,如果此時沒有足夠的安全考慮則可能會導致基於http header的SQL Inject漏洞。

          進入頁面輸入用戶名密碼admin/123456進行登錄

 

 查看登陸后信息我們猜測后端是不是對http header里面的數據進行了獲取,進行了相關數據庫的操作

我們點擊退出並抓包將內容發送到repeater模塊

 

 

修改user-agent  為

  firefox’ or updatexml(1,concat(0x7e,database()),0)or ‘

 

 

 

 

布爾盲注:

   布爾盲注主要表現:

     1.沒有報錯信息

     2.結果都只顯示兩種情況(0或1)

     3.在正確的輸入下,輸入and 1=1/and 1=2可以判斷

 

其實主要就是利用字符的ascii碼進行比對,看回顯結果,一步步縮小范圍,直到驗證成功。

 

輸入  kobe’ and ascii(substr(database(),1,1))>120#

 

 

回顯失敗說明小於120

 

 

輸入  kobe’ and ascii(substr(database(),1,1))=112#

 

 

我們可以知道數據庫名第一個字母ascil碼為112,即p,改變substr提取的值一個一個試直到完全爆出

查庫: select schema_name from information_schema.schemata
查表:select table_name from information_schema.tables where table_schema'security'
查列:select column_name from information_schema.columns where table_name='users'
查字段:select username,password from security.users

時間盲注

      時間盲注主要使用if語句,通過延遲信息進行判斷,不看回顯信息

         kobe’ and sleep(5)#  

        若正確,頁面延遲5秒,不正確直接返回,我們可以用sleep判斷相應語句是否正確,來

獲取數據庫信息,這種方法也很慢

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM