? ? ? ?在南昌網(wǎng)站建設中,SQL注入攻擊可以根據(jù)bug的不同分為不同類別。通常來說,可以按照HTTP響應返回的數(shù)據(jù)種類來區(qū)分注入。如果返回的是類似下面這樣的SQL錯誤,就可以實施基于錯誤的SQLi:
? ? ? ?You have an error in your SQL syntax; check the
? ? ? ?manual that corresponds to your MySQL server version
? ? ? ?for the right syntax to use near ''' at line 1
? ? ? ?某些情況下,即使SQL語句中包含錯誤,Web應用也根本不會返回錯誤。這種類型的SQLi通常叫作Blind SQLi,因為從數(shù)據(jù)庫或應用得不到任何錯誤。
此時,通過對比正常請求和惡意請求的HTTP響應之間的區(qū)別,也可以檢測到SQLi是否會影響某些資源。前述區(qū)別可以分為兩種。一種是內容長度不同,也就是返回的響應體的內容不同。另一種是響應時間不同,比如常規(guī)響應時間是1秒,而惡意響應卻需要5秒。下面來看一段Ruby代碼,這段代碼是可以被SQL注入的:
? ? ? ?get "/" do
? ? ? ?@config = ConfigReader.instance.config
? ? ? ?# 從GET請求中取得book_id參數(shù)
? ? ? ?book_id = params[:book_id]
? ? ? ?# MySQL連接池
? ? ? ?pool = Mysql2::Client.new(
? ? ? ?:host => @config['db_host'],
? ? ? ?:username => @config['restricted_db_user'],
? ? ? ?:password => @config['restricted_db_userpasswd'],
? ? ? ?:database => @config['db_name']
? ? ? ?)
? ? ? ?begin
? ? ? ?if book_id == nil
? ? ? ?@rs = pool.query "SELECT * FROM books;"
? ? ? ?else
? ? ? ?# 若找到一個特定的book_id參數(shù)
? ? ? ?# 就執(zhí)行以下未加密查詢
? ? ? ?query = "SELECT * FROM books WHERE id=" + book_id + ";"
? ? ? ?@rs = pool.query query
? ? ? ?end
? ? ? ?erb :"sqlinjection"
? ? ? ?rescue Exception => e
? ? ? ?@rs = {}
? ? ? ?@error_message = e.message
? ? ? ?erb :"sqlinjection"
? ? ? ?end
? ? ? ?end
? ? ? ?如果將一個類似/page?book_id=1'的GET請求發(fā)送給這段代碼中的處理程序,那么數(shù)據(jù)庫就會返回類似前面的錯誤信息。只要發(fā)送像下面這樣檢索MySQL數(shù)據(jù)庫版本的查詢,就可以利用這種基于錯誤的SQLi:
? ? ? ?/page?book_id=1+UNION+ALL+SELECT+NULL%2C%40%40VERSION%2CNULL%23
? ? ? ?最終的SQL語句會被攻擊者在SELECT * FROM books WHERE id=1后面追加上UNION ALL?SELECT NULL, @@VERSION, NULL。Web應用的那個拼接的查詢(query = "SELECT * FROM?books WHERE id=" + book_id + ";")之所以不安全,是因為參數(shù)值book_id未經(jīng)輸入驗證就被用于字符串拼接。這種[沒有預處理語句(Prepared Statements)18]的查詢結果,會使應用面臨SQL注入的風險。
? ? ? ?再考慮一種情況。假設前面存在漏洞的代碼除了把底部的一行(@error_message =e.message)刪除之外,其余都相同,那么此時仍然可以被SQL注入攻擊,只不過變成了Blind。
? ? ? ?假設你事先并不知道這一點,而想要檢測某個資源是否可以實施SQLi。可以發(fā)送下面這個GET請求:
? ? ? ?/page?book_id=1+AND+SLEEP(5)
? ? ? ?然后,經(jīng)過大約5秒鐘,你才會收到HTTP響應。這么長的響應時間意味著該資源存在SQL注入漏洞,因為SLEEP語句被成功執(zhí)行了。
? ? ? ?以上只是比較淺顯的SQL注入檢測。如果你覺得這些內容不好理解,隨時可以來電咨詢百恒網(wǎng)絡,本公司專業(yè)從事南昌網(wǎng)站建設、微信開發(fā)、手機APP開發(fā)等服務,經(jīng)驗豐富,實力強,南昌做網(wǎng)站,就選百恒網(wǎng)絡!