sqli 二次注入

2022-07-03 19:06:13 字數 1909 閱讀 2164

針對場景:

存在另一處操作直接呼叫輸入資料而不做其他處理

關鍵:【尋找另一處引用這個資料的操作】如果另一處操作直接將1』作為變數帶進自身的sql語句中,且未做如轉義等處理,那1』的單引號便會發生作用,起到sql注入的效果

以sqlilabs 24關為例

先點選forget your pass?出來如下頁面,看來是提示我們通過注入修改密碼

註冊乙個新使用者,使用者名稱admin4『#,密碼4444

註冊成功

這時候看資料庫,提前留意下admin4的密碼

以剛註冊的使用者登陸

修改密碼為4111

再看回資料庫

會發現被修改密碼的是admin4,而不是我們登陸的admin4』#,這就是二次注入

以24關的**為例

回憶我們剛剛的操作,註冊admin4』#,修改admin4』#密碼,發現admin4的密碼被修改

重點在admin4』#的修改密碼操作

對應**在pass_change.php

可以看到,執行的sql語句為

$sql= 」update users set password = 『$pass』 where username = 『$username』 and password = 『$curr_pass』 」;
當我們以admin4』#的使用者修改原密碼4444為新密碼4111時,執行的對應sql語句就為

$sql= 」update users set password = 『4111』 where username = 『admin4』#』 and password = 『4444』」;
這條語句實際執行時產生的效果相當於

$sql= 」update users set password = 『4111』 where username = 『admin4』;
也就是修改使用者admin4的密碼為4111,也就造成了二次注入

24關其實在註冊,登陸,修改密碼的資料帶入sql語句前都用了mysql_real_escape_string對特殊字元進行轉義,但修改密碼中, sql語句中的$username是直接通過$_session["username"]從資料庫中提取的,這個變數並未進行處理就被帶入sql語句中執行了,進而導致單引號發揮作用,造成注入。

防止二次注入,要麼禁止輸入資料庫的變數中存在非法字元,如果必須要有字元,在資料出庫後,也要做好處理

資料的輸入輸出都要有處理

mysql注入 二次注入

場景 系統對傳入值使用mysql escape string做了轉義處理,不能直接注入,但取出值時會自動轉義,而 中未再次轉義就放到sql語句中使用 非預處理方式 使得間接注入成功,實際場景 乙個含有註冊 登入 修改密碼功能的系統。資料庫中有乙個使用者名為admin,密碼為admin的使用者,現註冊...

二階sqli注入

通過對客戶端提交的資料進行嚴格的審查是有效避免sql注入的方法,但是一旦輸入的資料存入到資料庫之後,對這些資料的使用往往沒有做嚴格的檢查,但是對這些資料的操作往往具有很高的許可權,在使用這些資料再進行sql查詢或者sql寫操作的時候,很可能造成嚴重的sql注入,例如 使用者建立了乙個賬戶john 對...

SQL二次注入

一 是什麼?何為二次注入?為了預防sql注入攻擊,而將輸入到應用程式中的某些資料進行了 轉義 escape 但是這些資料卻又在 未被轉義 unescaped 的查詢窗體中重複使用。簡單地說,二次注入和普通注入一樣是乙個程式漏洞,它發生在使用者提交的值被儲存在資料庫中,然後這個值被應用程式中的某些其他...