union特性注入
前言
可以利用union特性注入的ctf题其实后端代码要求与往常代码不一样,一般的注入方法并不能对后端造成攻击,要攻破SQL数据库要利用好union的特性。
union的特性
union(联合的特性),看一个例子
select * from tb_user where username='admin' union select 1, 'admin','mochu7'
union在保证字段数相同的情况下联合查询一个不存在的数据时会就会构造一个虚拟的数据到一个临时表中。
例题buuctf–babysql
字符型注入,输入admin出现了 no user,说明用户名不通过;输入其他的用户名出现了 no pass说明用户名通过了,密码不对。用python跑一下过滤的关键字,发现
按理数一般使用admin' #
即可登录成功,但是没有显示出来,出来了nopass。看来一般的注入不行,找提示发现post的数据发送给了search.php查看源码。
base32和base64解密之后得到
select * from user where username = '$name'
,果然与往常的语句不一样。并没有选择password来比对。可能时union特性注入。
要用union,就要先查字段发现是3个字段,之后确认name的位置:确认name的位置要修改union前半部分让它变成错误的用户名不能是admin,要改成其他的。所有关于union的注入我们都是希望通过union后半部分得到结果,所以前半部分必须是一个不存在的用户名。
payload1:a' union select 'admin',2,3 #
,worry user
payload2:a' union select 1,'admin',3 #
,worry pass
从结果来看第二个字段才是我们要找的admin所处字段。
所以可以构造payload,然后再post即可
name=1' union select 0,'admin','81dc9bdb52d04dc20036dbd8313ed055'%23&pw=1234
查看源码
看到源码会发现首先并没有对name和password同时比较,先比较一个然后把password进行md5加密之后再与表中的password进行比较,可以说是比较隐秘了。
MD5加密数字会返回NULL值,所以这个MD5加密比较其实还可以通过传参数组来绕过构造payload:name=a' union select 1,admin,NULL #&pw[]=2
。
整体注入就是利用了union的特性然后构造一个虚拟身份来进行伪造真实身份,从而绕过审核机制。