最后编辑时间:2024-09-13 09:23:09 星期五
利用python自动哀求网页(面向CTF)
前置知识:
- Python
- HTML
- Burp(或者任何一个你趁手的抓包软件)
- VS Code(或者任何一个你熟悉的编辑器)
- 浏览器开辟者模式(F12)
- POST哀求和GET哀求
- shell/cmd使用
- 搭建web服务器基础
为什么我们需要利用python来举行哀求?
我们先来看看不使用python来举行哀求的环境
1. 使用浏览器
- <url>?<GET参数>=<你请求的内容>&<GET参数2>=<内容>
- //例如
- http://127.0.0.1:8080?str="你好"
- http://127.0.0.1:1145/flag.php?data="flag"&str="Hello"
复制代码
- POST哀求
在原生的浏览器中哀求POST并不简单,在这里借助HackBar插件来举行
点击Load URL,以及Post Data,填入哀求
点击Execute
十分甚至九分的麻烦,每一次都要手动调解,不能全自动添补,返回的也是浏览器页面,需要人工识别再次哀求。
2. 使用shell/cmd/PowerShell
- 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设备就可以轻松的哀求和发送哀求了。
顺带一提,只要改一点点小地方,就是爬虫了
来,实战,战斗,爽!
- 先看题,摆明白是不大概手算的
- 填入任意数值,尝试抓包
在这里可以清楚的看到,是用POST提交的direct参数
- 尝试寻找标题的特征点
我们发现,是把标题放在标签的,这就好办了
- 修改代码
- # 导入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
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |