首页 > 编程语言 >CTF/5/利用python自动请求网页

CTF/5/利用python自动请求网页

时间:2024-09-13 12:46:34浏览次数:1  
标签:网页 postData python text url CTF session str requests

最后编辑时间:2024-09-13 09:23:09 星期五

利用python自动请求网页(面向CTF)

前置知识:

  1. Python
  2. HTML
  3. Burp(或者任何一个你趁手的抓包软件)
  4. VS Code(或者任何一个你熟悉的编辑器)
  5. 浏览器开发者模式(F12)
  6. POST请求和GET请求
  7. shell/cmd使用
  8. 搭建web服务器基础

为什么我们需要利用python来进行请求?

我们先来看看不使用python来进行请求的情况

1. 使用浏览器

  1. GET请求
    在浏览器地址框输入:
<url>?<GET参数>=<你请求的内容>&<GET参数2>=<内容>
//例如
http://127.0.0.1:8080?str="你好"
http://127.0.0.1:1145/flag.php?data="flag"&str="Hello"
  1. POST请求
    在原生的浏览器中请求POST并不简单,在这里借助HackBar插件来进行
    image
    点击Load URL,以及Post Data,填入请求
    image
    点击Execute

十分甚至九分的麻烦,每一次都要手动调整,不能全自动填充,返回的也是浏览器页面,需要人工识别再次请求。

2. 使用shell/cmd/PowerShell

  1. 使用curl命令
curl -X POST -H "flag=我是post请求" http://127.0.0.1:8080?data="我是get请求"

终于可以自动填充了,但是shell语法并不是所有人都会(难写)。而且返回的是页面HTML代码,没办法自定义获取处理,顶多算一个半自动

3. 使用Python

先贴代码

# 导入requests库
import requests
# 获取响应文本
def getStr(session:requests.Session , url:str , postData: dict[str, str]) -> str:
	# 进行POST请求
	response: requests.Response = session.post(url,postData)
	# 获取POST响应内容
	text: str =response.text
	# 传入文本处理函数
	textList: list[str] = textProcessing(text)
	#其它业务逻辑,比方说再次请求

	#可选,用于debug
	print(text)
	return text

def textProcessing(text:str)->list:
	#在这里放置你要的文本处理逻辑
	textList: list[str] = list(map(str,text.split("\n")))
	return textList

if __name__=="__main__":
	#使用 requests.session()保存登录状态
	session: requests.Session = requests.session()
	#放入你要请求的网站
	url:str ="http://127.0.0.1:80"
	#放入你要请求的post数据
	postData: dict[str, str] = {
		"data" : "flag",
		"str" : "1145"
	}
	#使用函数
	getStr(session,url,postData)

口瓜 ,你这一点都不python,为什么有一堆类型标注
(实际上我还开了类型检查

如果你实在觉得这段代码不优雅,这里有个你能接受的版本

点击查看代码
# 导入requests库
import requests
# 获取响应文本
def getStr(session , url , postData:]):
	# 进行POST请求
	response = session.post(url,postData)
	# 获取POST响应内容
	text =response.text
	# 传入文本处理函数
	textList = textProcessing(text)
	#其它业务逻辑,比方说再次请求

	#可选,用于debug
	print(text)
	return text

def textProcessing(text):
	#在这里放置你要的文本处理逻辑
	textList = list(map(str,text.split("\n")))
	return textList

if __name__=="__main__":
	#使用 requests.session()保存登录状态
	session = requests.session()
	#放入你要请求的网站
	url="http://127.0.0.1:80"
	#放入你要请求的post数据
	postData= {
		"data" : "flag",
		"str" : "1145"
	}
	#使用函数
	getStr(session,url,postData)

强大、优雅、美丽!我们只需要把网站当成一个I/O设备就可以轻松的请求和发送请求了。
顺带一提,只要改一点点小地方,就是爬虫

来,实战,战斗,爽!

image

  1. 先看题,摆明了是不可能手算的
  2. 填入任意数值,尝试抓包
    image
    在这里可以清楚的看到,是用POST提交的direct参数
  3. 尝试寻找题目的特征点
    image
    我们发现,是把题目放在<h2 id="question"><h2>标签的,这就好办了
  4. 修改代码
# 导入requests库
import requests
# 导入正则库
import re
# 获取响应文本
def getStr(session:requests.Session , url:str , postData: dict[str, str]) -> None:
	# 进行POST请求
	response: requests.Response = session.post(url,postData)
	# 获取POST响应内容
	text: str =response.text
	# 传入文本处理函数
	textProcessing(session,url,text)

def textProcessing(session:requests.Session , url:str,text:str)->None:
	#在这里放置你要的文本处理逻辑
	textList: list[str] = list(map(str,text.split("\n")))
	#存储计算结果
	Post:str=""
	#匹配h2标签
	pattern: re.Pattern[str] = re.compile(r'<h2 id="question">(.*?)</h2>', re.DOTALL)
	for line in textList:
		match: re.Match[str] | None = pattern.search(line)
		if match:
			Post:str = str(eval(match.group(1)))#计算算式
			postData:dict[str,str]={"direc":Post}
			getStr(session,url,postData)#再次请求
			break
	else:
		print(text)#找到了flag

if __name__=="__main__":
	#使用 requests.session()保存登录状态
	session: requests.Session = requests.session()
	#放入你要请求的网站
	url:str ="http://127.0.0.1:80"
	#放入你要请求的post数据
	postData: dict[str, str] = {}
	#使用函数
	getStr(session,url,postData)

