SQL注入——联合查询注入
SQL注入——联合查询注入
0.前言
联合查询注入是可回显的注入,在联合查询中,一般会将数据库查询的数据返回到页面中。联合查询注入利用的前提是初始的页面上有显示位,在一个网页的正常界面中,服务端执行SQL语句查询数据库中的数据,客户端将数据展示在页面中,这个展示数据的位置就叫显示位。
1 |
|
可以看见在$id变量中,该变量会将get传送过来的参数直接拼接到SQL语句中,如果我们输入的内容为:
1 |
|
拼接后SQL语句就变成了:
1 |
|
闭合前面的单引号,注释掉了后面的单引号,只需要在中间写上需要的Payload(有效负荷代码)就可以了。而加号则是服务器在处理用户输入的时候已自动将其转义为空字符了。
(接下来的演示以BUUCTF中的SQL注入-1为例):
1.判断注入点
&Emsp;我们在可能存在SQL注入变量的后边添加Payload:
1 |
|
2.判断是整型还是字符型
输入and 1=1和and 1=2根据界面是否变化判断是否为整型注入。 判断是字符型还是数字型的表格:
输入’ and 1=1 %23和 ‘ and 1=2%23后发现页面变化,判断为字符注入
3.判断查询列数
order by 函数是对MySQL中查询结果按照指定字段名进行排序,除了指定字 段名还可以指定字段的栏位进行排序,第一个查询字段为1,第二个为2,依次 类推。
输入3列时,页面正常:
1 |
|
输入4列时,页面出错,说明只有3列
1 |
|
4.判断显示位
union的作用是将两个select查询结果合并,程序在展示数据的时候通常只会取结果集的第一行数据,看一下源码,mysql_fetch_array只被调用了一次,而mysql_fetch_array从结果集中取得一行作为关联数组或数字数组或二者兼有,具体看第二个参数是什么。所以这里无论怎么折腾最后只会出来第一行的查询结果。只要让第一行查询的结果是空集,即union左边的select子句查询结果为空,那么union右边的查询结果自然就成为了第一行,打印在网页上了
1 |
|
5.获取所有数据库名
可以通过使用注入查询数据库语句显示当前所有数据库: databas()
1 |
|
可以看见,输入完毕后,第三行会将所存在的数据库输出到显示屏中
6.获取表名
在获取数据库的信息后,查找对应数据库里所拥有的表:
1 |
|
’mysql’为数据库名,通过改变数据库名,进行不同数据库的内容查询
7.获列名
查看表的内容
1 |
|
8.获取列中的信息
1 |
|
最终获得flag