web安全——sql注入漏洞知识点总结

注意:这篇文章是我的学习总结,仅供大家学习。

需要了解mysql知识链接:mysql知识点总结链接

1、SQL注入漏洞定义:

SQL是发生于应用程序与数据库层的安全漏洞,网站内部直接发送的SQL请求一般不会有危险,但实际情况是很多时候需要结合用户的输入数据动态构造SQL语句,如果用户输入的数据构造成恶意SQL代码,web应用又未对动态构造的SQL语句使用的参数进行过滤,则会带来意想不到的危害。

前置知识补充:

mysql中重要的数据库:

information_schema数据库------其中保存着关于mysql服务器所维护的所有其他数据库的信息,比如数据库名,数据库表,表字段的数据类型与访问权限等,web渗透中用途很大。

SCHEMDATA表:**提供了当前mysql实例中所有的数据库信息,show databases结果来自这个表。

TABLES表 :提供了关于数据库中所有表的信息。字段table_schema是数据库名。字段table_name是表名

COLUMNS表 :纪录了全部数据库的字段。字段column_name是列名,表示当前表中的字段名

mysql数据库------mysql这个数据库中表user,存储量数据库中的用户名、密码

2、GET型SQL注入漏洞定义

我们在提交网页内容时候,主要分为GET方法,post方法。GET方法提交的内容会显示在网页url上,通过对url连接进行构造,可以获得超出权限的信息内容。

3.检查get型sql注入漏洞的一般步骤(没有过滤)

(1)判断是否存在注入点(如果拼接到sql语句中被当做代码执行,则存在注入点)

and 1=1

and 0

'

/

当添加这个数字后,页面不能正常显示,则存在注入点。

(2)判断字段数

order by数字(排序,判断字段数。oder by 1 表示对第一个字段进行排序,order by 2就是对第二个字段进行排序。)

详细解释:

根据数据库相关知识,数据库中可以有多张表,一个表里面有多个字段(比如:学生表中的字段包括------学号、姓名、性别等),**oder by不仅可以对查询结果进行排序,而且当在oder by后面指定数字(x)的时候,表示根据第x字段对查询数据进行排序。如果x的数值大于,表中字段数真实值,就会报错。此时我们就可以通过调整x的值,确定表中的字段数。**确定字段数很重要,因为当确定好当前表中的字段数后,我们就可以通过union查询获取到更多数据库相关知识。

(3)判断显错位

根据第二步操作,我们已经确定了字段数,接下来,我们使用union联合查询语句,就可以拼接一个构造sql语句的结果,从而达到信息获取的目的。

联合查询解释:就是将多次查询的结果合并起来,形成一个新的查询结果。

比如:前提条件:a表:id int;name varchar(20)

b表:age int;address varchar(20)

select * from a union select *from b;这个查询语句就会将表a和表b的结果合并成一张表。

注意事项:使用联合查询的多张表,多张表的列数必须保持一致,字段类型也需要保持一致,并且返回字段数必须一致。

在web安全中union的使用:

首先让网页报错,其次要使用union查询,获取相应的信息。

常见的构造语句:正常sql语句 and 1=2(让联合语句的前半句失效,从而执行我们构造的sql语句) union select 1,2,..,x (x表示当前表的字段数)

语句解释:联合查询后半句中,我们发现select 语句后面跟的是数字,而不是字段名。表示从表的第几(i)个字段(如:第一个字段对应的字段名是name,则相当于是select name,2..x)获取数据。同时我们发现后半句没有指定表名,这并不会报错,而是将select后面的数字依次添加到前半句查询的结果中。

(4)判断数据库名

根据联合查询union的报错列表,用database()替换回显位或显错位,执行了select database()查询当前使用的数据库信息。

(5)判断表名

根据文章开头补充的知识,我们可以知道information_schema数据库中的tables表和columns表很重要。因为可以通过这两张表确定管理员信息所在的表,从而获取敏感信息。

接下来是利用tables表和columns表的实例:

and 0 union select 1,table_name from information_schema.tables where table_schema="web回显得到的数据库名称" limit 0,1;

解释:首先and 0 是为了制造一个错误回显,目的是为了执行后面的union语句,table_name位置是错误回显的位置,该字段表示"表名",从information_schema数据库中的tables表中获取,并且获取的表名是来自"web回显的数据库",语句最后结合limit语句是为了获取数据库中的多张表的表名。

limit用法解释:limit 0,1------0表示从第一行开始显示,1表示只显示一行。

最后当我们获取得到数据库中的所有表后,根据实际的经验对表进行筛选,最终确定管理员所在表名。

(6)判断字段名

当目前为止我们已经知道了管理员所在表名,接下来我们就需要根据表名,检查表中的字段,然后判断筛选出管理员的用户名和密码。

在这个过程中我们就需要使用到information_schema数据库中的columns表,并且根据column_name字段进行查询。同时也需要划定范围是"数据库名是web回显的数据库"和"表名是经过分析筛选出的表名"。

接下来是判断字段名的实例:

and 0 union select 1,column_name from information_schema.columns wher table_schema=database()(或者是错误回显的数据库名)and table_name="管理表名" limit 0,1

解释:and 0 制造一个错误回显,为了执行后面我们构造的sql语句,column_name是错误回显的位置,从information_schema数据库中的columns表中获取数据,条件判断为:"数据库是错误回显的数据库"和"表是管理者表"。

这条语句中使用limit的作用是:获取出管理员表中的多个字段。

(7)查询值

经过以上六步,我们得到了管理员所在的表以及表中字段名,接下来就可以获取到管理员的用户名和密码。

实例如下:

and 0 union select 1,获取到的字段名 from 管理员表

解释:and 0 制造错误回显,为了执行后面的union语句,通过基本的查询语句,可以获取到管理员的账户信息。

通过获取到的密码是经过加密的,所以还需要对得到的密码使用在线解码器进行解码。

相关推荐
_.Switch2 小时前
高级Python自动化运维:容器安全与网络策略的深度解析
运维·网络·python·安全·自动化·devops
JokerSZ.2 小时前
【基于LSM的ELF文件安全模块设计】参考
运维·网络·安全
SafePloy安策2 小时前
软件加密与授权管理:构建安全高效的软件使用体系
安全
芯盾时代3 小时前
数字身份发展趋势前瞻:身份韧性与安全
运维·安全·网络安全·密码学·信息与通信
北京搜维尔科技有限公司5 小时前
搜维尔科技:【应用】Xsens在荷兰车辆管理局人体工程学评估中的应用
人工智能·安全
云起无垠5 小时前
技术分享 | 大语言模型赋能软件测试:开启智能软件安全新时代
人工智能·安全·语言模型
Frank牛蛙5 小时前
1.每日SQL----2024/11/7
数据库·sql
上海_彭彭5 小时前
【提效工具开发】Python功能模块执行和 SQL 执行 需求整理
开发语言·python·sql·测试工具·element