目錄
- SQL注入產生原理
- Mysql相關
- 聯合注入
- 條件
- 步驟
- 整型注入
- 單引號閉合
- 雙引號閉合
- 報錯注入
- Xpath語法錯誤
- extractvalue
- updatexml
- group_by
- Boolean注入
- 時間注入
- 寬位元組注入
- cookie注入
- 堆疊注入
- 二次注入
SQL注入產生原理
由于web應用程式沒有對用戶輸入的資料進行判斷,用戶可以自由控制傳入后端的資料,因此只要構造相應的陳述句就可以對資料庫非法操作,
Mysql相關
想要進行sql注入必須要先了解一些Mysql的知識,Mysql默認有一個information_schema資料庫用來存放其他所有資料庫的資訊,其中SCHEMATA、TABLES和COLUMNS分別存盤了其他資料庫的庫名,庫名和表名, 庫名、表名、欄位名,其表中記錄庫名、表名、欄位名的欄位名分別為table_schema、table_name、clumns_name,從這些欄位名中可以找到其他資料庫的資訊,
聯合注入
條件
1.頁面上有相應位置回顯
2.必須由兩潭訓以上select陳述句構成
3.查詢必須由相同的列
步驟
1.判斷列數
可以通過order by+列數判斷,如果列數超過則會顯示Unknown column,不超過則正常顯示,可以利用二分法快速判斷列數
2.判斷回顯位
在確定完列數后利用union select判斷相應的顯示位置,列如有3列則構造union select 1,2,3通過回顯即可判斷
3.查詢資料庫等資訊
整型注入
如sqlilabs中less-2中就是整形注入,此型別不需要閉合,直接執行陳述句查詢即可
從圖中可以看到當order by 4的時候不能正常回顯,那么可以判斷
列數小于4
當order by 3的時候可以正常回顯那么可以判斷出列數為3
當知道列數后就可以判斷相應回顯位置,在判斷不能繼續用id=1,否則將繼續顯示id=1的內容
通過回顯可以判斷出2,3的位置有回顯,找到回顯位后就可以進而查詢各種資訊,通過構造?id=0 union select 1,database(),3得到當前資料庫
繼續通過information_schema.tables找到所有表,這里可以用group_concat顯示出所有內容
繼續利用information_schema.column查詢欄位名

最后找到所有內容,這里如果資料庫中表名是唯一的可以直接from表名
單引號閉合
sqlilabs中less-1為單引號閉合,當傳入id=1時正常顯示,id=1’時出現下面內容
從圖中可以看出傳入的id=1’使陳述句多出了一個單引號,而陳述句中單引號是不能單獨出現的,因此我們將后面的單引號注釋掉,可以使用#(當有過濾時可以用%23)
閉合成功后即可正常回顯,接下來繼續查詢相應資訊即可,方法與整形注入相同
雙引號閉合
沒啥好說的,與單引號閉合原理相同,方法也是注釋掉后面的引號
報錯注入
Xpath語法錯誤
extractvalue
extravalue主要作用為對xml檔案查詢用法為extravalue(xml檔案,Xpath字串)由于第二個引數必須要求為合法字串形式,否則將會報錯并且回傳錯誤資訊,這樣就可以進行操作,可以用~ # $等進行報錯
payload可以為
id='and(select extractvalue("1",concat('0x7e',(陳述句))))
例如salilab-less2中

