技术开发 频道

如何进行验证测试

  【IT168 评论】所谓认证,就是建立确信某物或某人是真实的这么一个过程,authentication来自于希腊语,即真实的,可信的。认证本身依赖于多个认证因子,在计算机安全领域,认证意味着验证通讯发起者的数字身份,常见的认证过程就是用户登录认证,所谓认证测试就是理解系统中的认证机制并找到方法绕过该认证机制。

  认证测试需要考虑的点有很多,下面我们逐一来进行解释说明:

   在加密通道上传递密码

  原则上,用户的认证必须通过加密信道进行传输,我们在这里的目的不是要验证诸如HTTPS是否安全,我们要验证的仅仅是用户的认证信息是否已经被加密了。

  在用户登录时,最常见的方式是用户输入用户名和密码后,通过POST方法传输,一般来说,认证信息或者是通过不安全的HTTP传递,或者是通过加密的HTTPS传递。我们注意到,甚至有些网站在登录页面显示给我们的是HTTPS,但事实上却仍然是用HTTP的,最简单的方法就是用网络监听工具,如SnifferPro或Ethereal来判断是否是真实加密了。

  下面,我们用OWASP的WebScrab截取一些信息来做个例子

  假设,登录页面要求用户输入用户名和密码,然后有一个“提交”按钮,那么在WebScrab中我们得到如下的请求数据:

  POSThttp://www.example.com/AuthenticationServletHTTP/1.1

  Host:www.example.com

  User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.14) Gecko/20080404

  Accept: text/xml,application/xml,application/xhtml+xml

  Accept-Language: it-it,it;q=0.8,en-us;q=0.5,en;q=0.3

  Accept-Encoding: gzip,deflate

  Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7

  Keep-Alive: 300

  Connection: keep-alive

  Referer:http://www.example.com/index.jsp

  Cookie: JSESSIONID=LVrRRQQXgwyWpW7QMnS49vtW1yBdqn98CGlkP4jTvVCGdyPkmn3S!

  Content-Type: application/x-www-form-urlencoded

  Content-length: 64

  delegated_service=218&User=test&Pass=test&Submit=SUBMIT

  在上面的数据中,我们可以看到,POST方法通过HTTP协议把数据发送到http://www.example.com/AuthenticationServlet,那么显然在这时,传送的数据没有进行加密,恶意用户通过监听网络就很容易得到用户名和密码。

  再看下一个例子,假设是用HTTPS协议,那么请求的头数据如下:

  POST https://www.example.com:443/cgi-bin/login.cgi HTTP/1.1

  Host: www.example.com

  User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.14) Gecko/20080404

  Accept: text/xml,application/xml,application/xhtml+xml,text/html

  Accept-Language: it-it,it;q=0.8,en-us;q=0.5,en;q=0.3

  Accept-Encoding: gzip,deflate

  Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7

  Keep-Alive: 300

  Connection: keep-alive

  Referer: https://www.example.com/cgi-bin/login.cgi

  Cookie: language=English;

  Content-Type: application/x-www-form-urlencoded

  Content-length: 50

  Command=Login&User=test&Pass=test

  可见,上述例子中的数据经加密后被传送到https://www.example.com:443/cgi-bin/login.cgi,这就确保了数据是加密的而不被其他人所窃取。

  再看下面的一个例子,我们在一个可以通过HTTP协议访问到的页面上通过HTTPS协议来发送数据:

  POST https://www.example.com:443/login.do HTTP/1.1

  Host: www.example.com

  User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.14) Gecko/20080404

  Accept: text/xml,application/xml,application/xhtml+xml,text/html

  Accept-Language: it-it,it;q=0.8,en-us;q=0.5,en;q=0.3

  Accept-Encoding: gzip,deflate

  Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7

  Keep-Alive: 300

  Connection: keep-alive

  Referer: http://www.example.com/homepage.do

  Cookie: SERVTIMSESSIONID=s2JyLkvDJ9ZhX3yr5BJ3DFLkdphH0QNSJ3VQB6pLhjkW6F

  Content-Type: application/x-www-form-urlencoded

  Content-length: 45

  User=test&Pass=test&portal=ExamplePortal

  如上,我们看到,我们的请求通过HTTPS引向了https://www.example.com:443/login.do,但如果我们再看Referer的值,就发现我们是从HTTP页http://www.example.com/homepage.do过来的。在这种情况下,我们的浏览器窗口中并不会告诉我们现在使用的安全连接,而事实上我们却正在使用安全连接。

  在上面的例子中,如果我们用Get方法,那么所输入的用户名和密码将会以明文的方式显示在URL中,这显然是不可取的。那么,如果我们经由Get方法通过HTTPS来传递数据是否可行呢,看下面的数据:

  GET https://www.example.com/success.html?user=test&pass=test HTTP/1.1

  Host: www.example.com

  User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.14) Gecko/20080404

  Accept: text/xml,application/xml,application/xhtml+xml,text/html

  Accept-Language: it-it,it;q=0.8,en-us;q=0.5,en;q=0.3

  Accept-Encoding: gzip,deflate

  Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7

  Keep-Alive: 300

  Connection: keep-alive

  Referer: https://www.example.com/form.html

  If-Modified-Since: Mon, 30 Jun 2008 07:55:11 GMT

  If-None-Match: "43a01-5b-4868915f"

  从上面的例子可以看到,用户名和密码都以明文的方式在URL里存在,而不像上面的几个例子中都在消息体中,但并不是说攻击者就可以很容易看到这些信息,TLS/SSL毕竟是安全性很高的协议,整个HTTP数据包是加密的,但仍然要注意的是这些用户名和密码在传输过程中会被存储在代理和服务器上,这也就有可能会泄露用户信息。

0
相关文章