freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

新手入门:union型SQL注入
FreeBuf_343862 2020-07-08 17:05:58 752392

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

什么是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解析日志来获得数据。其中,最简单的一种方法就是union型的SQL注入了。

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

为什么会产生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'来查询当前页面的显错点了,通过下图的案例可知,当前的显错点为第一字段和第三字段。       

1.jpg这个显错点又是什么意思呢?比如当前表中共有三个字段,一个是标题(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'时,就可以直接得到数据库的库名。

2.jpg怎么利用union型SQL注入

判断是否存在注入

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

查询当前表的字段数

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

查询显错点

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

查询数据库库名

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

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

查询数据库中的表名

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

查询选择表中的字段名

构造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语句选择不同的字段名进行查看。

查询数据库中的数据

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

怎么防范union型SQL注入

针对union型SQL注入,我们可以对用户输入的数据进行一次筛查,设置黑名单,拦截注入常用的一些关键词,比如and、order by、union、select、from等。

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

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

联网中的一些案例

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

*本文作者:c4y345,转载请注明来自 FreeBuf.COM

# SQL注入 # union型SQL注入
本文为 FreeBuf_343862 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
攻防渗透宝典
FreeBuf_343862 LV.1
这家伙太懒了,还未填写个人描述!
  • 1 文章数
  • 1 关注者
文章目录