当前位置:   article > 正文

SQL 注入之二次注入_sql二次注入

sql二次注入

目录

1、原理

二次注入的过程

2、实验过程

(1)查看初始 users 表

(2)注册用户

(3)修改用户密码

3、原因

  具体代码

4、防御措施


1、原理

        二次注入可以理解为,攻击者构造的恶意数据存储在数据库后,恶意数据被读取并进入到 SQL 查询语句所导致的注入。防御者可能在用户输入恶意数据时,对其中的特殊字符进行了转义处理;但在恶意数据插入到数据库时,被处理的数据又被还原并存储在数据库中,当 Web 程序调用存储在数据库中的恶意数据并执行 SQL 查询时,就发生了 SQL 二次注入。

二次注入的过程

(1)先构造语句(此语句含有被转义字符的语句,如 mysql_escape_string、mysql_real_escape_string 转义)

(2)将我们构造的恶意语句存入数据库(被转义的语句)

(3)第二次构造语句(结合前面已被存入数据库的语句构造。因为系统没有对已存入的数据做检查,成功注入)

2、实验过程

以 sqli-labs less 24 为例

(1)查看初始 users 表

发现初始 users 表中账号 admin 的密码为 admin

(2)注册用户

在网站注册名为 admin'-- - 密码为 123456 的用户

注册用户的主要代码如下:

  1. if (isset($_POST['submit']))
  2. {
  3. $username= mysql_escape_string($_POST['username']) ;
  4. $pass= mysql_escape_string($_POST['password']);
  5. $re_pass= mysql_escape_string($_POST['re_password']);
  6. //对注册账号时输入的数据进行转义
  7. echo "<font size='3' color='#FFFF00'>";
  8. $sql = "select count(*) from users where username='$username'";
  9. $res = mysql_query($sql) or die('You tried to be smart, Try harder!!!! :( ');
  10. $row = mysql_fetch_row($res);
  11. if (!$row[0]== 0)
  12. {
  13. ?>
  14. <script>alert("The username Already exists, Please choose a different username ")</script>;
  15. <?php
  16. header('refresh:1, url=new_user.php');
  17. }
  18. else
  19. {
  20. if ($pass==$re_pass)
  21. {
  22. $sql = "insert into users ( username, password) values(\"$username\", \"$pass\")";
  23. //创建账号的代码
  24. mysql_query($sql) or die('Error Creating your user account, : '.mysql_error());
  25. .........

 我们可以在该 php 文件末尾中添加一句代码,在网页中打印出创建的用户名。把自动跳转页面的代码注释,方便查看效果。

echo "Hint: The Query String you input is escaped as : ".$username ."<br>";

可以发现此时的用户名 admin'-- - 的单引号已被转义,不能在注册用户时就直接进行 sql 注入,只能进行二次利用,去实现 sql 注入获取数据。

(3)修改用户密码

我们先查看一下此时的 users 表,发现多了一个用户 admin'-- -,而不是刚刚网页打印出来的 admin\'-- -,这是因为创建用户的代码只是在单引号前加了一个 \ ,使得在执行的时候单引号被认为是字符串里的一个字符,而不是被当成 sql 语句中的单引号。

修改用户 admin'-- - 的密码

 再一次查看 users 表,发现用户 admin‘-- - 的密码并没有被修改,而是用户 admin 的密码被修改了。于是我们就有了 admin 的账户密码。

3、原因

在网站设计时,虽然过滤了注册的信息,把特殊字符进行了转义,但是在从数据库调用从外部保存下来的数据时,并没有进行过滤,使得“admin'-- -”被代入到 sql 语句执行,执行了这段 payload,达到了修改用户 admin 的密码的目的

  具体代码

  1. #原语句
  2. UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass'
  3. #插入 payload 后的语句
  4. UPDATE users SET PASSWORD='$pass' where username='admin'-- -' and password='$curr_pass'
  5. #此时 'admin' 后的语句被注释
  6. #真正的生效的语句
  7. UPDATE users SET PASSWORD='$pass' where username='admin'
  8. #从而达到了修改用户 admin 密码的目的

4、防御措施

(1)对外部提交数据谨慎

(2)从数据库取数据时,不能轻易相信查询出的数据,要做到同样的转义或是甄别

参考链接:SQL注入---二次注入_selecthch的博客-CSDN博客_二次注入

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/813722
推荐阅读
相关标签
  

闽ICP备14008679号