(一)是什麼?
——何爲二次注入?
——爲了預防SQL注入攻擊,而將輸入到應用程序中的某些數據進行了“轉義(escape)”,但是這些數據卻又在“未被轉義(Unescaped)”的查詢窗體中重複使用。
簡單地說,二次注入和普通注入一樣是一個程序漏洞,它發生在用戶提交的值被存儲在數據庫中,然後這個值被應用程序中的某些其他功能使用而不轉義或者過濾數據。
(二)區別
參考網上的總結,二次注入和普通注入的區別主要有:
普通注入:(1)在http後面構造語句,是立即直接生效;
(2)普通注入很容易被掃描工具掃描到。
二次注入:(1)先構造語句(此語句含有被轉義字符的語句);
(2)將我們構造的惡意語句存入數據庫;
(3)第二次構造語句(結合前面已被存入數據庫的語句構造。因爲系統沒有對已存入的數據做檢查,成功注入);
(4)二次注入更加難以被發現。
(三)二次注入示例
用模擬登陸和修改密碼進行操作:
首先,假設我們註冊了兩個用戶:用戶①名字爲“csdner”,密碼是“csdner123456”;
用戶②名字爲“csndner'--” ,密碼是“csdner1111”。
請注意,此處的用戶②的名字就是sql注入有效負載,它沒有被轉義或者截斷,而是按照原樣保存在了數據庫中。
然後,我們登陸用戶②,並修改它的密碼爲“csdn222”。注意此時登陸的是用戶②。因此,我們爲此用戶名構造密碼更改查詢
UPDATE users
SET password='csdn222'
WHERE username='csdner'--' and password='csdn1111'
記住此時被查詢的是用戶②。但是,因爲在SQL中,--是開啓註釋的標誌,這樣子的話,不知不覺中被更改密碼的成了用
戶①(實際上,上面的代碼已經自動被CSDN當做註釋處理了,恰好成了注入的樣子)
也就是說,現在的查詢語句長下面這個樣子:
UPDATE users
SET password='csdn222'
WHERE username='csdner'
查詢導致更新用戶“csdner”的密碼,而不是“csdner'- - ” 因此成功執行二階sql注入。
(四)小結
參考了網上的資料,總結一下二次注入的精髓就是,第一次構造的語句只是爲了第二次構造做的鋪墊,第二次纔是真正的攻擊。
當然,二階SQL注入也適用於其他場景,其中數據庫中的數據是要被檢索的。