SQL注入-時間注入

時間注入

時間注入指的是攻擊者根據SQL語句執行的時間長短變化來判斷是否注入語句是否執行成功。

在MySQL中,bechmark()函數的作用是可以使同一個函數執行若干次,從而數據庫執行的時間變長。如下:

<code>SELECT BENCHMARK(10000000,ENCODE("hello","world"))
> OK
> 時間: 7.411s/<code>

執行10000000次ENCODE("hello","world")函數,耗時7.411s,根據BENCHMARK函數執行的次數,SQL執行的時間也會變化,這樣就可以利用這個時間變化進行判斷是否具有注入的漏洞。另外,還可以根據sleep()函數來測試是否具有漏洞。sleep()函數經常與if條件語句一起使用,如下:

<code>-- 數據庫名稱的長度大於1,則休眠五秒,否則返回1。
if (length(database())>1,sleep(5),1)
-- 如果數據庫名的第一位字母是s,則睡眠5秒,否則返回1
if (substr(database(),1,1)='s',sleep(5),1)/<code>

上述SQL語句根據if語句中條件進行判斷,如果SQL查詢時間比sleep中的時間稍微長一點,那麼就存在漏洞。

下面來看下具體的時間注入案例,構造請求鏈接:

<code>http://localhost:8080/user/name?
name=lingheng' and if (length(database())>1,sleep(5),1) %23/<code>

實際執行的SQL語句為:

<code>SELECT * FROM t_person 
where Fname ='lingheng' and if (length(database())>1,sleep(5),1) #'/<code>


SQL注入-時間注入

請求的時間

在瀏覽器中按F12進行調試,就可以看到這次請求耗時5秒多。在sleep函數中換幾個不同的數字測試,如果每次返回結果的時間都不一樣,那麼說明注入是成功的。

當可以判斷進行時間注入,接下來也可以按照盲注的方法進行獲取數據庫的其他數據。

Mybatis注入分析

在Mybatis中,使用XML文件進行SQL語句的管理,有兩種語法對輸入的參數進行綁定,當 ${} 語法時,Mybatis會直接將輸入原封不動進行綁定,也就是說直接將SQL語句與原始字符串拼接在一起。而本教程中的注入原因就是使用${}進行綁定,所以才導致SQL注入,具體的XML位置如下:

<code><select>
SELECT * FROM t_person where Fname ='${name}'
/<select>/<code>

當使用 #{} 語法時,Mybatis 會自動生成 PreparedStatement ,使用參數綁定 ( ?) 的方式來設置值,帶佔位符 ( ? ) 的 SQL 語句只會被編譯一次,之後執行只是將佔位符替換為用戶輸入,並不會再次編譯/解釋,因此從根本上防止了 SQL 注入問題。而在 SQL 注入中,用戶的輸入是作為 SQL 指令的一部分,會被數據庫進行編譯/解釋執行。

上面的教程主要是利用手工進行注入,相對來說是比較耗時,以及效率比較低的,SQLMap是自動SQL注入和數據庫接管工具,支持Mysql、Oracle, PostgreSQL, Microsoft SQL Server等多種數據庫。有興趣的可以直接使用SQLMap進行SQL的注入學習。

我是小圖靈視界,會不定時更新互聯網安全、互聯網資源、互聯網技術、以及互聯網工具的文章,歡迎各位進行關注!

需要完整源碼和教程PDF的可以關注我,並留言評論,我將會發給你!


分享到:


相關文章: