学习笔记-SQL注入-2

SQL注入-二次注入(原理):

二次注入的原理,在第一次进行数据库插入数据的时候,仅仅只是使用了addslashes 或者是借助get_magic_quotes_gpc对其中的特殊字符进行了转义,但是addslashes有一个特点就是虽然参数在过滤后会添加“1”进行转义,但是“)”并不会插入到数据库°中,在写入数据库的时候还是保留了原来的数据。
在将数据存入到了数据库中之后,开发者就认为数据是可信的。在下一次进行需要进行查询的时候,直接从数据库中取出了脏数据,没有进行进一步的检验和处理,这样就会造成SQL的二次注入。比如在第一次插入数据的时候,数据中带有单引号,直接插入到了数据库中;然后在下一次使用中在拼凑的过程中,就形成了二次注入。

简单来说就是对数据没有进行检测,导致再次调用这个数据的时候会照成数据和SQL语句进行拼凑形成二次注入

SQL利用:

以 sqli-labs less 24 为例
(1)查看初始 users 表

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

 

(2)注册用户

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

 

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

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

 我们可以在该 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 的密码的目的
  具体代码

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

4、防御措施

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值