吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4227|回复: 48
收起左侧

[Web逆向] 挖洞遇到验证码那些事

  [复制链接]
wangguang 发表于 2023-7-13 21:24
本帖最后由 wangguang 于 2023-7-13 21:26 编辑

前言:

好无聊啊!!!前段时间去网吧打暑假工,说是干前台的,结果去上班了是干外场搞卫生的。50块一天把我当狗使!我真的是会谢。然后现在在家躺尸。最近也在研究滑块,也想着自己写一个滑块玩玩。当然不可能写出极验数美易盾那种安全公司的验证码。于是我便去想着去研究一下某些网站的自研验证码。看看他们的代码怎么写的。不过好像都是假验证码偏多(防人不防ai)大多小型网站都存在验证码重复使用漏洞和客户端验证码绕过漏洞。写这篇文章也是在安全方面分析验证码和过掉验证码。

网址:

aHR0cDovL3d3dy54aW5neGluZ3R1YW4uY29tLw==

某相似网站。疑似分站:aHR0cHM6Ly93d3cudXU1NXUuY24v

温馨提示:网站上面的东西不可信(如若被骗,与作者无关)。本文章仅供学习交流使用,切勿用于违法用途。未经授权切勿进行非法肾透!

正文:

验证码数据包和图片数据包分析:

在登录界面输入账号密码登录,会弹出一个滑块验证码

1

1 )

刷新验证码,服务器传下来两个数据包

第一个数据包是一张背景图

2

2

此刻应该有疑问—>缺口图呢(被六花吃掉了)

我就是因为他没有缺口图所以才觉得这个验证码存在可重复利用的漏洞,我的分析是他在前端做了校验,只有缺口对齐了才发送那个识别成功的数据包。然后后端没有校验,便导致了这个漏洞的产生。不过更多的原因还是因为后面参数分析的时候发现他许多参数都加了随机数。

3

3

第二个数据包是验证码的数据包,有两个参数type跟randstr。type是验证码类型,randstr见名知意都知道是随机字符串的意思。至于他是随机的嘛,完全可以写固值的。不过我们还是去扣一下他代码吧。

验证码数据包参数randstr

直接在search搜索参数名randstr

4

4
在58行下断点,刷新验证码。

randstr是由i方法参进去了一个$_x生成的。

直接搜索$_x。

5

5
$_x是由n方法传进了t和e参数生成的。

经过多次刷新,t和e是固定值。t是73,e是207。

那么就去扣n方法的代码

把断点下到50行,刷新验证码,进入到n方法内部。

6

6

看到这熟悉的一幕我便知道这个参数可以写固定了。

n方法代码:

function n(t, e) {
    return Math.round(Math.random() * (t - e) + e)
}

刷新验证码让断点跳到58行,进入到i方法内部

7

7

i方法内部调用了两个方法,n方法和o方法

进入i方法内部的时候下面两个方法就是n方法和o方法,一并扣下来。

8

8

i($_x)代码:

function n(t, e) {  
    return Math.round(Math.random() * (t - e) + e)  
}  
function i(t) {  
    var e = n(11, 40)  
      , i = n(11, 40);  
    return e + "" + o(e) + t + o(i) + i  
}  
function n(t, e) {  
    return Math.round(Math.random() * (t - e) + e)  
}  
function o(t) {  
    for (var e = "", i = 0; i < t; i++)  
        e += String.fromCharCode(Math.floor(26 * Math.random()) + "a".charCodeAt(0));  
    return e  
}  
var $_x = n(73,207)
function randstr(){  
 return i($_x)  
}

py请求代码

