概述
启动靶场访问如下,输入1',报错,可知是字符型注入,变量由单引号包裹
输入1' and 1=1 --+,显示正常
先直接用sqlmap注入一下,显示存在注入,但是始终注入不出来数据库,“[ERROR] unable to retrieve the number of databases”,猜想应该是存在字符过滤
因为现在还不知道是什么原因导致的sqlmap注入不出来,所以先尝试手注。输入框中输入1和2显示的结果不同,像这种直接回显输入的最先尝试联合注入
- 联合注入
?inject=1' order by 2 --+ //正常
?inject=1' order by 3 --+ //不正常,所以存在2列
- 获取回显点
?inject=1' union select 22,33--+
回显了一个过滤语句,发现存在正则将“select|update|delete|drop|insert|where|.”进行了过滤,且不缺分大小写。几乎所有常用的查询词都被过滤了。这里使用的是preg_match()函数进行正则过滤,其返回的值是1或者0,所以这里无法进行双写绕过
preg_match使用正则对字符进行匹配,匹配成功返回1,否则返回0
但是;分号没有被过滤,可以尝试堆叠注入
堆叠注入
在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下,我们在结束一个sql语句后继续构造下一条语句,会不会一起执行? 因此这个想法也就造就了堆叠注入。
但是这种注入方式并不是十分的完美的。在我们的Web系统中,因为代码通常只返回一个查询结果,因此,堆叠注入第二个语句产生的错误或者结果只能被忽略,我们在前端界面是无法看到返回结果的。
一般存在堆叠注入的都是用 mysqli_multi_query() 函数执行的sql语句,该函数可以执行一个或多个针对数据库的查询,多个查询用分号进行分隔。
- 获取所有数据库
?inject=';show databases --+
- 获取当前数据库中的所有表
?inject=';show tables --+
查询出了两个表 “1919810931114514”和“words”
接着对这两个表进行查询
- 查询表‘1919810931114514’中的字段
?inject=';show columns from `1919810931114514`--+
发现表中只存在一个flag字段,那这里面很可能就是放在flag值。但是值我们无法查看,查看值需要用到select关键词,而select词被过滤,所以这里先放一放
- 查询另外一个表“words”的字段
?inject=';show columns from `words`--+
显示存在两个字段,即有id和data 两列,此时并没有什么头绪
按照这种查找方法,继续对其他数据库表进行查找,但是依然没发现flag放在哪里,所以还是回到一开始的`1919810931114514`这个表中,flag很可能存在这里。
- 窗口提交查询的回显数据为两个字段,这和word表中两个字段在字段数量和类型上是一样的
- 且word表是“show tables”时显示的表,显示的为当前数据库中的表,而当前数据库只存在`1919810931114514`和`words`,这样基本就可以判断我们提交查询的窗口就是在这个表里查询的数据,查询语句很有可能是:select id,data from words where id =,如下:(2为输入的id,miaomiaomiao为回显的data字段)
思绪~~~~~~~~~~~~~~~~~~~~~~~~~~~~··、
不能直接查询表中的所有值。这里有两张表,回显内容肯定是从words这张表中回显的,那我们怎么才能让它回显flag所在的表呢?思考点依然让在堆叠注入上
因为可以堆叠查询,这时候就想到了一个改名的方法,把words随便改成words123,然后把1919810931114514改成words,再把列名flag改成id(或data)。然后程序查询就能查询到原本‘1919810931114514’表中的数据
payload
';rename table words to words123;rename table `1919810931114514` to words;alter table words change flag id varchar(100);--+
#rename命令用于修改表名。
#rename命令格式:rename table 原表名 to 新表名;
#alert修改字段名及字段属性值
alert table 表名 change 旧字段名 新字段名 新字段属性;
再提交 ' or 1=1--+
ps:那这里为什么要提交 ' or 1=1--+ 才会显示flag了?因为原本是查询words中的id字段,其值为1、2、...,现在修改了是查询原本`1919810931114514`表的flag字段,其值为一些字符串。所以如果直接查询 如id=1肯定是查不出来的,这就需要让一条语句将所有内容查询出来
如下例子,查询 id=-1,因为-1不存在,所以查询无结果
但是将id值换成 id=-1 or 1=1,or 1=1恒为真,所以将结果全部查询出来了
最后
以上就是优秀白猫为你收集整理的BUUCTF web之随便注的全部内容,希望文章能够帮你解决BUUCTF web之随便注所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复