針對場景:
存在另一處操作直接呼叫輸入資料而不做其他處理
關鍵:【尋找另一處引用這個資料的操作】如果另一處操作直接將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 的查詢窗體中重複使用。簡單地說,二次注入和普通注入一樣是乙個程式漏洞,它發生在使用者提交的值被儲存在資料庫中,然後這個值被應用程式中的某些其他...