Web渗透测试攻略(1)
作者:网络转载 发布时间:[ 2015/9/25 14:19:25 ] 推荐标签:软件测试技术
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权限.
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11