1. 程式人生 > 其它 >二次注入詳解

二次注入詳解

目錄

0x01 前言

前幾天看一些面經的時候,看到sql注入的二次注入,當時沒一下子反應過來,好傢伙,趕緊再次去那個靶場sqli-labs/Less24復現一下二次注入。

0x02 什麼是二次注入?

二次注入可以理解為,攻擊者構造的惡意資料儲存在資料庫後,惡意資料被讀取並進入到SQL查詢語句所導致的注入。防禦者即使對使用者輸入的惡意資料進行轉義,當資料插入到資料庫中時被處理的資料又被還原,Web程式呼叫儲存在資料庫中的惡意資料並執行SQL查詢時,就發生了SQL二次注入。

也就是說一次攻擊造成不了什麼,但是兩次配合起來就會早成注入漏洞。

0x03 注入條件

兩次注入分別是插入惡意資料利用惡意資料

所以也就是滿足這兩個條件即可

  • 使用者向資料庫插入惡意資料,即使後端對語句做了轉義,如mysql_escape_string、mysql_real_escape_string等函式
  • 資料庫能夠將惡意資料取出

0x04 靶場例項

首先進入靶場,可以看到與其他靶場不同,這裡多了忘記密碼和註冊密碼選項

嘗試常規post注入,未果。

這裡看到後端原始碼會發現使用了轉義函式mysql_real_escape_string,常規SQL注入流程無法走了

既然可以註冊賬戶那就去註冊一下,這裡直接註冊admin'#

用註冊的賬號登入進去後發現可以修改密碼

修改密碼這個模組也可以利用,我們不妨想一下修改密碼後端實現的邏輯,使用的肯定是sql增刪改查中的改語句,於是猜想對應sql語句可能會是這樣

update users set password='$new_pass' where username='$user' and password='$old_pass';

(當然閉合方式不一定就是單引號,這裡需要碰運氣吧。。)

如果我們註冊一個這樣的賬號 admin'# 上述sql語句就變成這樣

update users set password='$new_pass' where username='admin'# and password='$old_pass';

顯而易見,語句原義被破壞,本來修改的是admin'# 使用者的賬號和密碼,現在卻是變成了直接修改admin使用者的密碼!

那就隨便輸入個密碼123456修改後再拿它去嘗試登入admin賬戶,發現成功登入。

說明資料庫中admin使用者的密碼已經被成功改為123456

0x05 如何防禦二次注入?

  • 對輸入一視同仁,無論輸入來自使用者還是儲存,在進入到 SQL 查詢前都對其進行過濾、轉義。
  • 使用MySQLi引數化更新,事先編譯的PHP程式碼能夠帶來高效的防護效果