当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2013-046655

漏洞标题:12306弱验证码可被轻松识别

相关厂商:中国铁道科学研究院

漏洞作者: debbbbie

提交时间:2013-12-21 21:11

修复时间:2013-12-22 00:37

公开时间:2013-12-22 00:37

漏洞类型:设计缺陷/逻辑错误

危害等级:低

自评Rank:4

漏洞状态:漏洞已经通知厂商但是厂商忽略漏洞

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2013-12-21: 细节已通知厂商并且等待厂商处理中
2013-12-22: 厂商已经主动忽略漏洞,细节向公众公开

简要描述:

图形验证码非常简单,简单的程序即可识别

详细说明:

1-1.png


12306的验证码抗干扰难度很低。
利用photoshop的色调分离技术,即可得到辨识度很高的图片。
色调分离很容易实现,比如当参数为 3 时,会把图片红蓝绿每个通道简化成 3 个颜色值, 并最终形成 3 x 3 = 9 个颜色值。

1-2.png


然后配上简单的优化,即把没有上下相邻都没有颜色的点排除掉。

1-3.png


将此图片交给 Tesseract-OCR,10% 的识别率有木有。
10% 的合格率已经合格了哟,配上代理服务器,是不是可以随心所欲的做你想要做的任何事,拖库、抢票。。。?

漏洞证明:

色调分离的代码实现

# 色调分率实现
def color_sep(img, count=3):
min, max = [127, 127, 127], [128, 128, 128]
w, h = img.size
pix = img.load()
for x in xrange(w):
for y in xrange(h):
if max[0] < pix[x, y][0]: max[0] = pix[x, y][0]
if max[1] < pix[x, y][1]: max[1] = pix[x, y][1]
if max[2] < pix[x, y][2]: max[2] = pix[x, y][2]
if min[0] > pix[x, y][0]: min[0] = pix[x, y][0]
if min[1] > pix[x, y][1]: min[1] = pix[x, y][1]
if min[2] > pix[x, y][2]: min[2] = pix[x, y][2]
d = [(max[0] - min[0]) * 1.0 / count, (max[1] - min[1]) * 1.0 / count, (max[2] - min[2]) * 1.0 / count]
targetD = [255.0 / (count - 1), 255.0 / (count - 1), 255.0 / (count - 1)]
for x in xrange(w):
for y in xrange(h):
new = ( int(int((pix[x, y][0] - min[0]) / d[0]) * targetD[0]), \
int(int((pix[x, y][1] - min[1]) / d[1]) * targetD[1]), \
int(int((pix[x, y][2] - min[2]) / d[2]) * targetD[2]) )
pix[x, y] = new


识别验证码所用的样本图片:

1-4.png


实验结果,采集途径北京北站的火车:

1-5.png

修复方案:

改进验证码生成算法

版权声明:转载请注明来源 debbbbie@乌云


漏洞回应

厂商回应:

危害等级:无影响厂商忽略

忽略时间:2013-12-22 00:37

厂商回复:

验证码搞复杂了,机器不好认,用户同样不好认。
验证码搞简单了,机器好认,用户也好认。
多加几条干扰线毫不费劲,为了用户购票体验,我们选择简单验证码。
也借贵平台表达对开发并吹嘘自动识别12306验证码的多个浏览器和厂商的鄙视,你们的下限再次让我们佩服。
谢谢乌云及白帽子网友的提醒!

最新状态:

暂无