同样提供优雅版

点击查看代码
# 导入requests库
import requests
# 导入正则库
import re
# 获取响应文本
def getStr(session , url , postData):
	# 进行POST请求
	response = session.post(url,postData)
	# 获取POST响应内容
	text =response.text
	# 传入文本处理函数
	textProcessing(session,url,text)

def textProcessing(session , url , text):
	#在这里放置你要的文本处理逻辑
	textList = list(map(str,text.split("\n")))
	#存储计算结果
	Post = ""
	#匹配h2标签
	pattern = re.compile(r'<h2 id="question">(.*?)</h2>', re.DOTALL)
	for line in textList:
		match = pattern.search(line)
		if match:
			Post = str(eval(match.group(1)))#计算算式
			postData = {"direc":Post}
			getStr(session,url,postData)#再次请求
			break
	else:
		print(text)#找到了flag

if __name__=="__main__":
	#使用 requests.session()保存登录状态
	session = requests.session()
	#放入你要请求的网站
	url ="http://127.0.0.1:80"
	#放入你要请求的post数据
	postData = {}
	#使用函数
	getStr(session,url,postData)

运行,坐等flag上门

总结

Python是世界上最好的语言.cpp

标签:网页,postData,python,text,url,CTF,session,str,requests
From: https://www.cnblogs.com/resea/p/18411977

相关文章

  • Python与Go语言中的哈希算法实现及对比分析
    哈希算法是一种将任意大小的数据输入转化为固定大小的输出(通常为一个散列值)的算法,在密码学、数据完整性验证以及数据索引等场景中广泛应用。本文将详细介绍Python和Go语言如何实现常见的哈希算法,包括MD5、SHA-1、SHA-256等。文章不仅提供代码示例,还会详细解释每个算法的特点、应用......
  • Python 基础语法 06 包 模块
    模块概述模块是Python中一个包含Python代码的文件,通常以.py为扩展名。模块可以包含函数、类和变量,也可以包含可执行的代码。模块的主要作用是组织和封装代码,以便于重用和维护。导入模块的5种方式import模块名导入模块下所有的功能(函数、类等),但必须通过模块名.功能名()的......
  • 第1章 网页制作的基础知识
    1.1认识网页和网站1.11网页、网站网页和网站的区别:1、含义不同网站是按照一定规范和规则,使用HTML、JavaScript和CSS构成的网页集合;网页是网站的基本元素,展示给用户。2、关系不同网站包含了网页,网页是包含了HTML代码集合,呈现一个界面。3、组成不同网站由域名、服务器......
  • 快速编写一款python漏洞批量检测工具
    一、前言以下列检测脚本示列:importrequestsimporturllib3importre,string,randomfromurllib.parseimporturljoinimportargparseimporttimeimportsslssl._create_default_https_context=ssl._create_unverified_contexturllib3.disable_warnings(ur......
  • Python容器二之列表
    文章目录1.列表的基本使用1.1列表的定义1.2实例11.3访问列表元素和长度1.4实例22.列表的遍历2.1使用for遍历列表2.2使用while遍历列表3.操作列表3.1添加元素3.2删除元素3.3修改元素3.4查找元素3.5排序操作1.列表的基本使用1.1列表的定义列表类型......
  • KAN专家混合模型在高性能时间序列预测中的应用:RMoK模型架构探析与Python代码实验
    Kolmogorov-Arnold网络(KAN)的提出为深度学习领域带来了重要突破,它作为多层感知器(MLP)的一种替代方案,展现了新的可能性。MLP作为众多深度学习模型的基础构件,包括目前最先进的预测方法如N-BEATS、NHiTS和TSMixer,已经在各个领域得到广泛应用。但是我们在使用KAN、MLP、NHiTS和NBEATS进......
  • python 生成器
    一、可迭代对象、迭代器、生成器的区别可迭代对象:只要实现__iter__方法或者实现__getitem__方法而且其参数从0开始索引,那么该对象就是可迭代对象。可以用for循环遍历,常见的有string,list,tuple,dict,set。迭代器:实现了__iter__方法和__next__方法的对象。__iter......
  • 第一章 网页制作的基础知识
    1.1认识网页和网站1.1.1网页,网站及常用术语网页和网站是两个不同的概念,它们之间存在明显的区别。‌‌定义与组成‌:网页是网站的基本组成单元,它是由HTML、CSS、JavaScript等编写的单个页面,可以包含文本、图像、视频、链接等元素,用于展示信息或提供功能。而网站则是由多个网......
  • Python文件操作:上下文管理器(with语句)②
    文章目录1.上下文管理器概述1.1什么是上下文管理器?1.2为什么使用上下文管理器?1.3`with`语句的基本语法2.文件操作中的上下文管理器2.1使用`with`语句打开文件2.2读取文件2.2.1读取整个文件内容2.2.2逐行读取文件2.3写入文件2.3.1覆盖写入2.3.2追加写入3......
  • 【Python学习笔记】 第7章 字符串基础
    本章范围本章主要讲str字符串类型,有关的操作适用于Unicode处理。Unicode简介ASCII是Unicode的简单形式,但Unicode适用于非英语地区的人们。两者在文件中的编码不同。在Python3.X中,有三种字符串类型:str用于Unicode文本,bytes用于二进制数据,bytearray是bytes的一种可修改的变体......