0%

web-EasySQL

前言:

 此题我们需要运用堆叠注入,和mysql中的 || 符号的意思及如何改变,还有mysql中的sql_mode模式的概念了解。

一、了解新知识

  1. mysql服务器可以在不同的sql_mode模式下运行,并且可以根据sql_mode系统变量的值,为不同的客户机应用不同的模式。sql_mode会影响mysql支持的sql语法,并且会执行数据验证检查
  2. 在Oracle,用 || 连接字符串的,而在mysql,是用CONCAT来实现的。mysql为了兼容这一个特性,设置了PIPES_AS_CONCAT模式,mysql会将 || 视为字符串的连接操作符而非 或 运算符。具体命令如下:
    1
    set sql_mode=PIPES_AS_CONCAT;

二、解题思路

  1. 经过一系列的输入测试发现,输入数字时会显示 Array ( [0] => 1 ) 而输入其它字符则不显示,flag除外,但输入flag会提示 Nonono. 那么它内部到底是一个怎么样的sql语句呢?
  2. 我们猜测它有一个 ||符号,因为当我们输入数字时被当成常量一直输出1,当我们输入带有字母时会被当做一个变量(列)而又无法找到,所以报错(没有回显),而输入带有”flag“的字符串都会弹出 Nonono. 说明过滤了“flag”这几个字符(后面发现,不区分大小写都过滤了)
  3. 我们尝试使用,堆叠注入,可以显示出有flag字段,但是因为过滤了“flag”几个字符所以行不通。最后看别人的wp发现可以使用:
    1
    2
    3
    *,1(常数即可)    //注意," * "要在前面
    // 即构成如下
    select *,1||flag from Flag //此时,应该是还不确定||后面是flag
  1. 这时我们还想起了将|| 变为连接符试试,又有 set sql_mode=PIPES_AS_CONCAT; 语句可用,于是得到payload:
    1
    1;set sql_mode=pipes_as_concat;select 1
     得到flag,至于 内置sql=”select”.post[‘query’].”||flag from Flag”;怎么判断||后面是flag字段的我的理解是猜的,如以后发现另又原因再做更改,最后结果如下:

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