确认并利用 SQL 盲注漏洞

目录

一、相关知识与技能

二、实验内容:

三.原理剖析

四.补充

五.拓展

六.实验总结


一、相关知识与技能

1.sql介绍

SQL (Structured Query Language) 是具有数据操纵和数据定义等多种功能的数据库语言,这种语言具有交互性特点,能为用户提供极大的便利,数据库管理系统应充分利用SQL语言提高计算机应用系统的工作质量与效率。SQL语言不仅能独立应用于终端,还可以作为子语言为其他程序设计提供有效助力,该程序应用中,SQL可与其他程序语言一起优化程序功能,进而为用户提供更多更全面的信息


2.sql分类

SQl注入根据注入效果可以分为:UNION联合注入、报错注入、布尔盲注、时间盲注、堆叠注入、二次注入等,按照提交方式可以分为:GET注入、POST注入、HTTP头注入,以及其他分类。

UNION联合注入:联合注入的前提条件是用户可控参数所在Sql语句为查询语句,且以页面存在回显,如:select * from users where id=”$id”;。此时可以通过更改参数id来实现对数据库的操作。考虑到前提是查询双方具有相同的列,可以使用order by 语句大致判断列数,也可以使用select 1,2,3,4等依次查看。UNION联合注入往往是最实用的,因为判断了回显位后就可以拼接语句union select version()等获取数据库信息,当然如果权限允许也可以在information_schema中查看全部数据库信息。在查询过程中可能会遇到查询结果有多个数据,但页面只显示一段,可以使用concat()、group_concat()等函数。

布尔盲注:与UNION联合注入不同,布尔盲注用于页面无回显信息,但不同的语句会有不同的效果,如:id=1,页面显示登入成功,但当输入id=0(前提是数据库中没有id=0)时,页面显示登入失败或什么都不显示,此时就可以用布尔盲注来判断语句的真假。如id=0’ or length(database())>4 --+ 可以判断数据库的名称的长度,有了长度后就可以逐字符判断,如:id=0’ or substring(database(),1,1)=’s’--+表示判断从数据库名第一个字符开始截取一个字符判断是否是字符s。也可以构造一些特殊语句如:id=0’ord(substring(database(),1,1))=65 --+ ord函数可以将字符转换成ascii码,就可以将65设为变量,使用字典爆破的方法逐一判断,也可以直接爆破数据库名和其他表名、字段名等等。

时间盲注:时间盲注用于当输入不同的语句后页面效果一样的情况,时间盲注多与if(),sleep()函数使用,if(1=1,sleep(1),1)表明如果1=1,Sql查询休眠1秒,否则返回1,可以通过页面响应时间判断语句的正确。其他语句的拼接与布尔盲注一样。

报错注入:报错注入可用于Sql语句执行错误后页面会显示错误信息的情况,报错注入的前提条件是后端脚本中有mysql_error等报错函数。常见的报错方法有extractvalue()函数、updatexml()函数、floor型报错、整数溢出报错、几何函数报错等。在Mysql5.1.5版本以上,可以使用XPATH报错(extractvalue函数、updatexml函数),这两个函数用与查询修改xml文档,extractvalue()函数的使用extractvalue(xml文档,文档路径),文档路径的格式是/xx/xx/xx,若格式错误,会显示错误路径。如:id=0’or (select extractvalue(1,concat(‘!’,database()))) --+会显示(!数据库名)路径错误。floor型注入一般要与rand函数、group by一起使用。group by用于给查询数据分组,分组依据为by后面的语句,先创建虚拟表,然后在查询数据时,从数据库中取出数据,看在虚拟表中是否有同样的记录, 如果有,就在相应字段加一,如果没有就直接插入新记录。rand函数用于生成随机数,rand(0)表明生成一个0-1的随机数,但rand()确实是随机数,rand(0)生成的是有规律的随机数,floor函数用于向下取整,所以floor(rand(0)*2)只返回0或1,且为011011011…。查询中如果使用rand()的话,该值会被计算多次,也就是在使用group by 的时候,floor(rand(0)*2)会被执行一次,如果虚拟表中不存在记录,把数据插入虚拟表中时会再被执行一次。分析语句:select count(*) group by floor(rand(0)*2),查询前会建立虚拟表,取第一条记录&

### SQL攻击预防与检测方法 #### 预防措施 为了防止SQL攻击,应用程序应当采用参数化查询或者预编译语句来构建SQL指令。这种方式能够有效区分代码逻辑同用户输入的数据边界,从而阻止恶意构造的字符串被当作实际执行的部分[^1]。 另外,在设计数据库架构时应遵循最小权限原则,即授予应用所需的最低限度访问权利;对于敏感操作实施严格的认证授权机制,定期审查账户及其拥有的特权以确保安全性。 #### 输入验证与清理 强化输入校验流程也是抵御此类威胁的重要手段之一。具体做法包括但不限于: - 对所有来自客户端提交的信息进行全面过滤; - 移除潜在危险字符(如单引号、分号等),限制字段长度; - 利用正则表达式匹配预期模式之外的内容予以拦截或提示错误消息返回给前端处理。 #### 错误信息控制 当遇到异常情况时,服务器端应回避暴露过多内部细节至响应报文中去——这有助于减少泄露有关DBMS版本型号乃至表结构布局方面的线索供黑客利用的可能性。取而代之地提供通用性的失败说明即可满足业务需求的同时保护系统隐私。 #### 日志记录与监控审计 建立健全的日志体系用于追踪可疑行为轨迹至关重要。通过配置WAF(Web Application Firewall)组件或者其他专门的安全设备实现对进出流量实时监测分析功能,则可以在第一时间察觉到正在发生的入侵企图进而采取相应对策加以遏制扩散范围扩大造成更大损失风险。 ```sql -- 使用预编译语句示例 (Java) PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM users WHERE username=? AND password=?"); pstmt.setString(1, userInputUsername); pstmt.setString(2, hashPassword(userInputPassword)); ResultSet rs = pstmt.executeQuery(); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

计算机网络技术2班-伍烽燕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值