本文从基础语法到实战脚本,带你掌握目录扫描、暴力破解、自动登录等渗透测试必备技能。适合入门者系统学习,也适合作为速查手册。


一、学习目标

掌握 requests 库语法,理解 HTTP 协议基础,能够编写目录扫描、暴力破解、自动登录等渗透/CTF 辅助脚本,为后续实战打基础。


二、核心知识速查

1. requests 基础:GET/POST 请求

基础语法

1
2
3
4
5
6
7
8
9
10
11
12
13
import requests

# 标准请求头(伪装Chrome浏览器,避免被反爬)
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"
}

# GET 请求(获取资源,参数拼接到URL末尾,用params传)
resp_get = requests.get("https://httpbin.org/get", headers=headers, timeout=3)

# POST 请求(提交数据,参数放在请求体里,用data传)
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  # HTTP 状态码(200成功/404不存在/403无权/302重定向)
resp.text # 响应数据(字符串),适合HTML/文本
resp.json() # 响应数据(JSON 转 Python 字典),适合接口/JSON返回
resp.encoding # 查看或设置编码:resp.encoding = "utf-8"

2. 请求头 headers:为什么要加?怎么写?

为什么重要

伪装成真实浏览器,避免被目标网站/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:浏览器标识字段,90%情况只需要这一个字段

  • 其他请求头可选:AcceptReferer 等,按需添加

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
# 1. 创建会话对象(循环外创建一次,全程复用)
s = requests.Session()

# 2. 用会话发请求(代替全局requests.post/get)
login_data = {"username": "admin", "password": "test123"}
s.post("https://httpbin.org/post", headers=headers, data=login_data)

# 3. 后续请求自动携带Cookie,保持登录状态
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}" # f-string 格式化字符串拼接URL
print(url)

f-string 格式化字符串

用途:在字符串中直接嵌入变量,避免繁琐拼接,清晰易读

1
2
3
4
TARGET = "https://httpbin.org"
path = "get"
url = f"{TARGET}/{path}" # 自动拼接为 "https://httpbin.org/get"
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"})
# JSON转字典
resp_json = resp.json()
# 取值两种方式
username = resp_json["form"]["username"] # 直接取值(键不存在会报错)
username = resp_json.get("form", {}).get("username") # 安全取值(键不存在返回None)

与 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)
# 过滤404,只输出有效路径
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页面
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-stringtry...except 编写脚本核心

✅ 目录扫描、密码爆破实战脚本编写

✅ 常见脚本错误排查与速查

2. 下一步学习方向

  1. 多线程加速:给扫描/爆破脚本加多线程,速度提升 10 倍+
  2. 编写自动拿flag脚本:结合正则提取flag,自动解码 base64/hex
  3. Burp Suite 插件开发:用 Python 写 Burp 插件,定制化抓包分析
  4. 高级 requests 用法:文件上传、代理设置、SSL证书验证、会话持久化

写在最后

从零到一,系统梳理了 requests 库的核心语法与实战脚本。掌握了这些,你就能编写自己的渗透辅助脚本了!

本文为学习记录,仅供技术交流学习使用,请勿用于非法用途。网络安全法律法规红线不可逾越。