HTTP协议
  HTTP是整个web的基础,想要web测试,那对这个协议有一个深入的了解是很重要的.熟悉HTTP规范有助于挖掘漏洞.
  一次客户端和服务端的会话
  HTTP是一个客户端和一个服务端之间的会话.客户端,假设是浏览器,会发送请求给服务端,然后服务端对这个请求返回一个响应.HTTP是文本协议,所以对于我们人类来说很容易读懂.一般情况下,web服务监听的端口都是TCP/80.当你在浏览器地址栏上输入http://pentesterlab.com/并回车时,实际上是在连接到pentesterlab.com对应的ip的80端口.大多数的请求发生在浏览网页的时候.浏览器发送一个由下列元素组成的请求:
  ·                    HTTP方法
  这个让服务器理解浏览器进行的是什么操作
  ·                    资源
  说明客户端想访问服务器上的是什么
  ·                    版本信息
  说明服务器使用的是哪个版本的HTTP协议
  ·                    各种各样的头部信息
  这些信息告诉了服务器浏览器的名字和版本,用户偏爱的语言(如英语,德语,法语…)..
  ·                    请求主体
  根据HTTP方法不同而有不同的解释
  一个例子,打开http://vulnerable/index.php会产生下面的HTTP请求
  GET /index.php HTTP/1.1
  Host: vulnerable
  User-Agent: Mozilla Firefox
  请求
  方法
  有很多的HTTP方法:
  ·                    GET方法
  得到网页内容,浏览器常用的方法
  ·                    POST方法
  POST方法,被用来发送内容较多的数据,常被用在很多表单和文件上传中.
  ·                    HEAD方法
  HEAD方法和GET方法很类似,的区别是server返回的响应.HEAD方法得到的响应只包含头部,而没有实体.web蜘蛛检查一个页面有没有更改的时候常用到这个方法,这样蜘蛛不需要下载整个页面的内容了.
  还有许多其他的HTTP方法:PUT,DELETE,PATCH,TRACE,OPTIONS,CONNECT…
  参数
  请求还有一个很重要的部分是参数.当客户端访问下面的页面http://vulnerable/article.php?id=1&name=2
  时,下面的请求会被发送到web服务器:
  POST请求非常相似,但是实际的参数是包含在请求实体中的.如下面的表单:
  <html>
  [...]
  <body>
  <form action="/login.php" method="POST">
  Username: <input type="text" name="username"/> <br/>
  Password: <input type="password" name="password"/> <br/>
  <input type="submit" value="Submit">
  </form>
  </body>
  </html>
  这份HTML代码对应下面的登录表单:

  如果表单的值是下面这样的
  username是’admin’
  password是’Password123′.
  那表单提交后,下面的请求会被发送到服务器:
  POST /login.php HTTP/1.1
  Host: vulnerable
  User-Agent: Mozilla Firefox
  Content-Length: 35
  username=admin&password=Password123
  如果<form标签中用的是GET方法,那发送的请求是下面这样的:
  GET /login.php?username=admin&password=Password123 HTTP/1.1
  Host: vulnerable
  User-Agent: Mozilla Firefox
  如果form标签包含属性enctype=”multipart/form-data”,发送的请求是下面这样的.
  POST /upload/example1.php HTTP/1.1
  Host: vulnerable
  Content-Length: 305
  User-Agent: Mozilla/5.0 [...] AppleWebKit
  Content-Type: multipart/form-data; boundary=—-
  WebKitFormBoundaryfLW6oGspQZKVxZjA
  ——WebKitFormBoundaryfLW6oGspQZKVxZjA
  Content-Disposition: form-data; name=”image”; filename=”myfile.html”
  Content-Type: text/html
  My file
  ——WebKitFormBoundaryfLW6oGspQZKVxZjA
  Content-Disposition: form-data; name=”send”
  Send file
  ——WebKitFormBoundaryfLW6oGspQZKVxZjA–
  我们可以看出在请求头部中Content-type很特殊:Content-Type:
  multipart/form-data; boundary=—-WebKitFormBoundaryfLW6oGspQZKVxZjA.
  “WebKit”出现在基于webkit内核的浏览器中,其他内核的浏览器会用一个随机的字符串替代.这个字符串在好几个地方都出现了.后一行中那个字符串后面还跟了个–字符串.当你上传一个文件时,浏览器会发送下面的东西.
  文件名:myfile.html
  参数名:image
  文件类型:text/html
  文件内容:my file
  也可以把数组当作参数传送过去(或者hash加密参数,只要服务端能够解析出来).你也可以用/index.php?id[1]=0来编码包含值0的数组.
  这种编码经常被一些组建用来对对象映射的自动请求.比如说,下面的请求:user[name]=louis&user[group]=1会被映射到一个User对象,这个User对象有一个属性name值为louis,还有一个group属性值为1.自动映射有时候会被攻击.通过发送别的属性值,如果程序没有保护这个属性,也许你可以改变那个对象的属性.在我们先前的例子中,你可以增加一个user[admin]=1到请求中,看下你能否得到admin权限.