强网杯-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

这里有两个表1919810931114514words

使用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

posted @ 2023-11-27 19:00  Junglezt  阅读(27)  评论(0编辑  收藏  举报