利用简易爬虫完成一道基础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的值

最新文章

  1. linux sudo 命令
  2. Lucene 单域多条件查询
  3. mysql主备(centos6.4)
  4. [Codevs 1421]秋静叶&amp;秋穣子(最大-最小博弈)
  5. Ques核心思想——CSS Namespace
  6. [CLR via C#]15. 枚举类型和位标志
  7. 手机/平板 连接局域网访问局域网电脑Web服务器进行移动端页面测试
  8. ffmpeg显示视频
  9. hadoop HDFS 写入吞吐量
  10. N - Find a way
  11. Candy 解答
  12. gets()函数
  13. 一次搞懂 Assets Pipeline 转载自http://gogojimmy.net/2012/07/03/understand-assets-pipline/
  14. Android之自定义Adapter的ListView
  15. jquery事件使用方法总结
  16. intptr_t 指针(转)
  17. JavaScript实现省市区的三级联动
  18. 使用js生成二维码和条形码
  19. &lt;Spark Streaming&gt;&lt;本地调试&gt;
  20. 最长上升子序列 and 最长公共子序列 问题模板

热门文章

  1. EF7 在ASP.NET5 RC1版本中数据结构合并的问题
  2. 检测对象类型的两种方式,constructor属性和instanceof
  3. 对vuex分模块管理
  4. luogu4302字符串折叠题解--区间DP
  5. android默认获取敏感权限
  6. com.android.ddmlib.adbcommandrejectedexception:未经授权的设备。
  7. 远程操控批量复制应用(scp/pssh/pscp.pssh/rsync/pslurp)
  8. GOLANG利用断言调用结构体内特有的方法-
  9. YOLO---YOLOv3 with OpenCV安装与使用
  10. P4390 [BOI2007]Mokia 摩基亚 (CDQ解决三维偏序问题)