豆瓣登陆验证码的识别脚本

2014-10-12 17:44:35 +08:00
 procen424
无意间发现豆瓣在登陆页使用了极验验证提供的验证码服务。
总觉得吧,这东西好像不安全。这个“基于行为的验证安全技术”到底是啥呢?
看了看调用的js,大概是只要鼠标发生移动就记录xy坐标和时间,最后对这个序列以及最终停下的位置分别加密,发给服务器判定。

那么问题来了。。。
1.最终停止位置xpos
每次验证请求都会得到三张图,fullbg:完整的验证图形、slice:拼图那一小块、bg:拼图对应那一块加阴影的fullbg,对比fullbg和bg,哪一列像素上开始发生较大变化那就是xpos
如果以后不提供fullbg,只要得到几张不同的bg,求它们的交集即可得到fullbg,不需要机器学习算法
2.鼠标移动轨迹a
根据xpos可以确定大概需要生成多少帧
x随帧编号产生不均匀增加,直至xpos,开始是用arctan函数模拟的,后来发现完全没必要,建个bitmap[xpos],从里面随机挑选不重复项选就行了
y用长周期小振幅的sin函数模拟
t随时间产生不均匀增加,并加入一些跳变
用以上方法填充a
3.加密
不需要破解,从js中剥离加密相关的函数,放入js虚拟机,传入xpos和a并执行,获得加密后结果

问题解决,大家应该知道哪家强了。。。

代码戳这里
https://github.com/procen424/scripts/blob/master/geetest-bypass.go
写得仓促,码风dirty

说明
go run geetest-bypass.go -c=次数 -gt="站点的gtid" 默认尝试豆瓣的验证码100次
success = 1 message = blahblahblah 通过
success = 0 message = failed 未通过
forbidden 判定为机器人

截至发帖时,识别通过率99%+
大家尽情玩耍
30217 次点击
所在节点    分享创造
93 条回复
procen424
2014-10-13 08:49:38 +08:00
@est 嗯。开始写脚本时还有这个顾虑呢,后来发现,我在得到challenge后就马上提交一个response,总耗时在500ms内,但response的数据号称是1500ms时完成滑动的,居然TMD都可以!笑死我了。。。
mornlight
2014-10-13 09:00:43 +08:00
我猜极验的程序员已哭晕在厕所...
kisshere
2014-10-13 09:03:29 +08:00
话说,客户端修改user-agent不是分分钟的事么,极限验证这种做法我就觉得不靠谱
matrix67
2014-10-13 09:18:10 +08:00
@est 那我拿着不全的参数整天在移动网络或者校园网络出口出发包,造成整个学校都上不了豆瓣的拒绝式服务攻击
est
2014-10-13 09:21:28 +08:00
@matrix67 如果你能控制出口了,能干出来的事不仅这么点吧。
vuser
2014-10-13 09:22:20 +08:00
“哪一列像素上开始发生较大变化那就是xpos”
极验改改这里呢
bigtan
2014-10-13 09:23:40 +08:00
@procen424 那个使用多少时间,打败了多少用户不就是抄360那个开机启动时间的玩法
bigtan
2014-10-13 09:31:51 +08:00
@est 你是说通过综合各种因素而不仅仅验证的正确性来判断?
sunocean
2014-10-13 09:39:41 +08:00
@ procen424 你就不能周一再公布吗?你让人家程序员大周末晚上还得加班。程序员何苦为难程序员啊,极验的程序员估计已经哭晕在厕所。
sunocean
2014-10-13 09:42:02 +08:00
@procen424 对于楼主这种行为我只想说三个字,干得漂亮
hewigovens
2014-10-13 09:53:03 +08:00
刚试了下, 已经各种forbidden了
procen424
2014-10-13 09:54:11 +08:00
@vuser 在CAPTCHA图像上,极验未来的对策可能会有这些:1.取消fullbg;2.bg中加扰;3.动态bg,每张背景都不一样;4.多个slice阴影
解决方案:
A.寻找bg中灰度较大较一致、亮度较低的区域(已试验过此方法,与目前的朴素算法相比,误差为±3,但有个别图像不能正确识别)
B.基于轮廓的形状匹配算法
C.神经网络
长远来看,精心调教过的B方案,应该是极好的,能应付不是特别变态的变化。
C方案完全不懂,只是猜测。正好借这个机会学习一下。
procen424
2014-10-13 09:59:15 +08:00
@hewigovens 现在又加入referer的检测了
procen424
2014-10-13 10:00:03 +08:00
@bigtan 满满的360既视感哈哈哈哈
kisshere
2014-10-13 10:01:32 +08:00
@procen424 referer ip user-agent mac不是全都能伪造么
bigtan
2014-10-13 10:03:46 +08:00
更加严苛的算法验证带来的好处是更小可能性的二类错误,但是同时也会提高一类错误的可能性。
tonyup
2014-10-13 10:06:59 +08:00
本来拼图这活是需要人脑识别的,但把完整图片 fullbg 也传回客户端,这事再让机器干就容易多了。
procen424
2014-10-13 10:13:01 +08:00
@kisshere 伪造很容易。完全可以收集一些user-agent的模式,然后随机填版本号。至于referer,只有固定的那么几个。
procen424
2014-10-13 10:15:30 +08:00
@tonyup 完全不解他们这么做的用意
即便不传fullbg,如果每张bg的背景不发生变化,运气好只要两次就能拼出fullbg。
wangleineo
2014-10-13 10:17:55 +08:00
赞楼主一个,这就是极客!

验证码校验是两个动作,识别+输入,现在的验证码之所以让人讨厌,主要的问题不是识别,而是输入太麻烦(现在有中英文数字混杂的校验码,还要切换输入法啊喂)。极验验证的确降低了输入的难度,但是同时也大大降低了机器识别的难度:图片什么的都是障眼法,其实原理上就是:在这条白线上有个黑点,请把鼠标拖动到黑点上,程序比比像素就能实现;关于行为的部分,我实在想不出除了鼠标移动速度不均匀之外,还能有什么特征,楼主的程序用随机数和正弦曲线就搞定了。

现在问题来了:怎样在降低输入难度的前提下,不降低识别难度?

我有个想法。图像识别在很大程度上还是机器很难解决的问题,可以用一个不规则形状的小图片覆盖在原图的随机位置上(在服务器端渲染),要求用户点击这个小图片中的物体。比如:“这个图片中有一只猫,请你点击这只猫“,对于用户来说,识别和输入都不难,但是对于机器来说,在图片中找到一只猫应该还是比较难的(虽然Google的技术已经能做到)。当然如果猫的小图片只有一个,很容易暴力破解(在所有标识猫的图片找相同的像素区域),但是这个猫的图片也可以有很多(各种颜色的猫,甚至机器猫),再加上随机的像素混淆,应该还是难于攻破的。
一开始想的是要求用户把一个滑块拖动到猫的位置,记录坐标轨迹。但想想所谓的”行为特征“如此容易随机生成,感觉没啥价值。还不如直接点击呢。

大家觉得怎么样?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/138479

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX