【23】WEB安全学习----MySQL注入-8(二阶注入)

转载于: https://blog.csdn.net/a15803617402/article/details/82796301

什么是二阶注入?

简单的来说,就是第一次注入时,开发者进行了编码等限制,无法直接进行注入,但是在数据库中保留了我们注入的语句,程序在其它地方再次调用保存着我们注入的语句时发生了注入,这就是二阶注入,有点类似存储型XSS漏洞的意思。

二阶注入演示

实验环境介绍

text数据库里有张users表,目前里面已有admin和root账户

【23】WEB安全学习----MySQL注入-8(二阶注入)_第1张图片

用户注册页面


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

用户密码修改页面


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

二阶注入演示

首先用户注册页面,对用户提交的数据进行了check()函数过滤,对单引号和双引号进行了闭合,故无法闭合SQL语句。

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

【23】WEB安全学习----MySQL注入-8(二阶注入)_第2张图片

这里很明显,无法直接一阶注入,但用户修改密码页面对这个表中的数据没有过滤或限制就调用了(开发人员相信数据库中数据),那么此时就存在二阶注入。

首先注册一个用户名为:admin'#的用户,经过check函数就变成了admin''#,此时就无法直接注入。

【23】WEB安全学习----MySQL注入-8(二阶注入)_第3张图片

在数据库中,已插入一个用户名为admin'#的用户

【23】WEB安全学习----MySQL注入-8(二阶注入)_第4张图片

然后在用户修改密码界面中,输入admin'#用户和相应的密码

此时,修改密码的SQL为:


   
   
   
   
  1. UPDATE users SET passwd= md5( '123123') WHERE username= 'admin'# ';
  2. =
  3. UPDATE users SET passwd=md5(' 123123 ') WHERE username=' admin ';

【23】WEB安全学习----MySQL注入-8(二阶注入)_第5张图片

【23】WEB安全学习----MySQL注入-8(二阶注入)_第6张图片

此时,查看数据中记录,发现是admin用户的密码被修改了。

【23】WEB安全学习----MySQL注入-8(二阶注入)_第7张图片

 

你可能感兴趣的:(注入)