===
要求~
要清晰的理解HTTP基础理论
收发包原理
返回码特征
GET/POST优劣
编码问题
实践
网卡抓包、进程抓包
用Python写一个小型爆破。例如www.a.com跑根目录下文件,可简单加载外部字典。
===
理论基础:
http 超文本传输协议
客户端与服务器的交互:客户端发起请求,建立一个到服务器指定端口(80)的TCP连接,服务器收到请求,发回一个状态后,如”HTTP/1.1 200 OK”,和响应消息。
http 基本认证,客户端把用户名密码经过base64 加密后,放在Authorization header 中发送给服务器,而且http协议是无状态的,同一客户端对服务器的每个请求都要认证。但是缓存就不用了
收发包原理:
感觉就是客户端发送请求,服务端收到请求发送响应。
HTTP/1.1中定义了5类状态码, 状态码由三位数字组成,第一个数字定义了响应的类别
1XX 提示信息 - 表示请求已被成功接收,继续处理
2XX 成功 - 表示请求已被成功接收,理解,接受
3XX 重定向 - 要完成请求必须进行更进一步的处理
4XX 客户端错误 - 请求有语法错误或请求无法实现
5XX 服务器端错误 - 服务器未能实现合法的请求
常见的:
200 OK 服务器成功处理了请求 |
301/302 Moved Permanently(重定向)请求的URL已移走 |
304 Not Modified(未修改)客户的缓存资源是最新的, 要客户端使用缓存 |
404 Not Found 未找到资源 |
501 Internal Server Error服务器遇到一个错误,使其无法对请求提供服务 |
Get post
Get |
Post
|
从服务器上获取数据 |
向服务器传送数据 |
数据是在提交表单ACTION属性所指的URL中,在URL中可以看到 |
数据内容放在HTML header内一起传送到ACTION属性所指的URL地址 |
服务器端用Request.QueryString获取变量的值 |
服务器端用Request.Form获取提交的数据 |
传送的数据量小,不能大于2KB |
默认不受限制 |
安全性低,数据被放在请求的URL中 |
较高<数据并没有加密> |
|
URL的编码和解码
URL的格式为http://hostname:port/p1/p2/resource
其中://为固定编码, / 用来分隔路径, : 用来指定端口,p1,p2是路径名。
URL是采用ASCII字符集进行编码的,若含有非ASCII字符集中的字符,就要对其进行编码。
还有,URL中含有好多字符是保留字,它们在URL中具有特殊含义,若要在URL中使用保留字,就要进行编码。
浏览器请求服务器的时候会先将中文进行UTF-8编码,然后再发送到服务器端。
http协议报文分请求报文和响应报文,这两种报文的编码格式一样的,这里以请求报文为例:
请求报文分三个部分,分别是:
1) start line
2) headers
3) body
start line 和 headers 必须是ASCII编码,body中的内容可以是任何编码,这由headers中的Content-Type 来说明
对于start line ,这里要注意的是URL编码。
对于headers,
对于body,字符采用什么编码,图像采用什么格式,,都是headers 中的Content-Type 来说明。Content-Enconding 是记录文档压缩方法的:gzip,compress,deflate,indentity ; http压缩是http内容编码的一种
分块编码Chunked
不能预先确定报文的长度时,就需要用Transfer-Encoding 域来确定报文长度。
Transfer-Encoding 的值一般为chunked ,表明采用chunked编码来进行报文的传输。Chunked编码的基本方法是将大块数据分解成多块小数据,每块可自己指定长度
实践:
网卡抓包,如wireshark,
进程抓包,我用的是winsock,指定特定进程,
用wireshark的filter过滤也可以,但是winsock显示的内容更直白。
小型爆破:
import sys,httplib
import urllib
import re
urla="http://www.nynu.edu.cn/"
f = open("db.txt")
s = f.read()
dirs = re.split(' ',s)
urlb=".asp"
for line in dirs:
urlstr = urla + str(line) + urlb
#print urlstr
adr=urllib.urlopen(urlstr)
if adr.getcode()==200:
print " "+str(urlstr) + " 存在"
else:
print " "+str(urlstr) + " 不存在"
这个是加载简单字典, 我的就是db.txtx : admin login admin_index admin_login admin/admin admin/index admin/login 每一个中间是一个空格
urllib是HTTP客户端库,re模块提供正则表达式支持,我是看了这位大大的资料才了解的~ http://www.cnblogs.com/yuxc/archive/2011/08/01/2123995.html
恩恩 在网上还发现了一些大大的资料在默写方面更详细,贴出来大家一起学习吧
http://www.iwms.net/n2030c40.aspx
http://www.cnblogs.com/naledao/p/3669177.html
http://blog.youkuaiyun.com/lyq5655779/article/details/7515284