SQL注入基礎知識
在owasp年度top 10 安全問題中,SQL注入高居榜首,SQL注入攻擊指的是通過構建特殊的輸入作為引數傳入web應用程式,而這些輸入大都是SQL語法里的一些組合,通過執行SQL陳述句進而執行攻擊者所要的操作,其主要原因是程式沒有細致地過濾用戶輸入的資料,致使非法資料侵入系統,
1.對于Web應用程式而言,用戶核心資料存盤在資料庫中,例如MySQL、SQL server、Oracle
2.通過SQL注入攻擊,可以獲取、修改、洗掉資料庫資訊,并且通過提權來控制Web服務器等其他操作
3.SQL注入即攻擊者通過構造特殊的SQL陳述句,入侵目標系統,致使后臺資料庫泄露資料的程序
4.因為SQL注入漏洞造成的嚴重危害性,所以常年穩居owasp top 10的榜首
常見的SQL注入型別
1)可回顯注入
- 可以聯合查詢的注入
- 報錯注入
- 通過注入進行DNS請求,從而達到可回顯的目的
2)不可回顯注入
- Bool盲注
- 時間盲注
1.1 可以聯合查詢的注入
在可以聯合查詢的題目中,一般會將資料庫查詢的資料回顯到首頁面中,例如
<?php
...
$id = $_GET['id'];
$getid = "SELECT id FROM users WHERE user_id = '$id'";
$resuit = mysql_query($getid) or ide('<pre>'.mysql_error().'<pre>');
$num = mysql_numrows($result);
...
?>
我們注意看上方的SQL陳述句中的$id變數,該變數會將GET獲取到的引數直接拼接到SQL陳述句中,加入此時傳入一下引數:
?id = -1' union select 1 --
拼接后SQL陳述句就變成了:
SELECT id FROM users WHERE user_id = '-1' union select 1 -- '
閉合前面的單引號,注釋掉后面的單引號,中間寫上需要的Payload就可以了,
聯合查詢是最簡單的一種SQL注入方法,所以大多數情況下都需要繞過某些特定字符或者是特定單詞比如:空格 或者 select、and、or等字串
1.2 報錯注入
updatexml
updatexml的報錯原理從本質上來說就是函式的報錯
?id = 1' updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)%23

1.3 Bool盲注
Bool盲注通常是由于開發者將報錯資訊屏蔽而導致的,但是網頁中真和假有著不同的回顯,比如為真時回傳access,為假時回傳false;或者為真時回傳正常頁面,為假時跳轉到錯誤頁面
Bool盲注中通常會配套使用一些判斷真偽的陳述句來進行判定,常用的發現Bool盲注的方法是在輸入點后面添加and 1=1和and 1=2 (該Payload應在懷疑是整型注入的情況下使用)
Bool盲注的原理是如果題目后端拼接了SQL陳述句,and 1=1為真時不會影響執行結果,但是and 1=2為假,頁面則可能會沒有正常的回顯
有時我們可能會遇到將1=1過濾掉的SQL注入點,這時候我們可以通過修改關鍵字來繞過過濾,比如將關鍵字修改為不常見的數值如1352=1352
1.4 時間盲注
時間盲注出現的本質原因也是由于后端拼接了SQL陳述句,但是正確和錯誤存在明顯的回顯,錯誤資訊被過濾,不過,可以通過頁面回應時間進行按位判斷資料,
時間盲注類似于Bool盲注,只不過是在驗證階段有所不同,Bool盲注是根據頁面回顯的不同來判斷的,而時間盲注是根據頁面回應時間來判斷結果的,
sleep()函式
sleep是睡眠函式,可以使查詢資料時回顯資料的回應時間加長,
sleep(5),頁面回傳將延遲5秒
注入點的位置及發現
GET引數中的注入
GET中的注入點一般最容易發現,因為我們可以在地址欄中獲得URL和引數等,可以用sqlmap自動注入或者手工注入等驗證是否存在注入漏洞
POST中的注入
POST中的注入點一般需要我們通過抓包操作來發現,如使用BurpSuite或者瀏覽器插件Hackbar來發送POST包,同樣也可以使用sqlmap自動注入或者手工注入等方式驗證是否存在注入漏洞
User-Agent中的注入
推薦使用BurpSuite的Repeater模塊,或者sqlmap自動注入,將sqlmap的引數設定為level=3,這樣sqlmap會自動檢測User-Agent中是否存在注入漏洞
Cookies中的注入
同樣推薦BurpSuite中的Repeater模塊,在sqlmap中也可以設定引數level=2,這樣sqlmap就會自動檢測Cookies中是否存在注入漏洞
判斷注入點是否存在
判斷注入點是否存在
(1)插入單引號
插入單引號是我們最常使用的檢測方法,原理在于未閉合的單引號會引起SQL陳述句單引號未閉合的錯誤,所以輸入一個單引號并且成功報錯,說明此處存在SQL注入漏洞
(2)數字型判斷
通過and 1=1(數字型)和閉合單引號測驗陳述句'and'1'='1(字串型)進行判斷,這里采用Payload'1'='1的目的是為了閉合原陳述句后方的單引號
(3)通過數字的加減進行判斷
比如,一個鏈接http://xxxx.com/?id=2,可以嘗試http://xxxx.com/?id=3-1,如果結果與http://xxxx.com/?id=2相同,則證明id這個輸入點可能存在SQL注入漏洞
繞過方法
一般來說有關SQL注入的地方都會重點防御,所以,要掌味訓式的繞過技術,
1.過濾關鍵字
即過濾如select、or、from等的關鍵字,有些防御手段還會降這些關鍵字替換為空,這時候我們可以用穿插關鍵字的方法繞過
select -- selselectect
or -- oorr
union -- uniunionon
...
又或者大小寫來繞過
select -- SelECt
or -- oR
union -- UniON
有時候,過濾函式是通過十六進制進行過濾的,我們可以對關鍵字的個別字母進行替換
select -- slelc\x74
or -- o\x72
union -- unio\x6e
有時候還可以通過雙重URL編碼進行繞過操作
from -- %25%36%36%25%36%66%25%37%32%25%36%64
or -- %25%36%66%25%37%32
2.過濾空格
還有一些后端開發人員并沒有對關鍵字進行過濾,反而對空格進行了過濾
1)通過注釋繞過,一般的注釋符:
#
--
//
/**/
%00
這時候我們可以通過這些注釋符來繞過空格符
select/**/username/**/from/**/user
2)通過URL編碼繞過,我們知道空格的編碼是%20,所以可以通過二次URL編碼進行繞過
%20 -- %2520
3.繞過相等過濾
1)通過注釋繞過,一般的注釋符:
#
--
//
/**/
%00
這時候我們可以通過這些注釋符來繞過空格符
select/**/username/**/from/**/user
2)通過URL編碼繞過,我們知道空格的編碼是%20,所以可以通過二次URL編碼進行繞過
%20 -- %2520
3.繞過相等過濾
有技術大牛曾研究過,MySQL中存在utf8_unicode_ci和utf8_general_ci兩種編碼格式,utf8_general_ci不僅不區分大小寫,而且?=A,?=O,ü=U這三種等式都成立,對于utf8_general_ci等式β=s是成立的,但是對于utf8_unicode_ci,等式β=ss才是成立的
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/156612.html
標籤:python
上一篇:多執行緒的概述
下一篇:黃毅然的網路安全學習
