一个简单的人肉刷票机演示

随着网络投票的兴起,刷票工具也应运而生。相关的技术分析也看了不少,正好碰上个机会,用python做了一个基于urllib的简单人肉刷票机。重点在思路分析和练手,所以下面把目标站点的信息都擦了,主要看个思路,不建议大家做坏事哟~

投票场景基本分析

首先浏览一下投票页面,试着投了一票。发现再打开投票链接的时候浏览器就提示“你已参加过投票活动”。不可能靠IP识别用户,基本就是靠cookie了,果然清空一下就能反复投票,也没有发现对其它用户特征的识别限制。不过投票之前要先点击“获取验证码”,获取一个验证码图片进行输入验证,获取过程应该就是JS触发一个GET请求,验证码也都是规整的字母数字,估计随便找个在线OCR能搞定(好吧这里是我天真了),反正先按照套路接下来就是分析投票的HTTP请求,试着用程序模拟了。

HTTP请求分析

各类文章对HTTP请求的分析也很多,就不详细说了,挂上Burpsuit直接看结果:

先看看访问投票页面的响应,有用的信息有几个:

  • 头部Set-Cookie的内容
  • 返回页面上验证码区域有一个"InstanceId"参数
投票首页的返回头部
投票首页返回部分内容

再看拦截到的请求验证码的过程

  • GET请求里有两个变化的参数 t和d,t就是投票页面返回的那个InstanceId,(和上面那张图里的参数不一样..因为不是一次过程的,我懒得找了=、=),d目测是个时间参数,事实证明删了也无妨..于是就被我去掉了。(后面提交投票的时候也有这个参数,那个时候就不能忽略了)
  • 注意这个请求是带cookie的,经测试没有cookie的话,请求出来的永远都是同一张图片。后来分析应该是它在后台根据cookie里jac这个字段和t一起去随机匹配了一个图片,并在后台和jac关联了,提交之后根据这个进行验证。

请求验证码图片的请求报文头

插曲
到这里,已经能通过模拟获得验证码了,本来打算用个在线OCR识别一下做成全自动,然而在做参数试验的时候,网站对提交应该是有防护预警的,识别到可疑行为之后先是暂停了一下,再开放之后验证码难度飙升,各种扭曲旋转中文字,反正它对单IP的访问频率也有限制,俺们也不是真的要做坏事,这里就搞成人肉模式了,获取验证码之后会弹出图片和程序输入提示,人肉识别输入完成提交。

提交的请求
先吐槽一下,这里的数据提交都还是用GET请求..基本没什么问题

  • rn参数里前半段是固定的,后半段就是cookie里jac的数值
  • t参数,就是当前时间,time.time()*1000
  • validate_text和btuserinput是验证字符串,urlencoded
提交投票请求

一路提交完,刷一下页面就可以看到投票成功咯~

几个思考

  • 后面代码里可以看到,这种模拟还是比较低级的,包括手动处理cookie信息。后来查到有一些库在模拟浏览器会话上做了高层封装,应该会更方便,以后可以进一步研究。
  • 图片验证码? 随着识别技术不断发展,纯粹的图片验证码要么就是分分钟被程序做掉,要么就是分分钟把用户做掉(对啊对啊,我说的就是你,12xxx)。不知道未来的方向会是怎么样,现在开始出现越来越多基于行为的验证码输入(比如要你拖动滑块完成图片拼图),搜到很多似乎都是来自极验验证的,也许是今后的一个趋势。
  • 网站防护与数据分析。当传统的验证手段越来越难以阻止用户进行非常规操作(我觉得今后业余用户能写几手代码抓几行包的能力会越来越强,何况还有这么多工具提供者),我们如果作为网站的运营维护人员,要怎么应对?答案也许在于对访问数据的充分挖掘和分析上。我自己的观念也在转变,做好网站安全,并不是上一套一套安全设备,一个个检查特征库更新全,补丁打完就够了。漏洞防不胜防,总有各种0day,依赖对已知攻击的特征检查和防护永远慢人一步。而如果能从更多的方面来分析访问请求、从数据统计上着手,也许我们距离最前沿的攻击就只差半步了。当然现实往往是残酷的,很多网站也许根本就倒在了第一步“数据收集”,要么信息不全要么记录漫无目的。其实这也许才是最重要的一步,该记录哪些数据?记在哪里?怎么记?能否有效快速访问?这一步做好了,后面的分析处理就可以天马行空了。像我这次这样简单的刷票应该分分钟就被干掉或者统计时就被排除掉了^^

