利用简易爬虫完成一道基础CTF题
利用简易爬虫完成一道基础CTF题
声明:本文主要写给新手,侧重于表现使用爬虫爬取页面并提交数据的大致过程,所以没有对一些东西解释的很详细,比如表单,post,get方法,感兴趣的可以私信或评论给我。如果文中有哪些问题,也欢迎大家指正。
Written by Menglin Ma
写在前面
如果有想学习基础爬虫的同学,建议在中国大学MOOC上搜索嵩天老师的爬虫课程,讲的真的很细致,也很基础。
想入门CTF的同学,给你们推荐个基础的网站,上面的好多题对新手比较友好:www.shiyanbar.com
。初学者可以先从基础密码学开始,比其他的部分相对容易。
题目描述
100米你能跑多快? 预备,跑!
解题链接: http://ctf5.shiyanbar.com/jia
via:www.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 re
import requests
#发送post和get请求的url
get_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_encoding
print(response.text[:1000])
运行并拿到key
Vscode下运行该程序,得到了KEY的值
最新文章
- linux sudo 命令
- Lucene 单域多条件查询
- mysql主备(centos6.4)
- [Codevs 1421]秋静叶&;秋穣子(最大-最小博弈)
- Ques核心思想——CSS Namespace
- [CLR via C#]15. 枚举类型和位标志
- 手机/平板 连接局域网访问局域网电脑Web服务器进行移动端页面测试
- ffmpeg显示视频
- hadoop HDFS 写入吞吐量
- N - Find a way
- Candy 解答
- gets()函数
- 一次搞懂 Assets Pipeline 转载自http://gogojimmy.net/2012/07/03/understand-assets-pipline/
- Android之自定义Adapter的ListView
- jquery事件使用方法总结
- intptr_t 指针(转)
- JavaScript实现省市区的三级联动
- 使用js生成二维码和条形码
- <;Spark Streaming>;<;本地调试>;
- 最长上升子序列 and 最长公共子序列 问题模板
热门文章
- EF7 在ASP.NET5 RC1版本中数据结构合并的问题
- 检测对象类型的两种方式,constructor属性和instanceof
- 对vuex分模块管理
- luogu4302字符串折叠题解--区间DP
- android默认获取敏感权限
- com.android.ddmlib.adbcommandrejectedexception:未经授权的设备。
- 远程操控批量复制应用(scp/pssh/pscp.pssh/rsync/pslurp)
- GOLANG利用断言调用结构体内特有的方法-
- YOLO---YOLOv3 with OpenCV安装与使用
- P4390 [BOI2007]Mokia 摩基亚 (CDQ解决三维偏序问题)