sql注入之or 1 = 1

本文介绍了如何利用SQL注入技巧绕过后端验证,通过'or1=1'和'or1=1#'的策略,解释了如何利用逻辑运算避开条件检查。重点讲解了利用空字符串和特殊字符进行条件构造的原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

select * from users where username='$username' and password='$password'

众所周知,

一般的结构查询语句的结构如下:

SELECT *

FROM table_a

WHERE x=y

其中,以上语句的select,from,where是不区分大小写的,一般分行写select,from,where语句。select一般是查询结果要展示的字段,from后一般是要查询的表名,where是进行行数据筛选的条件。

而sql注入中,username和passwd未知的情况下,我们可以通过注入来绕过后端的检测,比如

or 1 = 1

select * from users where username=' ' or 1='1' and password='123'

注:输入的是  ' or 1 = '1,单引号必须带,不然会语法错误,应为有逻辑关系的存在,and优先级比or高,所以先执行and后的内容与前面相匹配,而passwd为123是真,(数据库里保存的passwd值不存在猜测值时,建议前后同时饶过)看前面的内容username的值,而这里出现了or,逻辑比较的时候,1=1恒成立,也就意味着and前真后真是成立的,从而进行绕过

还有一种,or 1= 1#,在sql语法里,#是注释符以后的内容全省略,

且SQL语句中where相当于判断语句,由 or 连接,则:

select * from users where username=' ' or 1=1#' and password='ijcjds'

等于

select * from users where username=' ' or 1=1

or进行运算,1=1恒成立为真,则全真

### SQL 注入无回显情况下的解决方案 在处理 SQL 注入攻击特别是当应用程序不提供任何错误消息或反馈时,可以采用多种技术来检测并利用漏洞。对于 `OR 1=1` 这种经典的注入语句,在缺乏直接响应的情况下,盲注成为主要手段。 #### 时间延迟注入法 通过引入时间延迟函数如 MySQL 的 `SLEEP()` 或者 PostgreSQL 中的 `pg_sleep()`, 可以让服务器执行特定秒数的等待操作。如果页面加载速度明显变慢,则表明存在可被利用的注入点[^1]。 ```sql ' OR IF(1=1, SLEEP(5), 0) -- ``` 此方法适用于那些即使成功查询也不会返回额外数据给用户的场景下验证是否存在SQL注入的可能性。 #### 基于布尔条件判断的数据提取 另一种方式是基于布尔逻辑逐位猜解数据库中的信息。例如可以通过不断调整比较字符直到获得预期的结果(通常是页面正常显示),以此推断出目标字段的内容[^2]。 ```sql ' AND ASCII(SUBSTRING((SELECT table_name FROM information_schema.tables LIMIT 1 OFFSET X),Y))>Z -- ``` 上述例子展示了如何逐步获取表名的一个字母。其中X表示要读取第几个表,Y代表当前猜测的是该字符串的位置,Z则是用于二分查找ASCII码值范围内的中间数值. 针对Pikachu框架的具体实现方案: 由于 Pikachu 是一个专门设计用来学习Web安全概念的教学平台,其内置了一些已知的安全缺陷供实验研究之用。因此,在这个环境中测试不同的防御措施非常方便。为了防止SQL注入的发生,建议采取如下预防策略: - 使用参数化查询或者预编译语句代替动态拼接SQL命令; - 对输入进行全面严格的校验过滤; - 设置最小权限原则连接数据库账号; 这些通用的最佳实践同样适用于其他真实世界的开发项目当中[^3].
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值