CTF_ctfshow_web9_sql注入

打开靶机:

 手工注了一下,发现没有注入点,然后查看了一下robots.txt协议

 提示了index.phps

访问一下

下载下来了源码:


<?php
        $flag="";
        $password=$_POST['password'];
        //密码长度<10
        if(strlen($password)>10){
            die("password error");
        }
        $sql="select * from user where username ='admin' and password ='".md5($password,true)."'";
        $result=mysqli_query($con,$sql);
            //mysqli_num_rows:取结果中行的数目
            //存在结果
            if(mysqli_num_rows($result)>0){
                //mysqli_fetch_assoc:从结果中取一行作为关联数组
                    while($row=mysqli_fetch_assoc($result)){
                         echo "登陆成功<br>";
                         echo $flag;
                     }
            }
    ?>

php代码审计可得

账号:admin

密码:<10并且md5(,true)

md5(string,raw):

  • 默认不写为FALSE。32位16进制的字符串
  • TRUE。16位原始二进制格式的字符串

要为true,所以可以构造一个字符串:ffifdyop

md5之后:276f722736c95d99e921722cf9ed621c

  然后我们得到的sql语句就是 SELECT * FROM admin WHERE username = 'admin' and password = ''or'6�]��!r,��b'

       为什么password = ''or'6�]��!r,��b'的返回值会是true呢,因为or后面的单引号里面的字符串(6�]��!r,��b),是数字开头的。当然不能以0开头。(我不知道在数据库里面查询的时候,�这种会不会显示)

       这里引用一篇文章,连接在下面,里面的原话“a string starting with a 1 is cast as an integer when used as a boolean.“

      在mysql里面,在用作布尔型判断时,以1开头的字符串会被当做整型数。要注意的是这种情况是必须要有单引号括起来的,比如password=‘xxx’ or ‘1xxxxxxxxx’,那么就相当于password=‘xxx’ or 1  ,也就相当于password=‘xxx’ or true,所以返回值就是true。当然在我后来测试中发现,不只是1开头,只要是数字开头都是可以的。
所以回过头来为什么ffifdyop就是答案,因为ffifdyop的md5的原始二进制字符串里面有‘or’6这一部分的字符。那么进一步思考这个单引号是否是必要的,这两个单引号是为了与原有的语句的单引号配对。所以我们理解了这个sql注入的原理,那么就明白了我们需要怎样的字符串。

当然答案也不止ffifdyop这一个

也有129581926211651571912466741651878684928

因为这里md5之后会有"or'8开头的,所以也为true

但本题有password<10的限制条件,所以这个在这儿行不通的。

输入密码之后获得flag

 

over!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值