本文从基础语法到实战脚本,带你掌握目录扫描、暴力破解、自动登录等渗透测试必备技能。适合入门者系统学习,也适合作为速查手册。
一、学习目标
掌握 requests 库语法,理解 HTTP 协议基础,能够编写目录扫描、暴力破解、自动登录等渗透/CTF 辅助脚本,为后续实战打基础。
二、核心知识速查
1. requests 基础:GET/POST 请求
基础语法
1 2 3 4 5 6 7 8 9 10 11 12 13
| import requests
headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36" }
resp_get = requests.get("https://httpbin.org/get", headers=headers, timeout=3)
data = {"username": "admin", "password": "test123"} resp_post = requests.post("https://httpbin.org/post", headers=headers, data=data, timeout=3)
|
关键参数对比
| 参数 |
适用请求 |
数据位置 |
典型用途 |
params |
GET |
URL 末尾(?key=value) |
传递查询参数、翻页 |
data |
POST |
请求体(Body) |
提交登录表单、业务数据 |
json |
POST |
请求体 |
传 JSON 格式接口数据 |
响应对象常用属性
1 2 3 4
| resp.status_code resp.text resp.json() resp.encoding
|
为什么重要
伪装成真实浏览器,避免被目标网站/WAF识别为Python脚本从而拒绝访问(返回403无法获取数据)。
标准写法(直接复制用)
1 2 3
| headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36" }
|
User-Agent 解析
1
| Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36
|
Mozilla/5.0:历史遗留,表示兼容 Mozilla
(Windows NT 10.0; Win64; x64):系统信息,伪装 Windows 10 64位
AppleWebKit/537.36:浏览器渲染引擎
Chrome/130.0.0.0:Chrome 浏览器版本号,伪装最新版
3. Session 会话对象:自动登录的核心
核心原理
HTTP 协议是无状态的,默认记不住用户登录状态。Session 模块可以自动管理Cookie,保持登录状态跨请求传递(登录后访问其他页面不用重新登录)。
标准用法
1 2 3 4 5 6 7 8 9
| s = requests.Session()
login_data = {"username": "admin", "password": "test123"} s.post("https://httpbin.org/post", headers=headers, data=login_data)
flag_resp = s.get("https://httpbin.org/get", headers=headers)
|
关键注意事项
- 必须用
s.post() / s.get(),不能混用全局 requests.post(),否则 Session 失效
- 会话对象循环外创建,避免每次新建会话浪费资源
- 典型用途:自动登录、爆破后保持状态、访问需要权限的页面(如flag页)
4. 循环 + 异常处理:健壮脚本的核心
for 循环:批量执行
用途:遍历列表批量执行相同操作(目录扫描、暴力破解的核心模式)
1 2 3 4 5
| path_list = ["get", "post", "headers", "ip", "cookies"] for path in path_list: url = f"https://httpbin.org/{path}" print(url)
|
f-string 格式化字符串
用途:在字符串中直接嵌入变量,避免繁琐拼接,清晰易读
1 2 3 4
| TARGET = "https://httpbin.org" path = "get" url = f"{TARGET}/{path}" print(f"[+] {url} -> 状态码: {resp.status_code}")
|
try…except 异常处理:脚本稳定运行的关键
用途:捕获网络异常,避免单个请求失败导致整个脚本直接终止,保证批量任务稳定执行
1 2 3 4 5 6 7 8 9
| try: resp = requests.get(url, headers=headers, timeout=3) print(f"[+] {url} -> 状态码: {resp.status_code}") except requests.exceptions.Timeout: print(f"[-] {url} -> 请求超时") except requests.exceptions.ConnectionError: print(f"[-] {url} -> 连接失败") except Exception as e: print(f"[-] {url} -> 未知错误: {str(e)}")
|
5. resp.json():JSON 响应处理
核心作用
把服务器返回的 JSON 字符串 转为 Python 字典,可以直接取值,适合接口、JSON格式返回的场景。
标准用法
1 2 3 4 5 6
| resp = requests.post("https://httpbin.org/post", data={"username": "admin"})
resp_json = resp.json()
username = resp_json["form"]["username"] username = resp_json.get("form", {}).get("username")
|
与 resp.text 的区别
| 方法 |
返回类型 |
能否直接取值 |
适用场景 |
resp.text |
字符串 |
❌ 不能 |
HTML页面、文本内容 |
resp.json() |
字典 |
✅ 能 |
JSON接口、数据返回 |
三、实战脚本:直接复制可用
1. 目录扫描脚本:批量扫描网站路径
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| import requests
headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36" }
TARGET = "https://httpbin.org"
PATH_LIST = ["get", "post", "headers", "ip", "cookies"]
print(f"[*] 开始扫描 {TARGET} 目录...\n") for path in PATH_LIST: url = f"{TARGET}/{path}" try: resp = requests.get(url, headers=headers, timeout=3) if resp.status_code != 404: print(f"[+] {url} -> 状态码: {resp.status_code}") except Exception as e: print(f"[-] {url} -> 请求失败: {str(e)}") continue
print("\n[*] 扫描完成!")
|
2. 密码爆破脚本:登录尝试 + 自动拿flag
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| import requests
headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36" }
LOGIN_URL = "https://httpbin.org/post" USERNAME = "admin"
PASSWORD_LIST = ["123456", "password", "admin", "root", "test123"]
session = requests.Session()
print(f"[*] 开始爆破用户: {USERNAME} 密码...\n") for pwd in PASSWORD_LIST: print(f"[*] 正在尝试密码: {pwd}") try: data = {"username": USERNAME, "password": pwd} resp = session.post(LOGIN_URL, headers=headers, data=data, timeout=3) resp_json = resp.json()
if (resp_json.get("form", {}).get("username") == USERNAME and resp_json.get("form", {}).get("password") == "test123"): print(f"\n✅ 爆破成功!用户: {USERNAME} 密码: {pwd}") flag_resp = session.get("https://httpbin.org/get", headers=headers, timeout=3) print(f"[+] 获取Flag成功!状态码: {flag_resp.status_code}") break
except requests.exceptions.Timeout: print(f"[-] {LOGIN_URL} -> 请求超时,密码: {pwd}") except requests.exceptions.ConnectionError: print(f"[-] {LOGIN_URL} -> 连接失败,密码: {pwd}") except Exception as e: print(f"[-] {LOGIN_URL} -> 请求失败,错误信息: {str(e)},密码: {pwd}") continue
print("\n[*] 爆破完成!")
|
四、常见错误 & 速查指南
1. 高频错误清单
| 错误 |
原因 |
解决方法 |
AttributeError: 'function' object has no attribute 'text' |
把 get 写成了会话对象,或未调用函数就访问响应 |
检查是否对响应对象 resp 操作,而不是对 s |
Expecting value JSON解析错误 |
对GET接口用POST,或响应不是JSON |
检查请求方法(登录用 POST),确认接口返回格式 |
| 登录后无法访问flag页面 |
未用Session,混用了全局 requests.post() |
改用 session.post(),全程复用同一个会话 |
| 字典传值失败(字符串格式) |
字典值未加引号,或变量名错误 |
检查引号,如 "username": USERNAME |
| 脚本一遇到错误就崩 |
未加异常处理 |
加全局 try...except 捕获所有异常 |
2. 实战速查
- 所有请求必须加
timeout 参数,避免脚本卡死
- 登录脚本要用
POST,不要误用 GET 请求
Session 循环外创建,避免每次新建会话
- 字典传值要加引号,字符串变量要加引号
- 生产脚本必须加异常处理,保证稳定性
五、学习总结 & 下一步计划
1. 今日收获总结
✅ requests 库基础语法:GET/POST、headers、timeout、响应处理
✅ Session 会话对象原理与用法
✅ for 循环、f-string、try...except 编写脚本核心
✅ 目录扫描、密码爆破实战脚本编写
✅ 常见脚本错误排查与速查
2. 下一步学习方向
- 多线程加速:给扫描/爆破脚本加多线程,速度提升 10 倍+
- 编写自动拿flag脚本:结合正则提取flag,自动解码 base64/hex
- Burp Suite 插件开发:用 Python 写 Burp 插件,定制化抓包分析
- 高级 requests 用法:文件上传、代理设置、SSL证书验证、会话持久化
写在最后
从零到一,系统梳理了 requests 库的核心语法与实战脚本。掌握了这些,你就能编写自己的渗透辅助脚本了!
本文为学习记录,仅供技术交流学习使用,请勿用于非法用途。网络安全法律法规红线不可逾越。