SQL注入进阶之1宽字节注入攻击(Pikachu漏洞练习平台)

说在开头:文章是我通过查询资料后按照自己的理解总结出来的,所以如果有说法不对的地方,欢迎大佬指正~


宽字节注入攻击可以说是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漏洞练习平台——宽字节注入完成!

发布了66 篇原创文章 · 获赞 26 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/u011785309/article/details/104582250