sql注入讲解
1、输入1' 发现数据库报错,原因是我们的输入直接被代入到数据库查询语句里面。
2、有没有办法可以不让他报错呢?可以尝试一下构造正确的数据库语法,使之不报错。比如输入 1 and 1=1 试试
select * from wuser where id = 1 and 1=1; 1=1永远成立,id=1也是同样存在,所以这个查询不会报错,会输出正确信息。
然后尝试 id = 1 and 1=2 ,结果不显示,说明我们构造的语句成功在数据库中执行了。
3、成功执行后,仅仅是跟正常查询显示相同的内容,那有没有办法可以显示其他内容呢?我们在mysql中使用union select来实现。
union select的作用是拼接在正确数据库查询语句后面进行联合查询,union select查询的字段数一定跟主查询的字段数一致。
比如 select id ,user ,pass from wuser 这是主查询,查询的字段是3个,所以后面的union select的查询字段一定也是3个。
select * from wuser where id = 1 union select 1,2,3;
4、union select查询成功后显示的还是没有变,其原因是主查询也成功返回了结果,而页面上只显示了返回结果的第一行,因此要想看到union select的结果,需要令第一行也就是主查询的结果为空。常用的办法就是把主查询的1改成-1.
5、mysql中有几个默认自带的库和查询函数。我们就可以使用这些来查出数据库中所有的内容。
自带的函数有:database(),version(),user()
自带的库有:information_schema,此库只有mysql5.0以后的版本才有。
在之前union select显示的数字位置,将数字替换成查询
union 查询的一般步骤:
1、通过and 1=1,and 1=2的输入,来判断是否存在注入点。如果结果不一致,说明我们输入的语句被数据库执行了。
2、通过观察或报错信息来判定输入点的数据类型,数字型,字符型,搜索型
3、使用order by来确定主查询数目。orderby本质上是一个排序的语法,但是order by有个条件,就是排序必须建立在正确的主查询条数上。所以在注入中用order by并不是为了排序,而是为了确认主查询的条数,确保union select的查询数与主查询一致。order by只会在超出主查询列数后才会报错,小于或等于主查询列数不报错。
4、使用union select 查询,将主查询项改成负数或不存在,select * from wuser where id = -1 union select 1,2,3
5、在显示的数字位置上,替换对应的查询语句,database(),version(),user()
6、使用information_schema进行所有内容查询,以下用课堂上的查询来举例:
a.使用database()得知当前的库名:woniu
b.根据库名列出所有的表名:SELECT group_concat(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA = "库名"
-1 union select 1,(SELECT group_concat(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA = "woniu"),3
c.根据库名woniu 表名 wstu 列出所有的列名:num,name,age
SELECT group_concat(COLUMN_NAME) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = "库名" AND TABLE_NAME = "表名"
d、知道表名和列名,可以直接查出表的内容
select group_concat(num) from wstu;select group_concat(name) from wstu;select group_concat(age) from wstu;
字符型注入:
字符型和数字型原理一样,只是需要注意下语法规范问题。
正常数字查询:select * from wuser where id = 1;
字符查询:select * from wuser where id = '1';
字符型的注入语句就变成 select * from wuser where id = '1 and 1=1'; 发现我们输入的内容都被包裹在单引号内,不能执行我们想要的sql语句,因此就要想办法去构造payload来脱离单引号包裹。
字符型注入的payload: id = 1' and 1=1 #
在sql查询中就变成了 select * from wuser where id = '1' and 1=1#'
我们通过自己添加的单引号跟原有的第一个单引号闭合,然后执行我们的sql注入语句,原来的第二个单引号因为无法处理,所以用#注释掉。
最终形成 select * from wuser where id ='1' and 1=1
在mysql中注释符有两种:#和--空格,通常我们在页面上使用话,要转换成url编码,#转换成%23,--空格转换成--+
判定字符型注入和数字型注入的区别:
输入单引号报错后将报错信息取出进行比对。
报错的是:''1''' ,首先去掉报错文本的单引号-》'1''->去掉我们的输入1'-》'' ,发现剩下一对单引号,说明是字符型
报错的是:'1'',首先去掉报错文本的单引号-》1'->去掉我们的输入1'-》 ,发现没有引号留下,说明是数字型
字符型不一定就是单引号,也有双引号,也有括号等等,就要根据实际的报错情况去试探出查询的语法。
搜索型和字符型的用法相同,也是要考虑到闭合和注释的。
搜索型的语法一般是:select * from wuser where id like '%1%';
sql注入讲解的更多相关文章
- 实例讲解 SQL 注入攻击
这是一篇讲解SQL注入的实例文章,一步一步跟着作者脚步探索如何注入成功,展现了一次完整的渗透流程,值得一读.翻译水平有限,见谅! 一位客户让我们针对只有他们企业员工和顾客能使用的企业内网进行渗透测试. ...
- SQL注入原理讲解,很不错!
SQL注入原理讲解,很不错! 原文地址:http://www.cnblogs.com/rush/archive/2011/12/31/2309203.html 1.1.1 摘要 日前,国内最大的程序员 ...
- 梨子带你刷burp练兵场(burp Academy) - 服务端篇 - Sql注入配套漏洞讲解笔记
目录 Sql注入 什么是Sql注入呢? Sql注入有哪些例子? 检索隐藏数据 打破应用逻辑 利用Union进行跨库查询 如何确定利用Union的注入攻击所需的列数呢? 如何确定Union的查询结果中哪 ...
- 【转载】SQL注入原理讲解
这几篇文章讲的都很不错,我看了大概清除了sql注入是怎么一回事,打算细细研究一下这个知识,另写一篇博客: 原文地址:http://www.cnblogs.com/rush/archive/2011/1 ...
- 84)PHP,SQL注入基础讲解
怎么预防: 填写防止SQL注入的代码:
- SQL注入攻防入门详解
=============安全性篇目录============== 本文转载 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱,事实上是没机 ...
- DAY5 DVWA之SQL注入演练(low)
1.设置 把安全等级先调整为low,让自己获得点信心,免得一来就被打脸. 2.测试和分析页面的功能 这里有一个输入框 根据上面的提示,输入用户的id.然后我们输入之后,发现它返回了关于这个 ...
- SQL注入的字符串连接函数
在select数据时,我们往往需要将数据进行连接后进行回显.很多的时候想将多个数据或者多行数据进行输出的时候,需要使用字符串连接函数.在sqli中,常见的字符串连接函数有concat(),group_ ...
- 利用SQL注入漏洞登录后台的实现方法
利用SQL注入漏洞登录后台的实现方法 作者: 字体:[增加 减小] 类型:转载 时间:2012-01-12我要评论 工作需要,得好好补习下关于WEB安全方面的相关知识,故撰此文,权当总结,别无它意.读 ...
随机推荐
- Codeforces Round #622 (Div. 2) 1313 C1
C1. Skyscrapers (easy version) time limit per test1 second memory limit per test512 megabytes inputs ...
- C++ 模板(template) 的定义
定义: 模板(template)是实现代码重用机制的一种工具,它可以实现类型参数化,把类型定义为参数(模板元编程),从而实现了真正的代码可重用性. 模板是用来批量生成功能和形式都几乎相同的代码的.编译 ...
- docker批量删除本地镜像和容器
长时间运行docker,每次只用docker kill去停止容器,但是从没删除过本地镜像,导致有上百个镜像在占用内存. 1.批量停止容器 docker container stop $(docker ...
- docker学习笔记一篇就通系列(持续更新)
docker三要素 仓库 镜像 容器 仓库 仓库用来存放docker的镜像,类似于github存放代码医养 镜像 镜像是一个模板,封装了应用程序和配置依赖的可交付的运行环境,这个打包好的运行环境就是镜 ...
- OSG程序设计之osg::Group
以下是一个简单的模型读取程序: #include <osgDB/ReadFile> #include <osgViewer/Viewer> #include <osg/N ...
- rsync 服务及部署
1 rsync简介 1.1 什么是rsync rsync: - a fast, versatile, remote (and local) file-copying toolrsync:是一种快速,多 ...
- Unity2019.3缺少Cinemachine插件/AssetStore搜索不到
Unity2019.1版本都还自带Cinemachine,到2019.3就没有了(原因暂时未知),PackageManager里没有,到资源商店里搜索也找不到 解决方法: Windows>Pac ...
- 【HBase】带你了解一哈HBase的各种预分区
目录 简单了解 概述 设置预分区 一.手动指定预分区 二.使用16进制算法生成预分区 三.将分区规则写在文本文件中 四.使用JavaAPI进行预分区 简单了解 概述 由上图可以看出,每一个表都有属于自 ...
- 在Qsys中创建用户自定义IP
在SOC FPGA的设计中,必须使用Qsys软件才能将ARM和FPGA之间的接口引入到FPGA设计中.为了设计上的方便,客户经常希望将Qsys中的一些接口信号引入到FPGA顶层设计文件中.本文以Ava ...
- PHP正则表达式语法汇总
首先,让我们看看两个特别的字符:'^' 和 ‘$' 他们是分别用来匹配字符串的开始和结束,一下分别举例说明"^The": 匹配以 "The"开头的字符串;&qu ...