最后附上代码,比较简单就没有写注释(好吧我承认还是因为我懒),和上面的过程是一样的大家不要做坏事哟
#coding=utf-8
from BeautifulSoup import *
import cStringIO
import urllib
import re
from PIL import Image
import time
import urllib2

  url1 = 'http://www.example.com/'
  url2 = 'http://www.example.com/***?activity=***&get=image&c=DesignerInitializedCaptcha&t='
  while True:
      cookie = ''
      iid = ''
      page = urllib.urlopen(url1)
      for header in page.info().headers:
          if 'Set-Cookie' in header:
              cookie += re.findall(r'Set-Cookie:( \S*;)',header)[0]
      
      rnd = re.findall(r'jac*****=(.*);',cookie)[0]
      
      soup = BeautifulSoup(page)
      tags = soup('img')
      for tag in tags:
          if tag.get('instanceid', None):
              iid = tag.get('instanceid')
      
      req = urllib2.Request((url2 + iid))
      req.add_header('Host',' www.example.com')
      req.add_header('Proxy-Connection','keep-alive')
      req.add_header('Accept','image/webp,image/*,*/*;q=0.8')
      req.add_header('Referer','http://www.example.com/')
      req.add_header('User-Agent','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36')
      req.add_header('Accept-Encoding','gzip, deflate, sdch')
      req.add_header('Accept-Language','zh-CN,zh;q=0.8,en;q=0.6,ja;q=0.4')
      req.add_header('Cookie', cookie)
      
      cfile = cStringIO.StringIO(urllib2.urlopen(req).read())
      img = Image.open(cfile)
      img.show()
      
      cpt = raw_input('验证码是多少:')
      
      data = {'validate_text':cpt, 'source':'directphone', 'submittype':'1', 'rn':'3525361439.'+rnd, 'btuserinput':cpt, 'btcaptchaId':'DesignerInitializedCaptcha', 'btinstanceId':iid, 't':str(int(time.time()*1000)), 'submitdata':'1$29|31|32|33', 'useget':1}
      url3 = 'http://www.example.com/***?curid=7125344&starttime=2016%2F2%2F3%2019%3A32%3A15&' + urllib.urlencode(data)
      
      req = urllib2.Request(url3)
      req.add_header('Host',' www.example.com')
      req.add_header('Proxy-Connection','keep-alive')
      req.add_header('Accept','*/*')
      req.add_header('X-Requested-With','XMLHttpRequest')
      req.add_header('Referer','http://www.example.com/')
      req.add_header('User-Agent','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36')
      req.add_header('Accept-Encoding','gzip, deflate, sdch')
      req.add_header('Accept-Language','zh-CN,zh;q=0.8,en;q=0.6,ja;q=0.4')
      req.add_header('Cookie', cookie)
      
      result = urllib2.urlopen(req)
      
      print result.read()
      time.sleep(10)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,825评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • HTTP cookie(也称为web cookie,网络cookie,浏览器cookie或者简称cookie)是网...
    留七七阅读 17,879评论 2 71
  • 吹响这支柳笛,咱们就回家。 容我自私一次,留下时光的话记。我想大学该从一个姑娘说起,这个姑娘,是你。 并不是我大学...
    Atuazi阅读 493评论 8 3
  • 今天提早了半小时去食堂吃饭,刚好和产线作业员的时间碰上了,因为在排队,扫视了一下整个食堂吃饭的人员,大部分应该是刚...
    云沐妈妈阅读 128评论 0 0