简介:在漏洞盒子挖洞已经有一段时间了,虽说还不是大佬,但技术也有所进步,安全行业就是这样,只有自己动手去做,才能将理论的知识变为个人的经验。本篇文章打算分享一下我在挖显错型SQL注入漏洞过程中的一些个人理解,如有不足也请大佬不吝指教。

0x00:什么是SQL注入

SQL注入,相信大多数人一开始接触安全,听说的第一种漏洞类型就会是SQL注入,众所周知,其本质就是将用户输入的数据当成了SQL语句来执行

开发过网站的朋友应该都清楚,大多数的小型企业或个人的站点大都采用了LAMP结构,即Linux + Apache + MySQL + PHP,当然还有一些其它常见的技术如下表:

操作系统 Web服务器 数据库 编程语言
Linux Apache MySQL PHP
Windows Server Nginx Oracle JSP
Tomcat SQL Server ASP
Python

总的来说,绝大多数网站都采用了动态Web开发技术,而动态Web开发离不开数据库,如果没有处理好这两者之间的关系,那么SQL注入就会随之而来了。

举例来说,当我们想要通过参数id来获取相对应的新闻时,整个过程简单来说就是用户通过URL请求新闻-->后台通过用户请求去数据库查询相对应的新闻-->将查询到的新闻回传给用户。在第二步查询相对应的新闻时,后台会执行SQL语句来查询,就像SELECT * FROM news WHERE id=''id的值是用户来控制的,当id=1时,就会返回id=1的新闻,id=2时返回id=2的新闻,以此类推,就可以动态的控制web界面了。

这时,当用户输入的id值不正确时,后台就无法获取相对应的新闻,前端就会没有数据显示,可当用户输入的数据为1'; DROP TABLE news-- a时,恐怖的事情就发生了,数据库中的news表被删除了,这就说明这个参数存在SQL注入

回到刚才用户输入的数据,拼接到后台查询数据时,整个SQL语句就变成了SELECT * FROM news WHERE id='1'; DROP TABLE news-- a',分析这条语句可知,用户输入的单引号闭合了id的值分号闭合了SELECT语句,然后又新建了一条DROP语句删除了表news,最后的-- a注释掉了id值后的那个单引号,SQL注入就这么产生了。

当一个站点存在SQL注入时用户的输入就可以传入数据库执行,理论上这样可以获得数据库的全部数据,也就是常说的脱库了。获得数据的方法也多种多样,可以通过页面直接返回想要查询的数据,也可以通过sleep延时函数猜测数据,都不行的话我们还可以使用DNS解析日志来获得数据。其中,最简单的一种方法就是显错型的SQL注入了。

显错型SQL注入只是SQL注入的其中一种,也是最简单的一种,对于这种漏洞的防范也特别简单,可这种漏洞在互联网中仍不计其数...这也可见全国乃至全球对于网络安全知识普及的不足,接下来,我会从三个方面来讲讲这种漏洞,分别是为什么会产生怎么利用以及怎么防范

0x01:为什么会产生显错型SQL注入

显错型SQL注入,看名字就能知道,使用这种方法可以直接在页面中返回我们要查询的数据,方法也很简单,即使用UNION联合查询即可。

但使用UNION联合查询时还要满足一个条件,那就是我们构造的SELECT语句的字段数要和当前表的字段数相同才能联合查询,即首先我们要确定当前表的字段数。order by x是数据库中的一个排序语句,order by 1即通过第一个字段进行排序。这时我们就可以构造SELECT * FROM news WHERE id='1' order by x-- a'来猜测当前表的字段数,x值递增,当页面返回数据异常时,即无当前字段时,用当前的x值减一即可得到当前表的字段数了。

知道了当前表的字段数,就可以进行UNION联合查询了。但联合查询时,页面只会显示查询到数据的第一条,也就是UNION前的SELECT语句的结果,想要显示我们自己联合查询的结果时,还必须使前一条语句失效,这里我们构造and 1=2使前一句SELECT语句失效。回到刚才的案例,假设当前表的字段数为3,我们就可以构造SELECT * FROM news WHERE id='1' and 1=2 UNION SELECT 1,2,3-- a'来查询当前页面的显错点了,通过下图的案例可知,当前的显错点为第一字段第三字段

