利用简易爬虫完成一道基础CTF题

来自专栏 HBU Computer Science4 人赞了文章

利用简易爬虫完成一道基础CTF题

声明:本文主要写给新手,侧重于表现使用爬虫爬取页面并提交数据的大致过程,所以没有对一些东西解释的很详细,比如表单,post,get方法,感兴趣的可以私信或评论给我。如果文中有哪些问题,也欢迎大家指正。

Written by Menglin Ma

写在前面

如果有想学习基础爬虫的同学,建议在中国大学MOOC上搜索嵩天老师的爬虫课程,讲的真的很细致,也很基础。

想入门CTF的同学,给你们推荐个基础的网站,上面的好多题对新手比较友好:shiyanbar.com 。初学者可以先从基础密码学开始,比其他的部分相对容易。

题目描述

100米你能跑多快? 预备,跑! 解题链接: ctf5.shiyanbar.com/jia

via:shiyanbar.com

将网址打开后是这样的,一个很复杂的表达式,需要在三秒内提交,依靠人的力量几乎是不可能的(神仙除外)。最靠谱的方法就是利用程序来计算这个表达式,然后自动提交结果。本文采用的是利用简易Python爬虫来实现表达式的自动计算与提交,来获取含有flag页面的方法。

页面分析

使用爬虫爬取页面的第一步就是分析页面。在这道题目中,需要获取需要提交表单的参数,以及所需计算表达式的位置。可以在输入窗口右键选择审查元素,查看所需信息。

在这里我们获得了所需要的信息:需要提交的值为pass_key的值,提交的方法为post方法,表达式夹在两个div标签之间,且div的name为my_expr是独一无二的,提交的动作为?action=check_pass。(关于HTML页面提交表单的一些详情可以尝试百度一下或私聊我)

爬虫编写

编写该爬虫需要一些前提条件,包括导入re库使用正则表达式,导入requests库爬取信息,还有就是需要获得目标网页的URL和需要发送的数据,这些条件要在程序中体现出来。

编写该爬虫大概需要以下几步:

1.导入必要的库2.利用get方法抓取页面3.利用正则表达式筛选表达式对应的字元串4.处理字元串并利用eval方法自动计算5.利用计算出的数值构造需要post的字典6.利用post方法(注意带上cookies)向伺服器发送数据,接收响应并列印

代码实现

import reimport requests#发送post和get请求的urlget_url = http://ctf5.shiyanbar.com/jia/post_url = http://ctf5.shiyanbar.com/jia/?action=check_pass#利用get方法获取网页数据r = requests.get(get_url)#构造与匹配正则表达式str_text = r"<div name=my_expr>.*</div>"match = re.search(str_text,r.text)#处理匹配后的结果result = match.group().replace("<div name=my_expr>","")result = result.replace("</div>","")if x in result: result = str(eval(result.replace(x,*)))#构造字典data = {pass_key:result}#利用post请求发送data和cookie数据,获得回复response = requests.post(post_url,data=data,cookies=r.cookies)response.encoding = response.apparent_encodingprint(response.text[:1000])

运行并拿到key

Vscode下运行该程序,得到了KEY的值,提交即可。

推荐阅读:

查看原文 >>
相关文章