挖洞入门_union型SQL注入

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

0x00:什么是SQL注入

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

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

操做系统 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解析日志来得到数据。其中,最简单的一种方法就是union型的SQL注入了。网络

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

0x01:为何会产生union型SQL注入

union型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:怎么利用union型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:怎么防范union型SQL注入

针对union型SQL注入,咱们能够对用户输入的数据进行一次筛查,设置黑名单,拦截注入经常使用的一些关键词,好比andorder byunionselectfrom等。

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

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

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


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

相关文章
相关标签/搜索