import requests
import execjs
context = execjs.compile("""
        function n(t, e) {
        return Math.round(Math.random() * (t - e) + e)
    }
        function i(t) {
        var e = n(11, 40)
          , i = n(11, 40);
        return e + "" + o(e) + t + o(i) + i
    }
    function n(t, e) {
        return Math.round(Math.random() * (t - e) + e)
    }
    function o(t) {
        for (var e = "", i = 0; i < t; i++)
            e += String.fromCharCode(Math.floor(26 * Math.random()) + "a".charCodeAt(0));
        return e
    }
    var $_x = n(73,207)
    function randstr(){
        return i($_x)
    }
""")
# 调用 JavaScript 函数并获取结果
randstr = context.call("randstr")
params = {
    'type': 'slider',
    'randstr': randstr
}

response = requests.get(
    'http://www.xingxingtuan.com/wp-content/themes/zibll/action/captcha.php',
    params=params,
)
print(response.text)

请求成功截图

9

9

验证码校验数据包分析

网站每次校验失败只返回图片数据包跟captcha数据包。只有自己手动过了验证码才会返回校验验证码的数据包,这个网站对轨迹检测不严格,收集几个轨迹可以用很多很多次数。一些参数过了一定时间继续使用会触发风控。

验证码通过返回admin-ajax数据包

10

10

返回值可以证明这个数据包就是验证码校验成功之后的登录数据包。

11

11

参数很多,如下:

