sqli-labs靶場實現(十)【二次注入(二階注入)】(less-24、具體步驟+圖文詳解)

A&&K發表於2021-01-05

一)二次注入
1)二次注入介紹
2)二次注入程式碼分析
3)二次注入利用
4)二次注入危害
5)程式碼審計

————————————————————————————————————————————————————


一)二次注入

1)二次注入介紹:
在這裡插入圖片描述
網站伺服器和資料庫伺服器的互動是一個雙向的過程,使用者通過瀏覽器訪問網站伺服器進行使用者註冊,註冊之後就可以登入網站。此時註冊時的資訊會進行“註冊資訊儲存”(如:賬號、密碼),那麼也就會儲存到資料庫伺服器中就有了第一個輸入。之後我們進行資訊修改時也會進行資料庫的互動,那麼就會將第一次輸入的資訊提取出來之後進行修改再重新存入資料庫,實現第二次輸入

以上是正常情況下的資訊修改和資料庫互動(沒有惡意,一般就是登入的密碼忘記了),但是如果 攻擊者將對應的payload輸入到登入框讓惡意程式碼植入資料庫並且成功執行,那麼這就是一個二次注入漏洞。 簡而言之,二次注入是指對已存的資料庫內容被讀取後再次進入查詢語句之後產生的惡意SQL語句

二次注入需要具備的兩個條件:

a)使用者向資料庫插入惡意語句(即使後端程式碼對語句進行了轉義,如mysql_escape_string、mysql_real_escape_string轉義)。

b)資料庫對自己儲存的資料非常放心,直接取出惡意資料給使用者。


2)二次注入程式碼分析:

實現註冊的程式碼:
在這裡插入圖片描述
實現密碼修改的程式碼:
在這裡插入圖片描述
從程式碼中可以知道,此時如果在修改密碼的框中構造payload:其中使用者名稱假如是admin,我們將單引號閉合再結合 – 註釋符將後面的password註釋掉那麼就變成了:username='admin'--+ 此時 ' and password='$curr_pass' " 都無效了。那麼此時只要指定表users中的所有為admin的使用者名稱的密碼都會被修改為我們修改的新密碼。

3)二次注入利用:

實現流程:

1)訪問存在SQL二次注入的網站,並且已知此網站中一個真正存在的使用者名稱:admin;
2)進入登入介面進行註冊:使用者名稱:admin'-- -,密碼:1234563)用新註冊的使用者和密碼登入網站;
4)點選“忘記密碼”對我們註冊的使用者名稱:admin'-- - 進行密碼修改:12345)此時如果網站中原本的admin使用者使用此使用者名稱和原本他自己設定的密碼進行登入時,會顯示密碼錯誤,因為此時admin使用者的密碼已經被修改為1234了。

在這裡插入圖片描述
users表中存在一個使用者名稱和密碼均為admin的使用者,此時我們訪問網站,註冊一個新的使用者:
在這裡插入圖片描述
確定新建使用者的使用者名稱和密碼(admin’-- -或者admin’#或者admin’–+):
在這裡插入圖片描述
此時再次檢視user表中的資料會發現admin’-- -使用者出現了(第一次輸入):
在這裡插入圖片描述
此時使用admin’-- -使用者名稱和對應密碼就登入了,但我們的重點操作是接下來通過忘記密碼開始利用:
在這裡插入圖片描述
在這裡插入圖片描述
將admin’-- -使用者的密碼進行修改(第二次輸入
在這裡插入圖片描述
在這裡插入圖片描述
此時再次檢視user表中的資料會發現admin’-- -使用者它的密碼並沒有改變,但是admin使用者的密碼卻變了:
在這裡插入圖片描述

5)程式碼審計:

註冊使用者時,網站出現問題的頁面很顯然是註冊頁面,與密碼修改重置頁面。他們僅對特殊字元進行了轉義,判斷輸入兩次密碼是否一致,然後將使用者鍵入,將資料插入至資料庫: $sql = "insert into users ( username, password) values(\"$username\", \"$pass\")"。當攻擊者直接輸入構造的payload進行修改密碼:

$username= $_SESSION["username"];//直接取出了資料庫的資料
$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";//對該使用者的密碼進行更新
$sql = "UPDATE users SET PASSWORD='12345678' where username='admin‘#


4)二次注入最常見的危害:

a)構造payload觸發二次SQL隱碼攻擊;
b)構造payload觸發XSS攻擊;





相關文章