说在开头:文章是我通过查询资料后按照自己的理解总结出来的,所以如果有说法不对的地方,欢迎大佬指正~
宽字节注入攻击可以说是SQL注入的进阶攻击方式,在我之前列出的学习计划体系中,前面的union联合查询注入攻击、布尔盲注、报错注入、时间盲注这几种常见的SQL注入方式,在我之前的博客中已经分析过了,那么今天在下面这些进阶的SQL注入方式中,要翻牌的就是宽字节注入。
原理讲解
接下来的讲解,将以问答的方式来呈现我对宽字节注入的理解,希望读我这篇文章的朋友也有所收获。
1.什么叫宽字节注入?
先不忙着深入分析,我们先从整体上知道宽字节注入到底是指什么。按我的理解来总体概述一下:
【MySQL是用的PHP语言,然后PHP有addslashes()等函数,这类函数会自动过滤 ’ ‘’ null 等这些敏感字符,将它们转义成’ ‘’ \null;然后宽字节字符集比如GBK它会自动把两个字节的字符识别为一个汉字,所以我们在单引号前面加一个%df,从而使单引号逃逸。】
2.什么情况下存在宽字节注入?
宽字节的注入条件有两个:
1.数据库编码设置成GB系列
- 这里说的GB系列编码,不是指PHP页面的编码,而是连接数据库使用的编码。
2.使用了转义函数,将GET、POST、cookie传递的参数进行过滤,将单引号、双引号、null等敏感字符用转义符 \ 进行转义。
- 常见的包括addslashes()、mysql_real_escape_string()函数。
- 转义函数的转义作用,就是我们常说的“过滤机制”。
当两个条件都满足时,才会存在宽字节注入。
3.具体原理:
1.通过前面的SQL注入实验可以发现,字符型的注入点我们都是用单引号来判断的,但是当遇到addslashes()时,单引号会被转义成 ’ ,导致我们用来判断注入点的单引号失效。
所以我们的目的就是使转义符 \ 失效、使单引号逃逸。
2.我们通过URL编码来分析,首先先看看这些特殊符号的URL编码:
3.我们的payload的是【%df '】,其原理是当MySQL在使用GBK编码的时候,会认为两个字符是一个繁体汉字,然后让我们的单引号%27成功逃逸:
至于字符、字符集、编码、宽字节等的定义,我这里就不花时间讲了,我们的重点放在宽字节注入上。
实验演示
1.搭建环境
这里用到的环境是pikachu。下面引用pikachu作者的话:
Pikachu是一个带有漏洞的Web应用系统,在这里包含了常见的web安全漏洞。
如果你是一个Web渗透测试学习人员且正发愁没有合适的靶场进行练习,那么Pikachu可能正合你意。
Pikachu上的漏洞类型列表如下:
Burt Force(暴力破解漏洞)
XSS(跨站脚本漏洞)
CSRF(跨站请求伪造)
SQL-Inject(SQL注入漏洞)
RCE(远程命令/代码执行)
Files Inclusion(文件包含漏洞)
Unsafe file downloads(不安全的文件下载)
Unsafe file uploads(不安全的文件上传)
Over Permisson(越权漏洞)
…/…/…/(目录遍历)
I can see your ABC(敏感信息泄露)
PHP反序列化漏洞
XXE(XML External Entity attack)
不安全的URL重定向
SSRF(Server-Side Request Forgery)
管理工具
“如果你想搞懂一个漏洞,比较好的方法是:你可以自己先制造出这个漏洞(用代码编写),然后再利用它,最后再修复它”。
“少就是多,慢就是快”
下载地址: https://github.com/zhuifengshaonianhanlu/pikachu
这里插一句,我又双叒叕遇到了环境问题………………………………
是这样的,我之前用的是WampServer,所以压缩包就是解压在它的 www目录下。
然而!我按着非常正确的步骤配置了一遍以后发现连不上数据库!
于是我怀疑自己是不是哪里操作错了,所以删了重新解压配置,反复几次后,还是同样的毛病!
然后怀疑是不是压缩包受损了,所以我又从不同的地方下载了不同的压缩包进行尝试,还是同样的问题!!
于是又开始怀疑是不是虚拟机里浏览器显示的问题,所以就用物理机的浏览器来访问,然鹅!物理机ping得通虚拟机,物理机的浏览器却访问不了虚拟机的服务器!
然后我不死心,回到虚拟机,反反复复查看代码和数据库,想知道哪里出问题了。
在经过了东问西问、给这个打电话给那个远程求助的几个小时后,依然找不到问题、解决不了问题。
然后,
我换了一个集成环境——phpstudy,两分钟就解决了所有问题。
问题分析:
- 连不上数据库的原因,猜测可能是因为有些php扩展在Wamp环境里面没有开,换了phpstudy就没问题了。
- 用wamp的时候物理机的浏览器无法访问虚拟机的服务器,应该是wamp默认只能本地访问,需要改Apache里面的配置才能允许其他主机访问,不过我没找到在哪里改,换了phpstudy就没问题了。
所以,phpstudy真香。
这次的环境问题对我来说也算是有所收获,用我的QQ个性签名来总结一下此时此刻的感受:
天将降大任于是人也,必先苦其心志,劳其筋骨️。道阻且长,行则将至。
2.实验过程
1.选择“SQL-inject”里的“宽字节注入”:
2.通过测试,发现这是一个post传参,所以我们结合burpsuite来抓包。
- 注意:用burpsuite抓包的时候,不要用浏览器访问127.0.0.1/pikachu,而是访问虚拟机的IP地址192.168.1.103/pikachu,否则抓不到包。
将拦截到的数据包发送到重发器,输入payload【1%df’ or 1=1#】,可以看到爆出了所有的账户信息:
3.判断可显字段。
- 这里用order by判断字段数量会报错,不知道是什么原因。直接跳到下一步:用union select联合查询直接测试1,2是否为可显字段。
可以看出第1,2个为可显字段。
4.爆数据库名。
可以看到数据库名为pikachu。
5.爆数据表名。
- 按照之前union联合查询注入的payload,【union select group_concat(table_name),2 from information_schema.tables where table_schema=“pikachu”】里面是存在引号的,但如果用%df来使引号逃逸,就会使查询语句出错,所以后面的payload都是用嵌套查询,避免使用引号。
1%df’ union select (select group_concat(table_name) from information_schema.tables where table_schema=database()),2#
6.爆字段名。
1%df’ union select (select group_concat(column_name) from information_schema.columns where table_schema=(select database()) and table_name=(select table_name from information_schema.tables where table_schema=(select database())limit 3,1)),2#
- 我们可以看到一共有5个表,它们在limit语句中对应的位置依次是第0位、第1位……我们想查看的是users表,所以我们在payload中写limit 3,1。
7.爆字段内容。
1%df’ union select (select group_concat(username,0x3b,password) from test.users),2#
这里的密码是用MD5加密了的,解密即可。
Pikachu漏洞练习平台——宽字节注入完成!