username: cascas
password: scasc
captcha_mode: slider
remember: forever
action: user_signin
captcha[ticket]: 33xpdvpejvjsvksowalyuzjaidmmvkzekcn200xajmvkfujwnxdakymyeocxaakjefcalhhbqgyo38
captcha[randstr]: 83975a14a5dd633223
captcha[spliced]: true
captcha[check]: 65907ab379c6ecd66f434c82adbd5f08
captcha[trail][]: 1
captcha[trail][]: 1
captcha[trail][]: 1
captcha[trail][]: 1
captcha[trail][]: 1
captcha[trail][]: 1
captcha[trail][]: 1
captcha[trail][]: 2
captcha[trail][]: 5
captcha[trail][]: 7
captcha[trail][]: 8
captcha[trail][]: 9
captcha[trail][]: 9
captcha[trail][]: 9
captcha[trail][]: 9
captcha[trail][]: 9
captcha[trail][]: 9
captcha[trail][]: 9
captcha[trail][]: 9
captcha[trail][]: 9
captcha[trail][]: 8
captcha[trail][]: 7
captcha[trail][]: 7
captcha[trail][]: 7
captcha[trail][]: 6
captcha[trail][]: 5
captcha[trail][]: 5
captcha[trail][]: 5
captcha[trail][]: 5
captcha[trail][]: 5
captcha[trail][]: 5
captcha[trail][]: 5
captcha[trail][]: 5
captcha[trail][]: 6
captcha[trail][]: 6
captcha[trail][]: 6
captcha[trail][]: 6
captcha[trail][]: 6
captcha[trail][]: 6
captcha[trail][]: 6
captcha[trail][]: 6
captcha[trail][]: 6
captcha[trail][]: 6
captcha[trail][]: 6
captcha[trail][]: 7
captcha[trail][]: 7
captcha[trail][]: 8
captcha[trail][]: 7
captcha[trail][]: 7
captcha[trail][]: 6
captcha[trail][]: 0
captcha[trail][]: 0
captcha[trail][]: 0
captcha[trail][]: 1
captcha[trail][]: 2
captcha[trail][]: 2
captcha[trail][]: 4
captcha[trail][]: 5
captcha[trail][]: 6
captcha[trail][]: 8
captcha[trail][]: 9
captcha[trail][]: 11
captcha[trail][]: 12
captcha[trail][]: 12
captcha[trail][]: 12
captcha[trail][]: 12
captcha[trail][]: 12
captcha[trail][]: 12
captcha[trail][]: 12
captcha[trail][]: 12
captcha[trail][]: 12
captcha[trail][]: 12
captcha[trail][]: 12
captcha[trail][]: 12
captcha[trail][]: 12
captcha[trail][]: 12
captcha[trail][]: 12
captcha[trail][]: 12
captcha[trail][]: 12
captcha[trail][]: 12
captcha[trail][]: 13
captcha[trail][]: 13
captcha[trail][]: 13
captcha[trail][]: 13
captcha[trail][]: 14
captcha[trail][]: 14
captcha[trail][]: 14
captcha[trail][]: 14
captcha[trail][]: 14
captcha[trail][]: 14
captcha[trail][]: 14
captcha[trail][]: 14
captcha[trail][]: 14
captcha[trail][]: 14
captcha[trail][]: 14
captcha[trail][]: 14
captcha[trail][]: 14
captcha[trail][]: 14
captcha[trail][]: 14
captcha[trail][]: 14
captcha[trail][]: 14
captcha[trail][]: 14
captcha[trail][]: 14
captcha[trail][]: 14
captcha[trail][]: 14
captcha[trail][]: 13
captcha[trail][]: 13
captcha[trail][]: 13
captcha[trail][]: 1
captcha[trail][]: 2
captcha[trail][]: 2
captcha[trail][]: 2
captcha[trail][]: 2
captcha[trail][]: 2
captcha[trail][]: 2
captcha[trail][]: 2
captcha[trail][]: 2
captcha[trail][]: 2
captcha[trail][]: 2
captcha[trail][]: 2
captcha[trail][]: 2
captcha[trail][]: 2
captcha[trail][]: 2
captcha[trail][]: 2
captcha[trail][]: 2
captcha[trail][]: 2
captcha[trail][]: 2
captcha[trail][]: 2
captcha[trail][]: 3
captcha[trail][]: 4
captcha[trail][]: 5
captcha[trail][]: 5
captcha[trail][]: 6
captcha[trail][]: 6
captcha[trail][]: 7
captcha[trail][]: 7
captcha[trail][]: 8
captcha[trail][]: 9
captcha[trail][]: 9
captcha[trail][]: 9
captcha[trail][]: 9
captcha[trail][]: 9
captcha[trail][]: 9
captcha[trail][]: 10
captcha[trail][]: 11
captcha[trail][]: 12
captcha[trail][]: 13
captcha[trail][]: 13
captcha[trail][]: 13
captcha[trail][]: 13
captcha[trail][]: 14
captcha[trail][]: 14
captcha[trail][]: 14
captcha[trail][]: 15
captcha[trail][]: 16
captcha[trail][]: 16
captcha[trail][]: 16
captcha[trail][]: 16
captcha[trail][]: 16
captcha[trail][]: 16
captcha[trail][]: 16
captcha[trail][]: 16
captcha[trail][]: 16
captcha[trail][]: 16
captcha[trail][]: 16
captcha[trail][]: 16
captcha[trail][]: 16
captcha[trail][]: 16
captcha[trail][]: 16
captcha[trail][]: 16
captcha[trail][]: 16
captcha[trail][]: 16
captcha[trail][]: 16
captcha[trail][]: 17
captcha[trail][]: 17
captcha[trail][]: 17
captcha[trail][]: 17
captcha[trail][]: 17
captcha[trail][]: 18
captcha[trail][]: 18
captcha[trail][]: 18
captcha[trail][]: 18
captcha[trail][]: 18
captcha[trail][]: 18
captcha[trail][]: 18
captcha[trail][]: 18
captcha[trail][]: 18
captcha[trail][]: 18
captcha[trail][]: 18
captcha[trail][]: 19
captcha[trail][]: 19
captcha[trail][]: 19
captcha[trail][]: 20
captcha[trail][]: 20
captcha[trail][]: 20
captcha[trail][]: 20
captcha[trail][]: 20
captcha[trail][]: 20
captcha[trail][]: 21
captcha[trail][]: 21
captcha[trail][]: 21
captcha[trail][]: 21

captcha[ticket]参数就是缺口加密。

