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

> 零基础学黑客,搜索公众号:白帽子左一

本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担。

前言

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

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

图片

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

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

图片

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

图片

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

图片

图片

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

sqlmap -r sql.txt -p sid --tamper base64encode --technique E  
sqlmap -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。

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

图片

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

图片

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

#!/usr/bin/python
s = '密码'
e = s.encode('utf-8')
print(e.decode('gbk'))

作者:r0yanx

原文地址:https://www.freebuf.com/articles/web/213142.html

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL注入1 简介 许多现实中对于网站的攻击往往是由于网站没有及时更新或者对于用户的输入没有进行检查。从缓冲区溢出说起,这样一种针对系统脆弱性的威胁,最根本的问题还是在于对于用户的输入没有进行检查。作为主要威胁之一的SQL注入带来了人们对于其应用和数据库的担忧。这个问题的出现有十年的时间了,但是现在仍旧在许多网站中出现。SQL注入就像许多当前主要的的web应用安全攻击问题也被划归在了对于用户输入的检查上。 正文 许多web开发者并不知道SQL语句能够被自定义(handle)并且假定SQL语句是一个让人信任的命令。这就让SQL语句能够绕过访问控制机制(access control),因此跳过标准的授权和认证检查。甚至有些时候SQL语句能够允许使用服务器操作系统上的命令行的权限。 直接的SQL注入命令是一种方法,它被攻击者构造或者是修改现成的SQL命令来暴露出隐藏的数据或者是覆盖掉有价值的数据,甚至在服务器上执行危险地系统指令 入门 结构化的语言是数据库的标准声明语言。这让(语言)变的更加简洁并且更易于使用。SQL起源于70年代的IBM实验室。SQL被用来让应用程序与数据库之间进行通信。 SQL使用如下的4种语言来对数据库进行操作 SELECT -从数据库中获得一条记录 INSERT-向数据库中插入一条记录 DELETE-从数据库中删除一条记录 UPDATE-从数据库中更新或者改变当前记录 当用户提交的语句被用作数据库的查询语句时SQL就能够发生。比如当用户被网站认证授权,用户发送一个带有”用户名”和”密码”的信息,用户名/密码就与存放在数据库中的内容进行核对。如果相同的话用户就被允许登录,否则用户登录失败。以下是一个在后台进行登录的例子。 代码 SELECT * FROM user WHERE username='$username' AND password='$password' 这个语句简单地指明了从user的表中查询用户名和username相等的,并且密码和password相等的。所以,如果用户发送用户名为”admin”,并且密码为”12345″,那么SQL语句被创建如下: SELECT * FROM user WHERE username='admin' AND password ='12345' 注入 那么,如果用户输入’ or ’1′=’1,第一个引号会终止输入的字符串,剩下的会被当做SQL语句,并且在SQL语句中1=1恒为真,这就能够让我们绕过注册机制 SELECT * FROM user WHERE username=’admin’ AND password =”or ’1′=’1′ -TRUE 上述是一个SQL注入的简单地例子,然而在实际过程中,SQL注入比这要复杂的多。在我们的渗透测试中,大多数时候我们有一个非常紧凑的计划表,所以这个时候我们需要一个自动化的攻击来为我们进行注入攻击。 SQLMAP就是一能够利用(系统)脆弱性的工具。它是开源的,并经常被用来在Python写的脆弱的DBMS上进行入侵的渗透测试。它能够检测并利用SQL上的漏洞,让我们举例在操作系统和数据库上使用sqlmap.py。 一步一步 我将尽可能地以最简洁的方式展示出来。 最常见的检测SQL注入的方法是通过在输入处添加一个单引号(')并且期待(系统)返回一个错误,有些应用程序并不会返回错误。这个时候我们就会利用true/false语句来检查是否这个应用程序会受到SQL注入的攻击。 为了随机的找到还有SQL注入的脆弱性的网站,你能够使用如下格式的语句利用google dork:inurl:news.php id =1?将会出现一堆google dork的数据并且为你过滤你搜索得到的结果提供了可能。那么让那个我们开始吧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值