Rapid_Typing

Hello world,hello blog!

Posted by 吴柚 on March 27, 2019

#

Web Rapid Typing

(1)题目描述

  • 从题目描述来看,和Calculator性质类似,需要快速获取网页内容,经过处理后返回结果

import requests

url_1 = ‘http://web1.blue-whale.me:23331/captcha/’

url_2 = ‘http://web1.blue-whale.me:23331/captcha/?code=’

session = requests.session()

r = session.get(url)

html = r.text

(2)问题分析

  1. 打开网页源代码后,发现验证码在标签内部,而且验证码是经过base64编码的,因此需要使用base64库进行解码。

  1. 将验证码的图片下载到本地,发现是svg格式,google以后发现,用户可以直接用代码来描绘图像,可以用任何文字处理工具打开SVG图像,通过改变部分代码来使图像具有交互功能,并可以随时插入到HTML中通过浏览器来观看。

  2. 使用记事本打开svg图片,发现text里面有不同的x,y值,猜测应该是验证码的横、纵坐标,所以最后将验证码返回结果时,应该按照x坐标来进行排序

  1. google后得知可以使用BeautifulSoup来从xml中提取数据

(3)解题

  1. 与URL建立连接
    session = requests.session()
    r = session.get('http://123.207.149.64:23331/captcha/')
    r.encoding = "utf-8"
  1. 使用BeautifulSoup获取SVG源码
BS = BeautifulSoup(r.text, "html.parser")
    img_0 = BS.find_all(name="img")
    for each in img_0:
        svg = each.get('src')
    svg = svg.split(",")[-1]
  1. base64解码
svg_0 = base64.b64decode(svg)
BS = BeautifulSoup(svg_0, "html.parser")
text_0 = BS.find_all(name="text")
  1. 将解码后得到的字符按x排序
line_1 = sorted(text_0, key=lambda x: int(x.get("x")))
    x = ""
    for each in line_1:
        x += each.string
  1. 得到flag