我们将会从三个方面来讨论安全性测试,首先是安全性问题都包括哪些?其次是如何进行安全性测试?最后是安全性测试工具.
一、安全性问题都包括哪些?
1.DJANGO的一篇文档中介绍了关于安全性问题包括的内容:http://www.djangobook.com/en/1.0/chapter19
这篇文章的主题思想是:Never — under any circumstances — trust data from the browser.(从不要相信来自浏览器端的数据,因为你永远不可能知道在浏览器进行数据操作是你的用户还是正在寻找攻击漏洞的黑客)
2.安全性问题包括的内容:
SQL Injection:(SQL注入)
SQL injection is a common exploit in which an attacker alters Web page parameters (such as GET/POST data or URLs) to insert arbitrary SQL snippets that a naive Web application executes in its database directly.
SQL注入是最常见的攻击方式,它的主要原理是:攻击者通过改变WEB页的参数(如GET/POST数据或是URLS)直接将SQL片断提交到服务器,并在服务器端执行的过程.
Cross-Site scrīpting (XSS):(跨站点脚本攻击)
Cross-site scrīpting (XSS), is found in Web applications that fail to escape user-submitted content properly before rendering it into HTML. This allows an attacker to insert arbitrary HTML into your Web page, usually in the form of<scrīpt> tags.
Attackers often use XSS attacks to steal cookie and session information, or to trick users into giving private information to the wrong person (aka phishing).
XSS定义:是由于WEB程序没有对用户提交的HTML内容进行适当的转译,这样攻击者就可能在你的WEB页中插入一些HTML语句,这些语句通过以<SCRITP>TAG的形式出现.
攻击者通常使用XSS攻击来窃取COOKIES 和 SESSION信息,或是欺骗用户将隐私信息暴露给错误对象(又称为钓鱼)
Cross-Site Request Forgery:(指跨站点请求伪造)
Cross-site request forgery (CSRF) happens when a malicious Web site tricks users into unknowingly loading a URL from a site at which they’re already authenticated — hence taking advantage of their authenticated status.
CSRF:通过在WEB页或在给用户发邮件中插入恶意代码(通常是链接或是脚本),比如发送一个带有银行取款链接的图片或脚本(通常是HTML或JAVAscrīpt),当用户访问这个图片时,此时页面加载图片过程会隐密地链接到一个远程页面,这个页面会自动向目标站点发起请求,如果这个目标站点的仍保留这个用户的COOKIE信息,并且这个COOKIER未过期,那么攻击者就可以在用户不知情的情况以用户的身份登录银行或执行取款操作.
CSRF的特性就是利用网站对用户标识的信任,欺骗用户的浏览器发送HTTP请求给目标站点
Session Forging/Hijacking:(Session 篡改)
Email Header Injection:(邮件标题注入)
SQL injection’s less well-known sibling,email header injection, hijacks Web forms that send email. An attacker can use this technique to send spam via your mail server. Any form that constructs email headers from Web form data is vulnerable to this kind of attack.
email header injection 与 SQL注入的原理类似,它的原理是:通过在EMAIL的SUBJECT中输入一些特殊语句如"\n",攻者者可以利用这个缺陷通过你的邮件服务器发送垃圾邮件.
Directory Traversal:(目录遍历)
Directory traversal is another injection-style attack, wherein a malicious user tricks filesystem code into reading and/or writing files that the Web server shouldn’t have access to.
目录遍历是另一种注入类型的攻击,攻击者欺骗文件系统读或写服务器不允许操作的文件.
Exposed Error Messages:(曝露错误信息)
During development, being able to see tracebacks and errors live in your browser is extremely useful.However, if these errors get displayed once the site goes live, they can reveal aspects of your code or configuration that could aid an attacker.
开发过程中,如果可以看到错误或历史记录对FIX问题是非常有用的.但是如果这些错误信息被攻击者所获取,那么攻击者就可以通过错误信息而了解到应用程序代码或是数据库或是配置等方面的内容,并为期其行攻击提供有力的帮助.
二、如何对网站进行安全性测试?
DJANGO的那篇文档中只介绍了网络中常见的安全问题以及如何从程序的角度去防御它们,并未介绍如何针对安全问题进行测试.本章的主要内容是针对上章中提及的安全性问题介绍如何进行安全性测试.
1.SQL Injection(SQL 注入)
(1)如何进行SQL注入测试?
首先找到带有参数传递的URL页面,如搜索页面,登录页面,提交评论页面等等.
注1:对于未明显标识在URL中传递参数的,可以通过查看HTML源代码中的"FORM"标签来辨别是否还有参数传递.在<FORM>和</FORM>的标签中间的每一个参数传递都有可能被利用.
<form id="form_search" action="/search/" method="get"> <div> <input type="text" name="q" id="search_q" value="" /> <input name="search" type="image" src="/media/images/site/search_btn.gif" /> <a href="/search/" class="fl">Gamefinder</a> </div> </form> |
注2:当你找不到有输入行为的页面时,可以尝试找一些带有某些参数的特殊的URL,如HTTP://DOMAIN/INDEX.ASP?ID=10
其次,在URL参数或表单中加入某些特殊的SQL语句或SQL片断,如在登录页面的URL中输入HTTP://DOMAIN/INDEX.ASP?USERNAME=HI' OR 1=1--
注1:根据实际情况,SQL注入请求可以使用以下语句: ' or 1=1- - " or 1=1- - or 1=1- - ' or 'a'='a " or "a"="a ') or ('a'='a 例子:在登录时进行身份验证时,通常使用如下语句来进行验证:sql=select * from user where username='username' and pwd='password' 如 输入http://duck/index.asp?username=admin' or 1='1&pwd=11,SQL语句会变成以下:sql=select * from user where username='admin' or 1='1' and password='11' '与admin前面的'组成了一个查询条件,即username='admin',接下来的语句将按下一个查询条件来执行. 接下来是OR查询条件,OR是一个逻辑运算符,在判断多个条件的时候,只要一个成立,则等式就成立,后面的AND就不再时行判断了,也就是说我们绕过了密码验证,我们只用用户名就可以登录. 如 输入http://duck/index.asp?username=admin'--&pwd=11,SQL语句会变成以下sql=select * from user where name='admin' --' and pasword='11', '与admin前面的'组成了一个查询条件,即username='admin',接下来的语句将按下一个查询条件来执行 |
最后,验证是否能入侵成功或是出错的信息是否包含关于数据库服务器的相关信息;如果能说明存在SQL安全漏洞.
试想,如果网站存在SQL注入的危险,对于有经验的恶意用户还可能猜出数据库表和表结构,并对数据库表进行增\删\改的操作,这样造成的后果是非常严重的.
(2)如何预防SQL注入?
从应用程序的角度来讲,我们要做以下三项工作:
转义敏感字符及字符串(SQL的敏感字符包括“exec”,”xp_”,”sp_”,”declare”,”Union”,”cmd”,”+”,”//”,”..”,”;”,” ‘ ”,”--”,”%”,”0x”,” ><=!-*/()| ”,和”空格”).
屏蔽出错信息:阻止攻击者知道攻击的结果
在服务端正式处理之前提交数据的合法性(合法性检查主要包括三项:数据类型,数据长度,敏感字符的校验)进行检查等。最根本的解决手段,在确认客户端的输入合法之前,服务端拒绝进行关键性的处理操作.
从测试人员的角度来讲,在程序开发前(即需求阶段),我们就应该有意识的将安全性检查应用到需求测试中,例如对一个表单需求进行检查时,我们一般检验以下几项安全性问题:
需求中应说明表单中某一FIELD的类型,长度,以及取值范围(主要作用就是禁止输入敏感字符)
需求中应说明如果超出表单规定的类型,长度,以及取值范围的,应用程序应给出不包含任何代码或数据库信息的错误提示.
当然在执行测试的过程中,我们也需求对上述两项内容进行测试.
2.Cross-site scritping(XSS):(跨站点脚本攻击)
(1)如何进行XSS测试?
<!--[if !supportLists]-->首先,找到带有参数传递的URL,如登录页面,搜索页面,提交评论,发表留言页面等等。
<!--[if !supportLists]-->其次,在页面参数中输入如下语句(如:Javascrīpt,VB scrīpt, HTML,ActiveX, Flash)来进行测试:
<scrīpt>alert(document.cookie)</scrīpt> |
注:其它的XSS测试语句
><scrīpt>alert(document.cookie)</scrīpt> |
最后,当用户浏览时便会弹出一个警告框,内容显示的是浏览者当前的cookie串,这就说明该网站存在XSS漏洞。
试想如果我们注入的不是以上这个简单的测试代码,而是一段经常精心设计的恶意脚本,当用户浏览此帖时,cookie信息就可能成功的被攻击者获取。此时浏览者的帐号就很容易被攻击者掌控了。
(2)如何预防XSS漏洞?
从应用程序的角度来讲,要进行以下几项预防:
对Javascrīpt,VB scrīpt, HTML,ActiveX, Flash等语句或脚本进行转义.
在服务端正式处理之前提交数据的合法性(合法性检查主要包括三项:数据类型,数据长度,敏感字符的校验)进行检查等。最根本的解决手段,在确认客户端的输入合法之前,服务端拒绝进行关键性的处理操作.
从测试人员的角度来讲,要从需求检查和执行测试过程两个阶段来完成XSS检查:
在需求检查过程中对各输入项或输出项进行类型、长度以及取值范围进行验证,着重验证是否对HTML或脚本代码进行了转义。
执行测试过程中也应对上述项进行检查。
3.CSRF:(跨站点伪造请求)
CSRF尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。
XSS是利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。
XSS也好,CSRF也好,它的目的在于窃取用户的信息,如SESSION 和 COOKIES(关于SESSION 和COOKIES的介绍请参见我的另一篇BLOG:http://www.51testing.com/?49689/action_viewspace_itemid_74885.html),
(1)如何进行CSRF测试?
关于这个主题本人也正在研究,目前主要通过安全性测试工具来进行检查。
(2)如何预防CSRF漏洞?
请参见http://www.hanguofeng.cn/archives/security/preventing-csrf
4.Email Header Injection(邮件标头注入)
Email Header Injection:如果表单用于发送email,表单中可能包括“subject”输入项(邮件标题),我们要验证subject中应能escape掉“\n”标识。
<!--[if !supportLists]--> <!--[endif]-->因为“\n”是新行,如果在subject中输入“hello\ncc:spamvictim@example.com”,可能会形成以下
Subject: hello
cc: spamvictim@example.com
<!--[if !supportLists]--> <!--[endif]-->如果允许用户使用这样的subject,那他可能会给利用这个缺陷通过我们的平台给其它用户发送垃圾邮件。
5.Directory Traversal(目录遍历)
(1)如何进行目录遍历测试?
目录遍历产生的原因是:程序中没有过滤用户输入的“../”和“./”之类的目录跳转符,导致恶意用户可以通过提交目录跳转来遍历服务器上的任意文件。
测试方法:在URL中输入一定数量的“../”和“./”,验证系统是否ESCAPE掉了这些目录跳转符。
(2)如何预防目录遍历?
限制Web应用在服务器上的运行
进行严格的输入验证,控制用户输入非法路径
6.exposed error messages(错误信息)
(1)如何进行测试?
首先找到一些错误页面,比如404,或500页面。
验证在调试未开通过的情况下,是否给出了友好的错误提示信息比如“你访问的页面不存在”等,而并非曝露一些程序代码。
(2)如何预防?
测试人员在进行需求检查时,应该对出错信息进行详细查,比如是否给出了出错信息,是否给出了正确的出错信息。
三、安全测试工具(PAROS PROXY)
前两章分别介绍了安全性测试内容和如何进行安全性测试。
如果通过手工进行安全性测试效率是非常低的,首先你必须要找到安全性测试的切入点,然后逐一对这些切入点进行检查。但寻找切入点是非常耗时而且对测试人员的安全、编码的知识面要求也非常高,再者即使是找到了安全测试切入点,逐一对这些关键点进行测试也是需要大量的时间的。
为了提高安全测试的效率,我们需要借助一些安全性测试工具。
1.先介绍一个关于安全性测试工具的网站http://sectools.org/web-scanners.html 和http://networking.ctocio.com.cn/tips/463/7703463.shtml
2.各个安全测试工具的比较大家去看相关文章,在这我们采用的是开源的安全探测工具--Paros proxy
3.以下是关于paros proxy(v3.2.13)介绍
(1)安装
安装JRE
<!--[if !supportLists]--> <!--[endif]-->首先确保已安装JRE [Java Run Time Enviroment (JRE) 1.4 (or above) ]
注意:一定要先安装JRE,然后再安装paros proxy,如果先安装paros proxyr后安装JRE,paros proxy将无法启动。
<!--[if !supportLists]-->如果没有JRE,可以通过以下地址下载并安装:http://java.sun.com/j2se
注意:如果找不到JRE,也可以下载相同版本的JDK,JDK会带有JRE。
配置JRE环境变量:
<!--[if !supportLists]--> <!--[endif]-->首先,右击我的电脑-属性-高级-环境变量进入环境变量设置对话框。
<!--[if !supportLists]-->设置PATH环境变量,在PATH环境变量中输入JRE的安装路径。
如JRE的安装目录为:c:\JRE. 在PATH环境变量中加入c:\JRE
<!--[if !supportLists]--><!--[endif]-->新建CLASSPATH环境变量,在CLASSPATH环境变量中输入LIB路径。
安装和配置paros proxy应用程序
下载地址:http://sourceforge.net/projects/paros/
安装:
如果下载的是WINDOWS版本,安装比较简单。
如果下载的是UNIX或其它平台的版本,则需要手动将程序解压到一个新的目录,并单击.JAR文件运行程序。
配置:
paros需要两个端口:8080和8443,其中8080是代理连接端口,8443是SSL端口,所以必须保证这两个端口并未其它程序所占用。(查看端口命令:打开DOS命令窗口,输入 netstat查看目前使用的端口)
如果在安装完成,启动应用程序时,出现初始化错误,极大的可能就是因为这个端口被其它程序所占用。
配置浏览器属性:打开浏览器(如IE),打开工具-选项-连接-LAN设置-选中proxy server,proxyname为:localhost,port为:8080
如果你的计算机运行于防火墙之下,只能通过公司的代理服务器访问网络,你还需要修改PAROS的代理设置,具体的方法是:打开paros-工具-Options-connection,修改"ProxyName" and "ProxyPort"两项为代理服务器的名称和端口.
如果你希望其它的平台可以通过你本地机上的PAROS PROXY来访问WEB SERVER,你需要将本地机上的PAROS PROXY的IP设置为(比如:192.168.0.1)而不是127.0.0.1,因为127.0.0.1只允许本地机使用该应用程序.具体操作方法为:打开paros-工具-options-local proxy,将address
(2)操作步骤
第一步:打开paros proxy,然后在浏览器中打开被测试程序。
第二步--SPIDER:抓取URL。
执行第一步后,系统会自动抓取被测试站点位于URL层次树中第一层的URL(比如一个网站,其首页的URL一般为层次树第一层),并将这些URL显示在左侧的“site”栏中,然后在site栏中选中某一个URL,右击鼠标选取spider命令或单击analyse菜单-spider命令,系统将抓取该URL层次树中下一层次的URL。
注意:由于paros并不能一些特定的URL路径,比如一些URL链接需要在合法登录后才能被识别出来,因此在进行URL抓取时,一定先要登录网站。
抓取功能不能处理以下情况:
具有非法验证的SSL站点的URL是不能被抓取的。
不支持多线程(也就是说:)
在HTML页中的某些URLS也是不能被识别的。
由javascrīpt生成的URLS也是不能被识别的。
虽然上述这些urls不能被自动抓取,所以我们可以将其手动增加到左侧的“site”栏中,具体的操作方法是:
首先我们要对被测试站点URL的层次树有很好的了解,这样我们才能知道哪个URL抓取了,哪还没有被抓取。
对于未被抓取的URLS,通过打开paros-工具-manual request editor,输入未被抓取的URLS,然后单击SEND按钮,完成手动加入URLS动作,添加成功后的URLS将显示在左侧的“site”栏中。(注:此处存在一个问题,当我输入一个URL后单击发送按钮后,系统总是报错“IO erros is sending request”,查看了一下RESPONSE,结果是我发送的URLS WEB 服务器不能识别,不知道是否对输入的URLS有什么特殊的要求,待定。)
第三步--SCANNER:针对“site”栏中的URLS进行扫描,逐一检查对URLS分别进行安全性检查,验证是否存在安全漏洞。
如果想扫描"site"栏中所有的URLS,单击anaylse-scan all可以启动全部扫描。
如果只想扫描“site”栏中某一URL,选中该URL,右击鼠标,选取scan命令。
SCANNER可以对以下几种情况进行检查:
SQL注入
跨站点脚本攻击
目录遍历
CRLF -- Carriage-Return Line-Feed 回车换行等。
注:我们可以通过anylse-scan policy进行安全检查的设置。
第四步--查看和验证扫描结果:
扫描完成后,单击Report-Last Scan report,可查看当前的扫描报告。
根据扫描报告,对扫描结果进行验证,比如扫描结果中有一是URL传递的参数中存在SQL注入漏洞,我们将该URL及参数输入到地址栏中,验证结果。
第五步--保存抓取、扫描内容。
保存时应注意:保存的路径不支持特殊字符,比如汉字等,否则会打不开保存后的文件。