captcha[randstr]参数与captcha验证码数据包返回的randstr值有关,生成这个参数需要获取captcha验证码数据包返回的randstr值。

captcha[check]参数是captcha验证码数据包返回的check值

captcha[spliced]是个固定值

captcha[trail][]就是轨迹。

在Initiator界面可以看到js代码除了jq便是slidercaptcha文件。进入到slidercaptcha文件里面。

12

12

一进入到函数内部就看到几个关键字。

13

13

这几个参数前两个参数都是随机生成的,完全可以写固值的。但是这个网站对于这几个参数有时间限制的,大概多少多少时间就会失效。如果用了过期的参数就会触发风控!但是短时间内使用固值完全可以的!

captcha[ticket]参数:

这个i方法跟验证码captcha数据的i方法是同一个的。

t.distance就是缺口识别的x值,他都没有图我们怎么识别缺口呀,由于这个ticket是随机值,即使我的缺口给的是固定值,他也是会变化的。我便把缺口写固定了。

captcha[randstr]参数:

randstr是由这段a + "" + o.substring(a, r) + r代码生成的。

a和r都是由n方法传进了两个数字生成的。n在上面已经扣过了,就是生成随机值的方法。

14

14

o是第一个验证码数据包captcha的rand_str值。用py爬取导入就行了。

15

15

结尾:

这个漏洞其实危害还是比较低的,因为他还是得逆向出来那几个值才能一直过滑块。

不逆出来的话会使用过期的参数会触发风控。当然不逆出来这个滑块验证码也可以短时间重复利用的。至于更多的细节我都录进视频里面了。
第一次录视频蛮紧张的,只录了一半。太紧张了,有点口吃。
视频链接:
挖洞遇到验证码那些事

温馨提示:未经合法授权不得进行非法肾透。

免费评分

参与人数 18威望 +1 吾爱币 +34 热心值 +16 收起 理由
wangwenjia + 1 + 1 用心讨论,共获提升!
笙若 + 1 + 1 谢谢@Thanks!
Garyqiang + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
canyon3 + 1 热心回复!
涛之雨 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
邱建忠 + 1 + 1 热心回复!
XMQ + 1 + 1 我很赞同!
莫奇 + 1 + 1 谢谢@Thanks!
ayuitheima + 1 + 1 谢谢@Thanks!
Yangzaipython + 1 + 1 鼓励转贴优秀软件安全工具和文档!
jay20070223 + 1 + 1 我真的谢了
asd_asd + 1 我很赞同!
yxpp + 1 谢谢@Thanks!
xiaoguo0825 + 1 用心讨论,共获提升!
dxiaolong + 1 + 1 谢谢@Thanks!
好吃懒做的蓝猫 + 1 + 1 谢谢@Thanks!
曾经的歌42 + 1 + 1 学习学习
Boly + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

mfvpnhaha 发表于 2023-7-19 17:36
本帖最后由 mfvpnhaha 于 2023-7-19 17:47 编辑

那这样说的话,小程序是否可以使用这样的思路来分析滑块?,但是小程序没有F12调式咋看代码啊
ashortname 发表于 2023-7-13 21:38
yis1 发表于 2023-7-13 22:00
yiwanguanghui 发表于 2023-7-13 22:07
学习了,感谢分享
huiwuwu 发表于 2023-7-13 22:33
楼主也是人才,大好的青年去当网吧服务员。。。
shksky 发表于 2023-7-13 23:12
谢谢你!!
pwp 发表于 2023-7-14 00:27
网站被大佬玩坏了
ztgzs 发表于 2023-7-14 00:34
所以老板看到这个帖子还会让搞卫生嘛
曾经的歌42 发表于 2023-7-14 00:48
方法内部必须要打断点还是啥   看到请求截图成功后面看不下去咯 谢谢分享
ccnhzz 发表于 2023-7-14 00:49
厉害了 又看到了一种新的思路
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 10:07

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表