updatexml
用法為updatexml(xml檔案,路徑,內容)與extravalue類似,只不過前者為更新檔案后者為查詢檔案,在第二個引數路徑可以使用非法字符進行報錯
payload可以為
id='and(select updatexml("1",concat('0x7e',(陳述句),),'1'))
group_by
group by 的原理是回圈讀取每一行,把結果存在一個表中,讀取每一行時,如果資料存在于臨時表中,則不更新臨時表的資料;反之不在時,則插入資料,因此可以利用floor(rand(0)*2)的重復性使group by報錯
payload可為
'union select 1 (select count(*),concat((陳述句),floor(rand(0)*2))欄位 from "表" group by 欄位)
Boolean注入
Boolean注入判斷較易,當訪問頁面時回傳yes,在加單引號或者其他字符后回傳no, 再通過更改id的傳入值發現結果仍為yes或no即可判斷為Boolean注入,該型別與上述幾個有所區別,當查詢時若執行陳述句并不能直接獲得查詢結果,需先判斷庫名的長度,可以利用length函式判斷
例如
length(database()>=4)
length(database()>=5)
若第一句回傳yes說明庫名大于或等于4,若第二句回傳no說明庫名小于5,由此可以判斷出庫名的長度為4
在知道庫名長度后可以利用substr函式進行逐字判斷,函式用法為
substr(引數,起始位置,截取個數)
例如
substr(database(),1,1)='a'
意思為截取database()的值從第一個字符開始截取一個判斷是否等于字符a,如果等于則回傳yes否則回傳no,由此可以逐字判斷出資料庫全名,得到資料庫名后進而判斷出表名、欄位名等
可以利用burp快速爆破

時間注入
通常sql陳述句查詢只有幾毫秒
因此可以利用sleep延長sql陳述句的執行時間結合if,進而通過burp中頁面相應時間判斷條件是否正確
例如
if(length(database())>1,sleep(5),1)
意思為如果database()庫名大于1,則延遲5秒執行陳述句
如salilab-less9中

寬位元組注入
類似于sqlilab-less32中傳入id=1’時發現單引號被反斜杠轉義,此種情況在資料庫編碼為GBK時存在寬位元組注入,可以在地址后加%df,原理為反斜杠編碼為%5c,而在GBK編碼中%df%5c是繁體字連,這時候反斜杠不存在,單引號便不受反斜杠影響爆出錯誤
進而繼續查詢資訊

cookie注入
cookie是保存于客戶機上一個特殊的檔案,主要用于記錄客戶機的個人資訊,因此如果不對cookie中資訊進行過濾就可以引起注入漏洞
cookie注入與傳統的GET和POST并沒有太大區別,只不過是形式不同而已
判斷cookie注入的方法,可以先看URL是否存在.asp?id=的形式,通過更改cookie傳入的引數來判斷是否存在注入
另外還有一種方式就是通過burp抓包更改cookie的值來判斷
例如sqlilab-less-20中
登陸成功后會在頁面中顯示出用戶資訊,在資訊中能看到ID=8,猜測ID很可能就是從資料庫中查詢出來的,因此通過burp抓包本頁面
看到cookie中存入了admin,嘗試更改uname發現頁面回顯發生變化
據此判斷存在cookie注入,剩下的方法與上邊相同,通過更改uname的值來一步步實作資訊查詢


堆疊注入
堆疊注入顧名思義就是將多條陳述句一起執行,在mysql中 ; 表示陳述句結束,那么如果陳述句結束后繼續構造下條陳述句會發生什么?堆疊注入由此而生
例如強網杯隨便注入
但是這里過濾了select,可以通過預編譯來繞過
預編譯相關:
set 設定變數名和值
prepare 定義一個陳述句,并設定名稱
execute 執行陳述句
二次注入
二次注入與上述幾種情況有所區別,其本身頁面并不存在漏洞,產生原理為攻擊者在構造惡意資料存入資料庫中后,當web應用呼叫sql查詢時執行攻擊者構造的陳述句從而形成的漏洞
其步驟基本分為插入資料和參考資料兩步
例如sqlilab-less24

注冊一個名為admin’#的用戶密碼為123456,當登入后修改密碼為12345678
可以看出admin’#的密碼并沒有改變,而是直接改變了admin的密碼,由此還可以實作很多功能
由于能力有限,若文章有錯誤還請包涵并指出
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/275414.html
標籤:其他
下一篇:資料庫安全性與完整性(一)
