HTTP协议介绍
-
协议分类:
HTTP 1.0,使用的是80端口,一次一个连接。明文传输,不安全。
HTTP 1.1,使用的是80端口,可多次一个连接。明文传输,不安全。
HTTPS,使用的是443端口,可多次一个连接。加密传输。 -
请求方法:
HTTP1.0 | HTTP1.1 |
---|---|
GET | GET |
POST | POST |
HEAD | HEAD |
— | PUT |
— | DELETE |
— | TRACE |
— | CONNET |
— | PATCH |
-
URL格式:
协议://主机名.域名/文件夹/文件夹/文件?参数1=值1&参数2=值2 -
HTTP请求头
user-agent:浏览器的版本信息
Accept-encoding:浏览器接收的编码
Referer:当前页面是从哪里跳转过来的
Cookie:
Location:跳转到哪里
Set-Cookie:设置Cookie信息(在HTTP响应头)
WWW-Authenticate:用于身份验证信息HTTP、Basic等 -
HTTP响应状态码
1xx:信息提示
2xx:请求响应成功
3xx:重定向
4xx:客户端错误
5xx:服务端错误 -
HTTP 请求:
浏览器审查工具、BurpSuite等
Python-HTTP请求
- GET请求
1、不带参数:requests.get(url)
2、带参数:r.url获取请求URL
import requests
url="http://httpbin.org/get/ "
payload={'key1':'value1','key2':'value2',}
r=requests.get(url,params=payload)
print(r.status_code) #获取响应码
print(r.url) #获取请求的URL
- POST请求
1、不带参数:requests.post(url)
2、带参数:r.url获取请求URL
import requests
url="http://httpbin.org/get/ "
payload={'key1':'value1','key2':'value2',}
r=requests.post(url,data=payload)
print(r.status_code) #获取响应码
print(r.url) #获取请求的URL
- 自定义请求
import requests
url="http://127.0.0.1/brute/brute_get.php"
zdy={'User-agent':'hehe'} #导入请求头选项,并附上value
r=requests.get(url,header=zdy) #以GET形式请求,并传入自定义的header
print(r.requests.headers) #获取请求头
- 其他请求
方法 | 解释 |
---|---|
requests.request() | 构造一个请求,支持以下各种方法 |
requests.get() | 获取html的主要方法 |
requests.head() | 获取html头部信息的主要方法 |
requests.post() | 向html网页提交post请求的方法 |
requests.put() | 向html网页提交put请求的方法 |
requests.patch() | 向html提交局部修改的请求 |
requests.delete() | 向html提交删除请求 |
Python-HTTP响应
import requests
url="https://www.baidu.com/"
r=requests.get(url)
print(r.text) #获取响应包
print(r.content) #二进制的形式获取响应包
print(r.status_code) #获取响应码
print(r.url) #获取请求包的URL
print(r.request.headers) #获取请求头
print(r.headers) #获取响应头
print(r.cookies) #获取cookie
Python-HTTP代理
import requests
url='https://www.baidu.com'
proxise={'http':'http://192.168.83.138:8080','https':'https://192.168.83.138:8080'}
r=requests.get(url,proxies=proxise,verify=False)
print(r.status_code)
Python-HTTP会话编程
url='https://www.baidu.com'
s=requests.session() #初始化一个session对象
r=s.get(url) #首次请求,无cookie
print(r.cookies)
print(r.request.headers)
r2=s.get(url) #再次请求时,会带上首次响应返回的cookie值
print(r2.request.headers)
Python 目录扫描工具
-
目录扫描原理
1、读取字典文件,拼接URL。
2、HTTP GET请求URL。
3、判断状态码,输出存在目录。 -
字典文件读取
with open("filename.txt","r") as f #打开字典文件,with:读取完就关闭。
f.readline() #读取一行
f.readlines() #读取全部文件
f.read(x) #读取x个字节
- 工具编写
1、读取字典文件
2、HTTP GET请求
3、参数优化
import requests
url='https://github.com/'
with open('dir.txt','r') as f:
for line in f.readlines():
line = line.strip() #字典中换行会当成空行,所以strip()可以去除
print(line)
r=requests.get(url+line) #拼接url和line
if r.status_code==200: #判断响应码是否为200
print('ulr:'+r.url+'exist') #如果响应啊为200时,打印出请求的URL
- 设置User-Agent,在扫描时非通常的User-Agent可触发被扫描对象的发觉,所以可以“伪造”成通常的User-Agent。更逼真一些,也可以早扫描时导入一个User-Agent字典,让每一个请求包的User-Agent都不相同。
import requests
url='https://www.baidu.com'
s={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36'}
r=requests.get(url,headers=s)
print(r.request.headers)
Python - IIS PUT漏洞探测工具
import requests
url='http://192.168.83.141:8006/'
r=requests.options(url)
print(r.headers) #响应头以字典的形式获取到
result=r.headers['Public'] #获取Public
if result.find('PUT') and result.find('MOVE'): #查找响应头中的public中是否有‘PUT’,‘MOVE’
print('exist IIS put val')
else:
print('not exist')
Python 获取HTTP服务器信息
- 以Windows 2003为例
import requests
url='http://192.168.83.141:8006/'
r=requests.get(url)
print(r.headers)
print("服务器中间件为:"+r.headers['Server'])
print("服务器脚本语言:"+r.headers['X-Powered-By'])
Python 漏洞检测工具
- 漏洞原理:
漏洞被披露之后,根据漏洞原理写出对应的PoC代码,用来验证漏洞是否存在。
写PoC代码,首先要了解漏洞原理。 - 编写代码:
以ms15-034为例:
Payload:‘Host’: ‘stuff’,‘Range’: ‘bytes=0-18446744073709551615’
url='target_ip'
r=requests.get(url) #先发送一个请求,以便获取响应头
remote_server= r.headers['Server'] #获取响应头的Server
if remote_server.find('IIS/7.5') or remote_server.find('8.0'): #判断系统中间件是否为IIS/7.5或IIS/8.0
payload={'Host': 'stuff','Range': 'bytes=0-18446744073709551615'} #该漏洞的Payload
r1=requests.get(url,headers=payload) #加载上payload,发送请求。
if str(r1.content).find('Requested Range Not Satisfiable'): #判断响应包中是否有'Requested Range Not Satisfiable'字符串
print(url + 'exist vuln ms15-034') #如果有就说明存在漏洞
else:
print(url + 'not exist vuln ms15-034')
else:
print('Server not a iis 7.5 or iis 8.0')
- 验证检测代码检测效果:
搭建漏洞环境用于测试。
与其他工具进行效果对比。
站点地图构建(完整目录与文件)
- 测试Web APP首要任务,获取站点的完整目录与文件。
- 技术种类:
1、通过基于字典的目录文件扫描(爆破),再通过响应状态码确定是否存在,使用Python的requests模块即可完成。
2、通过基于网络爬虫,使用Python的Scrapy模块即可完成。 - BurpSuite构建站点地图,通过Spider模块(爬虫)、Intruder模块(爆破)即可完成。