当SQL注入遇到诡异的编码问题

VSole2022-03-10 05:52:37

前言

最近给甲方爸爸做渗透测试时发现了一个诡异的SQL注入,之所以说诡异,是因为该系统数据库连接编码与实际的数据库编码不一致,并且数据库表字段名使用了中文的字段名,导致通过正常手段无法获取到数据库数据。

故事开始

1、拿到资产清单后,发现有这样一个站。

2、简单测试了一下,发现该页面无验证码,无密码验证次数限制,可进行暴力破解,但进行了一波爆破后,并未得到可用账号。

3、通过系统资产表得到负责人和维护人的手机号。

4、使用负责人的手机号为账号,暴力破解得到弱口令186xxxxxxxx/12345678登录系统。

5、简单看了下页面,发现以下页面存在base64编码的sid参数,解码为手机号186xxxxxxxx,改为186xxxxxxxx’再编码发送会报错。

6、看到这里心里大喜,显然这里应该存在基于错误显示的SQL注入,话不多说,SQLMAP一把梭,成功跑出了注入点并且得知该数据库用户是管理员。


sqlmap -r sql.txt -p sid --tamper base64encode --technique Esqlmap -r sql.txt -p sid --tamper base64encode --technique E --is-dba


7、至此这个漏洞算是存在了,本不想深挖,但是又发现该系统存在一个后台页面,于是想从数据库中拿个账号登陆看看。

8、当我熟练地拿起SQLMAP跑出字段名时,我惊呆了,这开发大哥居然用的中文字段名。

sqlmap -r sql.txt -p sid --tamper base64encode --technique E -D CANTEEN -T XXX_INFO_USER --columns

9、照着平常的命令dump几条数据看看,果然跑不出来。

sqlmap -r sql.txt -p sid --tamper base64encode --technique E -D CANTEEN -T XXX_INFO_USER -C 工号,密码 --start 1 --stop 3 --dump

10、刚开始我以为只是SQLMAP对中文的兼容性问题,尝试了以下几种方法,都没有成功:

不使用报错回显注入,使用布尔盲注的方式
在Linux上面跑
—encoding GBK/—encoding UTF-8等
设置cmd页面编码为utf8

11、于是使用SQLMAP调试输出看看数据包,发现了奇葩的事情,报错页面居然存在两种编码!

sqlmap -r sql.txt -p sid --tamper base64encode --technique E -D CANTEEN -T XXX_INFO_USER -C 工号,密码 --start 1 --stop 3 --dump -v 7

12、为了验证我的猜想,在burpsuite上面把SQLMAP的请求重放看看。果然,web数据库连接编码与后台数据库编码不一致。当前burp设置的编码为utf8,所以猜测下图中乱码部分的编码为gbk。而图11中红框部分编码正常部分恰好是burp乱码部分,所以推测SQLMAP应该是使用了gbk解码显示。

13、看到这里,我有一句mmp不知当讲不当讲。吐槽完毕,还是乖乖地想起了应对方法,毕竟砖还是要搬的。重新梳理了一下字符的编码转换过程,对字段名做了个编码,如下。对的,你没有看错,确实是编码成了一个不正常的字符,SQLMAP正确识别出了编码,成功跑出了数据:

sqlmap -r sql.txt -p sid --tamper base64encode -T XXX_INFO_USER -C 宸ュ彿,瀵嗙爜 --start 1 --stop 3 --dump

原理解析

1、从上面实验中,我猜测WEB中间件连接数据库的编码为gbk,而数据库字段名的实际编码为utf8。

2、梳理一下从用户发起HTTP请求到数据库中间的数据流,其关键的编码过程如下(以下仅为本人不太专业的理解,不一定准确)。关键问题在于,SQLMAP输入的payload经过gbk编码成字节流,然后被数据库以utf8解码。

3、既然知道了编码的逻辑,那么通过反向编码就可以让数据库拿到正确的中文字符串了。举个例子,如果密码两个字要被数据库解码,那么它的字节流应该是\xe5\xaf\x86\xe7\xa0\x81。

ss = '密码'e = s.encode('utf-8')print(e)


4、而字符串瀵嗙爜通过gbk编码后的字节流也是\xe5\xaf\x86\xe7\xa0\x81,所以数据库能够把中文字段名正确地查询:

5、所以r0yanx才有了上面的操作,把中文字符串先进行utf8编码再进行gbk解码得到字符串,Python示例代码为:

#!/usr/bin/pythons = '密码'e = s.encode('utf-8')print(e.decode('gbk'))
sql注入sqlmap
本作品采用《CC 协议》,转载必须注明作者和本文链接
01登录框存在sql注入:通过前期的信息搜集,发现站点使用thinkphp3.2版本的框架,在登录页面验证存
发现漏洞七月正值暑假,闲暇时光在百度上inurl一番,找到了一个古老的企业OA系统IP站点,没有域名,扫过一眼,.NET流行时代的普遍漏洞浮现在脑海里——SQL注入在用户名里输入admin’,不负期望地报了错很明显,前后端都没有对用户的输入进行过滤,直接将’带入了SQL语句进行。初步判断,此OA系统存在SQL注入漏洞。漏洞验证打开BurpSuite,设置好浏览器代理,抓下HTTP请求,一气呵成。
option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml%27单引号尝试:存在sql注入sqlmap 走起!跑数据 格式有点问题。获取到管理员加密后的密码$2y$10$DpfpYjADpejngxNh9GnmCeyIHCWpL97CVRnGeZsVJwR0kWFlfB1Zu使用john 来破解john pwd --wordlist=/usr/share/wordlist/rockyou.txt admin/snoopy 登录后台3x0:后台篇在后台查找一番发现 类似于模板的页面可以利用模板的信息在结合上面的端口信息没有ssh应该是从web端进入 webshell?就接着用了4x0:提权篇查看系统的内核版本启动kali上的apache,把exp上传到服务器把exp下载到靶机解压exp授权脚本使用exp报错不影响使用获取到root权限5x0:flag获得
记一次SQLmap实战
2021-09-28 07:41:13
简介:sqlmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL的SQL注入漏洞,目
一些重要的SQLMap命令
2023-05-04 08:55:08
从扫描SQL注入漏洞到获取数据库名字、表和列,以及获得系统访问权限,其可被用于多种目的。我们必须给SQLMap提供有效的cookie才能对登录页面的POST请求进行扫描。不过别总是保持一个较高的值,因为可能会影响结果的准确性。默认情况下值为1,最高可以设置为3。值为3时,就是最大值,包含了一些严重的SQL查询。级别指定要执行的检查或payload的数量。
本靶机难度为高难度,涉及到了缓冲区溢出的源码审计 ,逆向分析,动态调试等漏洞技能点,攻击方法有2种:??SQL 注入得到的密码可以保留。
前段时间参加攻防演练的时候,发现目标系统有很多都使用了用友的产品,故整理一篇关于用友漏洞的文章。
burp0_data = {"name": username, "pw": password, "repw": password, "email": email, "submit": ''}
vulnhub之Mercury的实践
2022-11-30 10:31:40
今天实践的是vulnhub的Mercury镜像,下载地址,https://download.vulnhub.
渗透测试很多时候需要的细心和耐心再加上一点运气
VSole
网络安全专家