这个显错点又是什么意思呢?比如当前表中共有三个字段,一个是标题(title)、一个是时间(time)、一个是内容(data),而我们前端不需要显示时间,只需要展示标题和内容即可。那么从数据库获得的数据中,也只有标题字段和内容字段会展示在页面上,这两个点就是显错点

通过这里的显错点,用户就可以获得数据库中的所有数据了。当用户输入的数据为1' and 1=2 UNION SELECT 1,2,database()-- a时,即SQL语句为SELECT * FROM news WHERE id='1' and 1=2 UNION SELECT 1,2,database()-- a'时,就可以直接得到数据库的库名

0x02:怎么利用显错型SQL注入

1.判断是否存在注入

构造and 1=1/and 1=2查看页面是否有异常,若有异常,即有可能存在注入,另外还可通过该语句判断该站点是否有WAF,若有WAF的话会有拦截警告,当然,WAF也是可以绕过的。。。

2.查询当前表的字段数

构造order by x,当页面返回异常时,利用x减一即可得到当前表的字段数

3.查询显错点

构造and 1=2 union select 1,2,3,若页面显示了我们构造的1,2,3,则对应的字段即为显错点

4.查询数据库库名

构造and 1=2 union select 1,2,database(),即可在显错点显示当前数据库库名


一般挖漏洞的话到此步骤就可以提交了,切记千万不可非法获得数据,挖洞有风险,同志需谨慎!


5.查询数据库中的表名

构造and 1=2 union select 1,2,table_name from information_schema.tables where table_schema=database() limit 0,1,即可在显错点显示当前库中的表名,因为显错点一次只能显示一条数据,这时可以通过limit语句选择不同的表名进行查看。

6.查询选择表中的字段名

构造and 1=2 union select 1,2,column_name from information_schema.columns where table_schema=database() and table_name='XXX' limit 0,1,即可在显错点显示字段名,这里也是通过limit语句选择不同的字段名进行查看。

7.查询数据库中的数据

构造and 1=2 union select 1,2,XXX from XXX limit 0,1,即可获得数据库中的数据了。

0x03:怎么防范显错型SQL注入

针对显错型SQL注入,我们可以对用户输入的数据进行一次筛查,设置黑名单,拦截注入常用的一些关键词,比如andorder byunionselectfrom等。

除了设置黑名单外,还有一种比较靠谱的方法,即使用预编译语句,而不是动态的生成SQL语句,这样可以有效的避免用户输入的数据连接到数据库执行,就是实现起来比较复杂,需要设置大量的预编译语句。

另外还有一种目前最靠谱的方法,实现起来还简单,就是上硬件防火墙。。。就是有点小贵。

0x04:互联网中的一些案例



依据网络安全法,本文旨在分享个人学习经验,内容禁止用于违法犯罪行为!

