天天看點

【23】WEB安全學習----MySQL注入-8(二階注入)什麼是二階注入?二階注入示範

轉載于: https://blog.csdn.net/a15803617402/article/details/82796301

什麼是二階注入?

簡單的來說,就是第一次注入時,開發者進行了編碼等限制,無法直接進行注入,但是在資料庫中保留了我們注入的語句,程式在其它地方再次調用儲存着我們注入的語句時發生了注入,這就是二階注入,有點類似存儲型XSS漏洞的意思。

二階注入示範

實驗環境介紹

text資料庫裡有張users表,目前裡面已有admin和root賬戶

【23】WEB安全學習----MySQL注入-8(二階注入)什麼是二階注入?二階注入示範

使用者注冊頁面

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>使用者注冊 </title>
  8. </head>
  9. <?php
  10. function check($str){
  11. $str1=str_replace( "'", "''",$str);
  12. $str1=str_replace( '"', '""',$str1);
  13. return $str1;
  14. }
  15. if( isset($_POST[ 'submit'])){
  16. $username=check($_POST[ 'username']);
  17. $passwd=check($_POST[ 'passwd']);
  18. $email=check($_POST[ 'email']);
  19. $mysqli= new mysqli();
  20. $mysqli->connect( 'localhost', 'root', 'root');
  21. if($mysqli->connect_errno){
  22. die( '資料庫連接配接失敗:'.$mysqli->connect_error);
  23. }
  24. $mysqli->select_db( 'text');
  25. if($mysqli->errno){
  26. die( '打開資料庫失敗:'.$mysqli->error);
  27. }
  28. $mysqli->set_charset( 'utf-8');
  29. $sql= "SELECT * FROM users WHERE username='{$username}'";
  30. $sl=$mysqli->query($sql);
  31. if(!$sl){
  32. die( 'SQL語句執行錯誤:'.$mysqli->error);
  33. } else if($sl->num_rows> ){
  34. $sl->free();
  35. $mysqli->close();
  36. die( '該使用者已被注冊,請使用其它賬戶');
  37. } else {
  38. $sql= "INSERT INTO users VALUES(NULL,'{$username}',md5('{$passwd}'),'{$email}')";
  39. echo 'SQL執行語句'.$sql. '<hr />';
  40. $sl=$mysqli->query($sql);
  41. if(!$sl){
  42. die( 'SQL語句執行錯誤:'.$mysqli->error);
  43. } else {
  44. die( "恭喜你注冊{$username}成功!");
  45. }
  46. }
  47. $sl->free();
  48. $mysqli->close();
  49. }
  50. ?>
  51. <body>
  52. <h1>使用者注冊 </h1>
  53. <form action="" method="post">
  54. 使用者名: <input type="text" name="username"> <br />
  55. 密碼: <input type="password" name="passwd"> <br />
  56. 郵箱: <input type="text" name="email"> <br />
  57. <input type="submit" name="submit" value="注冊">
  58. </form>
  59. </body>
  60. </html>

使用者密碼修改頁面

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>修改使用者密碼 </title>
  8. </head>
  9. <?php
  10. if( isset($_POST[ 'submit'])){
  11. $username=$_POST[ 'username'];
  12. $passwd=$_POST[ 'passwd'];
  13. $newpasswd=$_POST[ 'newpasswd'];
  14. $mysqli= new mysqli();
  15. $mysqli->connect( 'localhost', 'root', 'root');
  16. if($mysqli->connect_errno){
  17. die( '資料庫連接配接失敗:'.$mysqli->connect_error);
  18. }
  19. $mysqli->select_db( 'text');
  20. if($mysqli->errno){
  21. die( '打開資料庫失敗:'.$mysqli->error);
  22. }
  23. $mysqli->set_charset( 'utf-8');
  24. $sql= "SELECT * FROM users WHERE username='{$username}' AND passwd=md5('{$passwd}')";
  25. $sl=$mysqli->query($sql);
  26. if(!$sl){
  27. die( 'SQL語句執行錯誤:'.$mysqli->error);
  28. } else if($sl->num_rows== ){
  29. $sl->free();
  30. $mysqli->close();
  31. die( '修改密碼失敗,使用者或原密碼錯誤');
  32. } else {
  33. $sql= "UPDATE users SET passwd=md5('{$newpasswd}') WHERE username='{$username}'";
  34. $sl=$mysqli->query($sql);
  35. if(!$sl){
  36. die( 'SQL語句執行錯誤:'.$mysqli->error);
  37. } else{
  38. die( '修改密碼成功!');
  39. }
  40. }
  41. $sl->free();
  42. $mysqli->close();
  43. }
  44. ?>
  45. <body>
  46. <h1>使用者密碼修改 </h1>
  47. <form action="" method="post">
  48. 使用者名: <input type="text" name="username"> <br />
  49. 原密碼: <input type="password" name="passwd"> <br />
  50. 新密碼: <input type="password" name="newpasswd"> <br />
  51. <input type="submit" name="submit" value="修改">
  52. </form>
  53. </body>
  54. </html>

二階注入示範

首先使用者注冊頁面,對使用者送出的資料進行了check()函數過濾,對單引号和雙引号進行了閉合,故無法閉合SQL語句。

如:id=1' => id=1''

【23】WEB安全學習----MySQL注入-8(二階注入)什麼是二階注入?二階注入示範

這裡很明顯,無法直接一階注入,但使用者修改密碼頁面對這個表中的資料沒有過濾或限制就調用了(開發人員相信資料庫中資料),那麼此時就存在二階注入。

首先注冊一個使用者名為:admin'#的使用者,經過check函數就變成了admin''#,此時就無法直接注入。

【23】WEB安全學習----MySQL注入-8(二階注入)什麼是二階注入?二階注入示範
【23】WEB安全學習----MySQL注入-8(二階注入)什麼是二階注入?二階注入示範

在資料庫中,已插入一個使用者名為admin'#的使用者

【23】WEB安全學習----MySQL注入-8(二階注入)什麼是二階注入?二階注入示範

然後在使用者修改密碼界面中,輸入admin'#使用者和相應的密碼

此時,修改密碼的SQL為:

  1. UPDATE users SET passwd= md5( '123123') WHERE username= 'admin'# ';
  2. =
  3. UPDATE users SET passwd=md5(' ') WHERE username=' admin ';
【23】WEB安全學習----MySQL注入-8(二階注入)什麼是二階注入?二階注入示範
【23】WEB安全學習----MySQL注入-8(二階注入)什麼是二階注入?二階注入示範

此時,檢視資料中記錄,發現是admin使用者的密碼被修改了。

【23】WEB安全學習----MySQL注入-8(二階注入)什麼是二階注入?二階注入示範

什麼是二階注入?