web基础漏洞-sql注入
1、介绍
sql注入,是前端输入,参数未经过严格检查,拼接到sql语句中,交给sql应用执行。
2、场景
2.1 sql语句分类
sql注入,可以按照sql语句进行划分类型,主要为增删改查。广义上来说,各个参数都有可能作为sql注入的点,通过构造payload,使得超出预期的sql语句结构。
2.2 查询赋值
insert或update语句,将查询到的内容赋值给字段,然后攻击者可以正常查询获取信息。
2.3 超范围执行
针对update、delete和select语句的where条件部分,使其超出原本的执行范围,甚至全表执行。
2.4 盲注
针对update、delete和select语句的where条件部分,进行布尔盲注或时间盲注,获取信息
2.5 联合查询
针对select语句,基于union语法查询信息
2.6 报错注入
主要基于updatexml或exeact函数,进行查询信息
2.7 堆栈注入
四种基本sql语句类型,都可能实现
2.8 条件验证
典型的是登录验证
2.9 读写文件
2.10 系统命令执行
3、防护
预编译
4、发现测试
4.1 单双引号
添加单双引号,查看是否直接报sql异常。如果报异常则说明存在sql注入
4.2 数值测试
以?id=5为例,测试id=6-1和id=5-0的响应字符长度是否一致。如果一致则说明存在sql注入
4.3 逻辑测试
and 0和and 1的响应体部字符长度不同,and 1和and 2的响应体部字符长度相同,则说明存在sql注入。
- 无引号、单引号或双引号
- 无括号,一组括号,多组括号
- 函数的必要参数个数与类型
- 无注释,有注释,以及多种注释
- 需要注意url编码
and 0
and 1
and 2
4.4 sleep测试
- and sleep(),注意sleep返回false
- 根据是否大幅度延迟判断是否存在sql注入
- 注意,如果本身网络波动大,卡顿长,不适合sleep测试。
- sleep可能造成服务端资源消耗大,或者说等待时间长。所以,一般sleep测试时会添加limit或者and now()<'',限制延迟时间
4.5 其它测试
- 如果是测试环境,可以直接超范围执行。
- insert或update语句,可以设置查询版本作为值
- order by是否有效或报错