挖洞入门_显错型SQL注入的更多相关文章

  1. 2019-9-9:渗透测试,docker下载dvwa,使用报错型sql注入dvwa

    docker下载dvwa镜像,报错型注入dvwa,low级 一,安装并配置docker 1,更新源,apt-get update && apt-get upgrade &&am ...

  2. 字符型SQL注入

      字符型SQL注入 很早就基于DVWA实现了字符型的SQL注入,但是一直感觉自己没有理解的特别清楚,这次又看了一下网上的一些讲解,试着总结一下.以下是我的一写浅薄见解,请大家批判着看. 基本原理 看 ...

  3. [典型漏洞分享]Insert型SQL注入的发现和利用,篡改订单金额

    本例中的SQL注入和其它发现的SQL注入的主要区别:1.生成订单接口是一次性的,反复提交无效,因此,此类型的SQL注入比较难通过扫描器发现,需要人工提取和手动测试.2.Insert类型的SQL注入,不 ...

  4. 详解基于MSSQL “order by”语句报错的SQL注入技术

    SQL注入,又名黑客技术之母,是一种臭名昭著的安全漏洞,由于流毒甚广,已经给网络世界造成了巨大的破坏.当然,对于该漏洞的利用技术,也是花样繁多,如访问存储在数据库中的数据,使用MySQL的load和i ...

  5. 基于报错的SQL注入整理

    SQLServer 一.利用错误消息提取信息 输入 'having 1=1 --(having一般要与group by一起来使用,group by是用来进行分组的,having后面是用来进行判断的), ...

  6. [MYSQL手工注入](3)基于报错的SQL注入实战

    0x03 MYSQL 手工注入实战--基于错误的 SQL 注入 今天如愿以偿的找到了基于错误的SQL注入环境了:是一个国外卖音响的小网站,还在建设中: 看一下报错信息: (1)确定闭合语句:从上面的报 ...

  7. SQL注入攻防入门详解

    =============安全性篇目录============== 本文转载 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱,事实上是没机 ...

  8. SQL注入攻防入门详解(2)

    SQL注入攻防入门详解 =============安全性篇目录============== 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱 ...

  9. [转]SQL注入攻防入门详解

    原文地址:http://www.cnblogs.com/heyuquan/archive/2012/10/31/2748577.html =============安全性篇目录============ ...

随机推荐

  1. go模板-代码生成器

    能用程序去做的事,就不要用手,编写自己的代码生成器就是用来解放你的双手,替你做一些重复性的工作. 上篇帖子写了模板的基础 go模板详说 ,有了基础就要做点什么东西,把所学到的东西应用起来才能更好的进步 ...

  2. Nuxt.js

    nuxt.js简单来说是Vue.js的通用框架,最常用的就是SSR(服务端渲染),nuxt.js这个框架,用Vue开发多页面应用,并在服务端完成渲染,可以直接用命令把我们制作的vue项目生成为静态的h ...

  3. PHP常量和数据类型

    引言 先用一个题来作为开端:PHP字符串的三种定义方式是什么?有什么区别? 它们分别是单引号'',双引号"",newdoc和heredoc. 区别是:单引号不能解析变量,不能解析转 ...

  4. Python装饰器的一点解读

    版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/12977127.html 作者:窗户 ...

  5. Win2003远程桌面突然无法连接,有没有解决方法?

    在日常工作中,运维人员除了接触服务器监控工具外,最常用的应该就是远程桌面了吧.iis7远程桌面是一款绿色小巧的服务器管理工具,更加人性化,管理服务器更是不可测量. 可以管理1000台服务器的远程桌面: ...

  6. zabbix通过IPMI模式监控服务器风扇转速和温度反映机房室温变化实例

      说明:2019年4月7日321机房OA服务器主板监控风扇转速和温度有明显升高,其后3天呈逐日升高趋势.检查机房感觉空调制冷量不足.4月11日联系空调维修进行处理,空调制冷恢复正常,风扇转速和温度监 ...

  7. Java实现 LeetCode 509 斐波那契数

    509. 斐波那契数 斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列.该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0, F(1) = 1 ...

  8. 类似-Xms、-Xmn这些参数的含义:

    类似-Xms.-Xmn这些参数的含义: 答: 堆内存分配: JVM初始分配的内存由-Xms指定,默认是物理内存的1/64 JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4 默认空余堆内存小于 ...

  9. java实现角谷步数

    你听说过角谷猜想吗? 任意的正整数,比如 5, 我们从它开始,如下规则计算: 如果是偶数,则除以2,如果是奇数,则乘以3再加1. 如此循环,最终必会得到"1" ! 比如 5 的处理 ...

  10. Linux rsyslogd日志服务

    日志基本格式 基本日志格式包含四列: 事件发生的时间 发生事件的服务器的主机名 产生事件的服务名或程序名 事件的具体信息 /etc/rsyslog.conf配置文件 mail.*            ...