SQL注入实战篇
今天要介绍的是SQL注入实验。SQL注入攻击的学习,我们更多的目的是为了学习攻击技术和防范策略,而不是刻意去攻击数据库。
首先我们先进入实验地址《SQL 注入》。
SQL注入是一种代码注入技术,过去常常用于攻击数据驱动性的应用,实质就是将恶意的SQL代码注入到特定字段用于实施拖库攻击等。SQL注入的成功必须借助应用程序的安全漏洞,例如用户输入没有经过正确地过滤(针对某些特定字符串)或者没有特别强调类型的时候,都容易造成异常地执行SQL语句。SQL注入是网站渗透中最常用的攻击技术,但是其实SQL注入可以用来攻击所有的SQL数据库。以Sql注入产生的直接原因是拼凑SQL,绝大多数程序员在做开发的时候并不会去关注SQL最终是怎么去运行的,更不会去关注SQL执行的安全性,正是有了这种懒惰的程序员SQL注入一直没有消失。这种漏洞不是不可以避免,只是程序员没有这种安全意识。
对于注入漏洞来说,可能现在很多人认为它已经过时,因为这种漏洞可以被参数化查询而杜绝。以前对这种漏洞的防御方式主要有三种:
字符串检测:限定内容只能由英文、数字等常规字符,如果检查到用户输入有特殊字符,直接拒绝。但缺点是,系统中不可避免地会有些内容包含特殊字符,这时候总不能拒绝入库。
字符串替换:把危险字符替换成其他字符,缺点是危险字符可能有很多,一一枚举替换相当麻烦,也可能有漏网之鱼。
存储过程:把参数传到存储过程进行处理,但并不是所有数据库都支持存储过程。如果存储过程中执行的命令也是通过拼接字符串出来的,还是会有漏洞。
我们还是来实践吧,这样更好理解。
我们先看一下实验的大致思路
(1)找注入并确认(经典的and 1=1 and1=2)
(2)查询基本信息(数据库类型、数据库名、应用程序类型以及系统类型)
(3)查表名、字段名,拿到想查询的内容
首先我们看一下源码
这就是这一段sql查询语句造成了最常见的SQL注入。我们继续实验,这次利用到了dvwa,我们登录dvwa然后选择SQL Injection 底下难度选择low。
先进行sql注入的第一步测试是否存在sql注入漏洞。
ID等于1的时候可以正常回显
And 1=1可以正常回显
And 1=2返回错误
这里直接返回了首页,和and 1=1返回的页面不一样。这里存在SQL注入。
为什么这样就判断有sql注入了呢?原理是把测试语句代入到了数据库查询,and就是逻辑运算,1=1为真,1=2为假,所以返回不同。
好我们接下来进行第二步判断字段数,order by 2返回正常order by 3返回错误。
字段数已经判断出来,下面如何进一步判断数据库名和用户名等基本信息。
利用语句查询知道有两个字段,接着查询数据库名和用户。
查询数据库等基本信息。
UNION SELECT 1,CONCAT_WS(CHAR(32,58,32),user(),database(),version())
这是直接返回了数据库的usr database version。我们知道数据库的名字不就可以利用查询语句找到表的名字。
查询表段
union select 1,table_name from information_schema.tables where table_schema=0x64767761(数据库的十六进制)
查询列名
union select 1,column_name from information_schema.columns where table_name=0x7573657273(表的十六进制) and table_schema=0x64767761(数据库的十六进制)
查询用户名密码
union select password,user from users
这就把用户名跟密码爆出来了。
sql注入还不止这点,还有很多类型:
1)注入分为哪几种类型?分类依据是什么?是否唯一?
2)普通注入和盲注的区别是什么?利用方法有什么不同?
本次的实验就介绍到这里,注意多加总结和思考课后问题!我们学习的目的除了了解之外,更重要的是学习如何防范SQL注入。在面对SQL注入攻击的时候,了解其原理才能更好的防范。
下面总结几点防范SQL注入攻击的要点:
1.永远不要信任用户的输入,要对用户的输入进行校验,可以通过正则表达式,或限制长度,对单引号和双"-"进行转换等。
2.永远不要使用动态拼装SQL,可以使用参数化的SQL或者直接使用存储过程进行数据查询存取。
3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
4.不要把机密信息明文存放,请加密或者hash掉密码和敏感的信息。
5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装,把异常信息存放在独立的表中。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
为什么 Java 中“1000==1000”为false,而”100==100“为true?
为什么 Java 中“1000==1000”为false,而”100==100“为true?这是一个挺有意思的讨论话题。 如果你运行下面的代码: Integera=1000,b=1000; System.out.println(a==b);//1 Integerc=100,d=100; System.out.println(c==d);//2 你会得到 false true 基本知识:我们知道,如果两个引用指向同一个对象,用==表示它们是相等的。如果两个引用指向不同的对象,用==表示它们是不相等的,即使它们的内容相同。 因此,后面一条语句也应该是false 。 这就是它有趣的地方了。如果你看去看 Integer.java 类,你会发现有一个内部私有类,IntegerCache.java,它缓存了从-128到127之间的所有的整数对象。 所以事情就成了,所有的小整数在内部缓存,然后当我们声明类似—— Integerc=100; 的时候,它实际上在内部做的是: Integeri=Integer.valueOf(100); 现在,如果我们去看valueOf()方法,我们可以看...
- 下一篇
Node.js 免费入门在线培训现已推出
Node.js作为极为流行的开源JavaScript运行时,被许多技术领域领先的大公司所广泛使用,包括彭博社、LinkedIn、Netflix、NASA等。Node.js以其速度、轻量级的足迹和轻松扩展的能力而备受推崇,使其成为微服务架构的首选。Node.js的使用和吸收速度稳步增长,市场一直在渴求更多具备使用该技术知识和技能的人才。 然而,对于那些想要开始学习Node.js的人来说,学习路径并不是很清晰。虽然有许多免费资源和论坛可以提供帮助,但它们需要个人进行学习规划、研究和组织,这可能会使一些人感觉学习这些技能很困难。因此,Linux基金会开源软件大学和OpenJS基金会联合发布了全新的免费在线培训课程Node.js入门。这门课程是为那些想要更加熟悉Node.js的基础知识及其最常见的用例的前端或后端开发人员设计的。涵盖的主题包括如何快速构建命令行工具、模拟RESTful JSON API和实时服务原型。您还将发现和使用各种生态系统和Node核心库,并了解Node.js的常见用例。 通过让自己沉浸在全栈开发体验中,这门课程为学习者带来全面的Node.js与网络平台相关的背景知识,同...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS6,CentOS7官方镜像安装Oracle11G
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- 设置Eclipse缩进为4个空格,增强代码规范
- Mario游戏-低调大师作品
- MySQL8.0.19开启GTID主从同步CentOS8
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果