1.对sql注入的简单理解
sql注入是最常见的攻击方法之一,之所以它能够实现是因为每个网页都存在sql漏洞,攻击者通过一些特殊传参方式和sql语句来找到网页的sql漏洞,从而获取网页的后台数据从而对该网页进行攻击,而union联合注入就是sql注入的其中一种攻击方式。
我认为它主要是利用网页的URL头传递参数,所以它也必须是动态网页 ,才能进行参数的传递,因为静态网页中是没有参数传递的,也就不会存在sql漏洞了。
然而查看动态网页通常也伴随着信息的输入,我个人将它理解为网页前端和后台的信息交互。这里用一个简单的例子说明:就像平时我们经常遇到的登录页面,用户名和密码的验证就需要前端输入后从后台数据库中获取并返回数据,返回的数据在数据库并且正确才能登录,这个步骤就是通过sql语句来执行的,我们同过传递不同的参数来获取想要数据。这时我们并不能看到它们之间传递的sql语言,只能在url中看到它传递的参数参数。
sql注入就是利用这个参数(eg:id=xxx,这里的id就是参数)id是sql语句中的一个列属性,数据表的这一列记录了不同的id
同时我们还要知道SQL语句是存在于后台的,我们无法控制查询的数据类型(如数据库名、表名、列名、参数为任意值时对应的其它属性信息等),我们知道如果要执行各种我们感兴趣的查询,就要使用SQL语句。
如何向后端传递我们编写的SQL语句?
已知参数是在URL中通过?xx=xxx进行传递的,也就是说我们只能向服务器输入特定类型的参数(由后端封装),如果我们能想办法通过传参这个接口,将写好的SQL语句传给数据库,那么就达到了侵入数据库获取信息的目的,也就是SQL注入。
以上便是我对sql注入的简单理解。
假设我们输入 Select username,password from information_schema.columns where
id=‘1’;这个语句,通过屏显返回的数据就是用户名和密码
但是我们输入参数后后端执行的查询语句依然是Select
username,password from information_schema.columns where id='1’ 并不能返回我们想要的信息,此时我们想到union联合查询 ,我们如果能够在这个语句的基础上,插入一段 union select xxxxxxxx的话,就能够让数据库执行后半句select语句并返回我们想要的信息。
2. 对Union注入的理解
定义:union函数是SQL语言中的一个操作符,用于将两个或多个查询结果合并成一个结果集。它适用于几乎所有主流的关系型数据库管理系统(RDBMS)
作用
(1)合并结果集:当我们需要将多个查询结果合并成一个结果集时,可以使用union函数。这样能简化查询操作,减少代码的复杂性。
(2)去重数据:union函数会自动去重,即将重复的行从结果集中剔除,只返回唯一的行。这在需要对两个或多个表中的数据进行合并,并消除重复数据时非常有用。
(3)扩展查询:使用union函数可以将多个查询结果合并在一起,从而扩展查询的范围。我们可以在每个SELECT语句中使用不同的条件和过滤器,从不同的表中获取数据,并将它们合并成一个结果集。
过程
在我们要将语句传递到后端,需要先搞清楚该网页语句的结构,盲目的去传递一些参数是不行的。可以通过向url头中输入一些无法识别的参数,如’,),"等(将这些符号作为参数时系统会返回语句错误信息),根据包错信息就能弄清它的结构从而分析出参数在语句中是如何被包装的。因为参数可以有多种包装形式,如id=1,id=‘1’,id=(1),id=(‘1’),id=(“1”)都是正确的,所以我们需要从页面返回的语句错误信息来判别参数时如何被封装的。
其次前端输入的参数是数字,后端执行时会给参数加上’_’,这时语句就结束了,如果我们在后面写一个union语句,就可以获得想要的数据
通过闭合以及Union查询,系统不但执行了原本的传参语句,还执行了我们自己编写的select语句,这种技巧实际上就是一种语句的拼接,如果服务器没有对参数进行相关的过滤,就会造成SQL漏洞,使得注入发生。这时union前后的两个select语句都被执行,会通过前端返回的窗口来进行显示,而后半句才是我需要的信息,这时通过修改前半句的参数,如把参数1变成1’,或1xxx,或任意数据库中肯定不存在的参数,那么前半句就会返回空值,只显示后半句的查询结果。
注:只能修改参数,不能造成后端查询语句语法的错误
实操
打开环境后寻找漏洞,判断注入类型,这里先加一个引号
发现语句错误,去掉引号换成and 1=1发现语句正确出现回显,再将它改为and 1=2
语句正确,但没有回显,说明这里存在数字注入型漏洞
接下来判断字段数量
这里输入id=1 order by 2看是否字段数量是否是2个 id=1 order by 1,2,3
可以发现这里是两列
使用union select
判断注入点
知道注入点在2的位置,爆库 -1 union select 1,database()
爆库成功,知道库名为:
sqli
,爆表
-1 union select 1,(select table_name from information_schema.tables where table_schema='sqli' limit 0,1)
-1 union select 1,(select table_name from information_schema.tables where table_schema='sqli' limit 1,1)
爆表字段名,知道字段名为
flag
,使用flag
这个字段名,爆字段内容 -1 union select 1,(select flag from sqli.flag limit 0,1)