翼度科技»论坛 编程开发 python 查看内容

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

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
最后编辑时间:2024-09-13 09:23:09 星期五
利用python自动请求网页(面向CTF)

前置知识:

  • Python
  • HTML
  • Burp(或者任何一个你趁手的抓包软件)
  • VS Code(或者任何一个你熟悉的编辑器)
  • 浏览器开发者模式(F12)
  • POST请求和GET请求
  • shell/cmd使用
  • 搭建web服务器基础
为什么我们需要利用python来进行请求?

我们先来看看不使用python来进行请求的情况
1. 使用浏览器


  • GET请求
    在浏览器地址框输入:
  1. <url>?<GET参数>=<你请求的内容>&<GET参数2>=<内容>
  2. //例如
  3. http://127.0.0.1:8080?str="你好"
  4. 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命令
  1. curl -X POST -H "flag=我是post请求" http://127.0.0.1:8080?data="我是get请求"
复制代码
终于可以自动填充了,但是shell语法并不是所有人都会(难写)。而且返回的是页面HTML代码,没办法自定义获取处理,顶多算一个半自动
3. 使用Python

先贴代码
  1. # 导入requests库
  2. import requests
  3. # 获取响应文本
  4. def getStr(session:requests.Session , url:str , postData: dict[str, str]) -> str:
  5.         # 进行POST请求
  6.         response: requests.Response = session.post(url,postData)
  7.         # 获取POST响应内容
  8.         text: str =response.text
  9.         # 传入文本处理函数
  10.         textList: list[str] = textProcessing(text)
  11.         #其它业务逻辑,比方说再次请求
  12.         #可选,用于debug
  13.         print(text)
  14.         return text
  15. def textProcessing(text:str)->list:
  16.         #在这里放置你要的文本处理逻辑
  17.         textList: list[str] = list(map(str,text.split("\n")))
  18.         return textList
  19. if __name__=="__main__":
  20.         #使用 requests.session()保存登录状态
  21.         session: requests.Session = requests.session()
  22.         #放入你要请求的网站
  23.         url:str ="http://127.0.0.1:80"
  24.         #放入你要请求的post数据
  25.         postData: dict[str, str] = {
  26.                 "data" : "flag",
  27.                 "str" : "1145"
  28.         }
  29.         #使用函数
  30.         getStr(session,url,postData)
复制代码
口瓜 ,你这一点都不python,为什么有一堆类型标注
(实际上我还开了类型检查
如果你实在觉得这段代码不优雅,这里有个你能接受的版本
点击查看代码
  1. # 导入requests库
  2. import requests
  3. # 获取响应文本
  4. def getStr(session , url , postData:]):
  5.         # 进行POST请求
  6.         response = session.post(url,postData)
  7.         # 获取POST响应内容
  8.         text =response.text
  9.         # 传入文本处理函数
  10.         textList = textProcessing(text)
  11.         #其它业务逻辑,比方说再次请求
  12.         #可选,用于debug
  13.         print(text)
  14.         return text
  15. def textProcessing(text):
  16.         #在这里放置你要的文本处理逻辑
  17.         textList = list(map(str,text.split("\n")))
  18.         return textList
  19. if __name__=="__main__":
  20.         #使用 requests.session()保存登录状态
  21.         session = requests.session()
  22.         #放入你要请求的网站
  23.         url="http://127.0.0.1:80"
  24.         #放入你要请求的post数据
  25.         postData= {
  26.                 "data" : "flag",
  27.                 "str" : "1145"
  28.         }
  29.         #使用函数
  30.         getStr(session,url,postData)
复制代码
强大、优雅、美丽!我们只需要把网站当成一个I/O设备就可以轻松的请求和发送请求了。
顺带一提,只要改一点点小地方,就是爬虫了
来,实战,战斗,爽!



  • 先看题,摆明了是不可能手算的
  • 填入任意数值,尝试抓包

    在这里可以清楚的看到,是用POST提交的direct参数
  • 尝试寻找题目的特征点

    我们发现,是把题目放在标签的,这就好办了
  • 修改代码
  1. # 导入requests库
  2. import requests
  3. # 导入正则库
  4. import re
  5. # 获取响应文本
  6. def getStr(session:requests.Session , url:str , postData: dict[str, str]) -> None:
  7.         # 进行POST请求
  8.         response: requests.Response = session.post(url,postData)
  9.         # 获取POST响应内容
  10.         text: str =response.text
  11.         # 传入文本处理函数
  12.         textProcessing(session,url,text)
  13. def textProcessing(session:requests.Session , url:str,text:str)->None:
  14.         #在这里放置你要的文本处理逻辑
  15.         textList: list[str] = list(map(str,text.split("\n")))
  16.         #存储计算结果
  17.         Post:str=""
  18.         #匹配h2标签
  19.         pattern: re.Pattern[str] = re.compile(r'<h2 id="question">(.*?)</h2>', re.DOTALL)
  20.         for line in textList:
  21.                 match: re.Match[str] | None = pattern.search(line)
  22.                 if match:
  23.                         Post:str = str(eval(match.group(1)))#计算算式
  24.                         postData:dict[str,str]={"direc":Post}
  25.                         getStr(session,url,postData)#再次请求
  26.                         break
  27.         else:
  28.                 print(text)#找到了flag
  29. if __name__=="__main__":
  30.         #使用 requests.session()保存登录状态
  31.         session: requests.Session = requests.session()
  32.         #放入你要请求的网站
  33.         url:str ="http://127.0.0.1:80"
  34.         #放入你要请求的post数据
  35.         postData: dict[str, str] = {}
  36.         #使用函数
  37.         getStr(session,url,postData)
复制代码
同样提供优雅版
点击查看代码
  1. # 导入requests库
  2. import requests
  3. # 导入正则库
  4. import re
  5. # 获取响应文本
  6. def getStr(session , url , postData):
  7.         # 进行POST请求
  8.         response = session.post(url,postData)
  9.         # 获取POST响应内容
  10.         text =response.text
  11.         # 传入文本处理函数
  12.         textProcessing(session,url,text)
  13. def textProcessing(session , url , text):
  14.         #在这里放置你要的文本处理逻辑
  15.         textList = list(map(str,text.split("\n")))
  16.         #存储计算结果
  17.         Post = ""
  18.         #匹配h2标签
  19.         pattern = re.compile(r'<h2 id="question">(.*?)</h2>', re.DOTALL)
  20.         for line in textList:
  21.                 match = pattern.search(line)
  22.                 if match:
  23.                         Post = str(eval(match.group(1)))#计算算式
  24.                         postData = {"direc":Post}
  25.                         getStr(session,url,postData)#再次请求
  26.                         break
  27.         else:
  28.                 print(text)#找到了flag
  29. if __name__=="__main__":
  30.         #使用 requests.session()保存登录状态
  31.         session = requests.session()
  32.         #放入你要请求的网站
  33.         url ="http://127.0.0.1:80"
  34.         #放入你要请求的post数据
  35.         postData = {}
  36.         #使用函数
  37.         getStr(session,url,postData)
复制代码
运行,坐等flag上门
总结

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

来源:https://www.cnblogs.com/resea/p/18411977
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具