• Buuctf web [SUCTF 2019]EasySQL


    又是一道考察sql注入的题

     1、起手试探

    (主要看看输入什么内容有正确的回显

    1. 1
    2. 0
    3. 1'
    4. 1' #

     

     

    发现只有在输入1的情况下有正常的回显,输入0或其他字符都没有回显,所以这题就要尝试堆叠注入了。

    ps:(如果想尝试其他注入方法,输入以下内容需要有回显

    1. 1' 报错
    2. 1'# 正确

    2、爆库
    1; show databases;

     

     

     3、报表
    1;show tables;

    4、爆字段
    1. 1;show columns from 1;
    2. 1;show * from 1;

     

     显示Nonono.,看来关键字from被ban了。

    不费脑子的方法用不了了,只能猜测一下后端代码了。

    先查看一下源码,看到传参类型为post,方式为query。

     根据前面的回显:输入1到9返回Array ( [0] => 1(此处的1可能代表Ture) ),输入0或字符没有回显,仅有的两种回显,可以判断出,后端应该使用的是逻辑或,即条件为真进行回显或条件不满足返回空白

    逻辑或:|| 两边,一侧为1则取1,否则取0。

    同时题目中还有这样的一句提示的话,需要你将flag交给它,它告诉你flag是不是真的,也就是说名后端的内容很有可能是||拼接:1、从网页获取的内容。2、真正的flag的内容。

    select $post['query'] || flag

     ps:补充一堆

    1、post请求的Parameter Type是可以是query,而一般情况下post请求方式的Parameter Type是 body,在一些极少情况下,post请求的参数体可能会存在body及query共存的情况。

    2、所以这其实涉及到post请求的三大部分:header、body、query(简单来说:header:请求头、body:多参数请求体、query:单参数请求体)。

    3、后端的接口在不注解的情况下默认是query,所以get请求用query,一般传递单个参数。而post请求多用body,一般传递多个参数。

    4、params就是query参数,params的值只能是一个字符串,不能传递对象类型的参数,如果参数中涉及到了传递对象,就要选择body传参。

    5、对象类型参数:顾名思义,参数类型是我们定义的类。我们知道int型参数,char型参数等,对象类型原理相同,即传入某个函数的参数是对象类型的

    总的来说就是post['query']用来获取用户输入的字符串

    所以我们需要将或逻辑改为与

    1;set sql_mode=PIPES_AS_CONCAT;select 1

    补充

    其他sql_mode的参数:

     ONLY_FULL_GROUP_BY:

        对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中

        NO_AUTO_VALUE_ON_ZERO:

        该值影响自增长列的插入。默认设置下,插入0或NULL代表生成下一个自增长值。如果用户 希望插入的值为0,而该列又是自增长的,那么这个选项就有用了。

        STRICT_TRANS_TABLES:

        在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制

        NO_ZERO_IN_DATE:

        在严格模式下,不允许日期和月份为零

        NO_ZERO_DATE:

        设置该值,mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告。

        ERROR_FOR_DIVISION_BY_ZERO:

        在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。如 果未给出该模式,那么数据被零除时MySQL返回NULL

        NO_AUTO_CREATE_USER:

        禁止GRANT创建密码为空的用户

        NO_ENGINE_SUBSTITUTION:

        如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常

        PIPES_AS_CONCAT:

        将"||"视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似

        ANSI_QUOTES:

        启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符

        ORACLE的sql_mode设置等同:PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER.

    写完之后上网上搜了一下,发现了另一种方法

    *,1

    根据大佬的判断,后端长这样

    select post['query'] || flag from Flag

    输入*,1就相当于构造了select *,1 || flag from Flag,这条语句执行起来相当于select *, 1 from Flag

    原理:1||flag是个短路算法,直接输出1了

    select *和select 所有列的意义相同,那么我们构造的select *,1 || flag from Flag ==select *,1 from Flag 

    参考文章:

    sql_mode参数 - 技术文章 - 云掣

    BUUCTF [SUCTF 2019]EasySQL1 writeup(详细版)_buuctf easysql_今天不用学物理吧的博客-CSDN博客

  • 相关阅读:
    教小白搭建Hive分区分桶表
    Docker启动失败 unknown flag: --graph
    day03_pandas_demo
    ClickHouse UDF 运行速度慢问题
    ReactDom(render、findDOMNode、unmountComponentAtNode)
    SpringMVC组件解析
    maven中clean,compile,test,package,install分别有什么作用
    go语言输出带颜色字体
    NOAUTH Authentication required. redis
    一篇全面而且透彻的RabbitMQ性能优化指南
  • 原文地址:https://blog.csdn.net/m0_61903191/article/details/132849806