1、漏洞描述
跨站脚本攻击(Cross-site scripting,通常简称为XSS)发生在客户端,可被用于进行窃取隐私、钓鱼欺骗、偷取密码、传播恶意代码等攻击行为。 恶意的攻击者将对客户端有危害的代码放到服务器上作为一个网页内容, 使得其他网站用户在观看此网页时,这些代码注入到了用户的浏览器中执行,使用户受到攻击。一般而言,利用跨站脚本攻击,攻击者可窃会话COOKIE从而窃取网站用户的隐私,包括密码。
XSS攻击使用到的技术主要为HTML和Javascript,也包括VBScript和ActionScript等。XSS攻击对WEB服务器虽无直接危害,但是它借助网站进行传播,使网站的使用用户受到攻击,导致网站用户帐号被窃取,从而对网站也产生了较严重的危害。
2、漏洞危害
1) 钓鱼欺骗:最典型的就是利用目标网站的反射型跨站脚本漏洞将目标网站重定向到钓鱼网站,或者注入钓鱼JavaScript以监控目标网站的表单输入,甚至发起基于DHTML更高级的钓鱼攻击方式。
2) 网站挂马:跨站时利用IFrame嵌入隐藏的恶意网站或者将被攻击者定向到恶意网站上,或者弹出恶意网站窗口等方式都可以进行挂马攻击。
3) 身份盗用:Cookie是用户对于特定网站的身份验证标志,XSS可以盗取到用户的Cookie,从而利用该Cookie盗取用户对该网站的操作权限。如果一个网站管理员用户Cookie被窃取,将会对网站引发巨大的危害。
4) 盗取网站用户信息:当能够窃取到用户Cookie从而获取到用户身份使,攻击者可以获取到用户对网站的操作权限,从而查看用户隐私信息。
5) 垃圾信息发送:比如在SNS社区中,利用XSS漏洞借用被攻击者的身份发送大量的垃圾信息给特定的目标群。
6) 劫持用户Web行为:一些高级的XSS攻击甚至可以劫持用户的Web行为,监视用户的浏览历史,发送与接收的数据等等。
7) XSS蠕虫:XSS 蠕虫可以用来打广告、刷流量、挂马、恶作剧、破坏网上数据、实施DDoS攻击等。
3、修复建议
1) 与SQL注入防护的建议一样,假定所有输入都是可疑的,必须对所有输入中的script、iframe等字样进行严格的检查。这里的输入不仅仅是用户可以直接交互的输入接口,也包括HTTP请求中的Cookie中的变量,HTTP请求头部中的变量等。
2) 不仅要验证数据的类型,还要验证其格式、长度、范围和内容。
3) 不要仅仅在客户端做数据的验证与过滤,关键的过滤步骤在服务端进行。
4) 对输出的数据也要检查,数据库里的值有可能会在一个大网站的多处都有输出,即使在输入做了编码等操作,在各处的输出点时也要进行安全检查。
5) 在发布应用程序之前测试所有已知的威胁。
4、修复实例参考
ASP问题示例代码:
<%Dim paramSet param=Request.QueryString("dd")response.write param%>
ASP修复范例:
<%Dim paramSet param=Request.QueryString("dd")response.write Server.HTMLEnCode(param)%>
PHP问题代码示例:
<?php$aa=$_GET['dd'];echo $aa."123";?>
PHP修复范例:
<?php$aa=$_GET['dd'];echo htmlspecialchars($aa)."123";?>
SQL Inject
1、漏洞描述
SQL注入攻击(SQL Injection),简称注入攻击、SQL注入,被广泛用于非法获取网站控制权,是发生在应用程序的数据库层上的安全漏洞。 在设计不良的程序当中,忽略了对输入字符串中夹带的SQL指令的检查,那么这些夹带进去的指令就会被数据库误认为是正常的SQL指令而运行, 从而使数据库受到攻击,可能导致数据被窃取、更改、删除,以及进一步导致网站被嵌入恶意代码、被植入后门程序等危害。
2、漏洞危害
1) 机密数据被窃取
2) 核心业务数据被篡改
3) 网页被篡改
4) 数据库所在服务器被攻击变为傀儡主机,甚至企业网被入侵。
3、修复建议
1) 所有的查询语句都使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中。当前几乎所有的数据库系统都提供了参数化SQL语句执行接口,使用此接口可以非常有效的防止SQL注入攻击。
2) 对进入数据库的特殊字符('"\<>&*;等)进行转义处理,或编码转换。
3) 确认每种数据的类型,比如数字型的数据就必须是数字,数据库中的存储字段必须对应为int型。
4) 数据长度应该严格规定,能在一定程度上防止比较长的SQL注入语句无法正确执行。
5) 网站每个数据层的编码统一,建议全部使用UTF-8编码,上下层编码不一致有可能导致一些过滤模型被绕过。
6) 严格限制网站用户的数据库的操作权限,给此用户提供仅仅能够满足其工作的权限,从而最大限度的减少注入攻击对数据库的危害。
7) 避免网站显示SQL错误信息,比如类型错误、字段不匹配等,防止攻击者利用这些错误信息进行一些判断。
8) 在网站发布之前建议使用一些专业的SQL注入检测工具进行检测,及时修补这些SQL注入漏洞。
4、修复实例参考
ASP漏洞代码示例
<%Dim oComm, oRsSet id=Request.QueryString("d")Set oConn = Server.CreateObject("ADODB.Connection")oConn.Open "Provider=MSDAORA;Password=sth;Persist Security Info=True;User ID=whats;Data Source=mescp"Set oComm = CreateObject("ADODB.Command")oComm.ActiveConnection = oConnComm.CommandType = 1oComm.CommandText = "select * from all_objects where rownum ="& idSet oRs = oComm.Execute%>
ASP修复范例
<%Dim oComm, oRsSet oConn = Server.CreateObject("ADODB.Connection")oConn.Open "Provider=MSDAORA;Password=sth;Persist Security Info=True;User ID=whats;Data Source=mescp"Set oComm = CreateObject("ADODB.Command")oComm.ActiveConnection = oConnComm.CommandType = 1oComm.CommandText = "select * from all_objects where rownum = ? "oComm.Parameters.Append oComm.CreateParameter("v1",3,1,4,100)Set oRs = oComm.Execute%>
PHP漏洞代码示例
<?php$id=$_GET['id'];$conn = mysql_connect("localhost","root","") or die ("wrong!");$sel=mysql_select_db("mydb",$conn); $sql="select * from user where id = ".id$que=mysql_query($sql,$conn);?>
PHP修复范例
<?php$id=$_GET['id'];$conn = mysql_connect("localhost","root","") or die ("wrong!");$sel=mysql_select_db("mydb",$conn);$sql="select * from user where id = :id"$stmt = $conn->prepare($sql);$stmt->execute(array(':id'=>$id));?>
Code Injection
1、漏洞描述
代码注入是指由于服务端代码漏洞导致恶意用户输入在服务端被执行的一种高危安全漏洞。
2、漏洞危害
利用该漏洞,可以在服务器上执行攻击者拼装的代码。
3、修复建议
严格检查控制程序的参数。
4、修复实例参考
ASP漏洞示例:
<%' 期待输入sub.aspexecute request("include")%>
ASP修复范例
<%<!--#include file="sub.asp"-->%>
PHP漏洞示例
<%php$myvar = "varname";$x = $_GET['arg'];eval_r("\$myvar = \$x;");%>
PHP修复范例
<%php$myvar = "varname";$x = $_GET['arg'];$myvar = $x;%>
OS Commanding Injection
1、漏洞描述
系统命令执行是指应用程序对传入命令行的参数过滤不严导致恶意用户能控制最终执行的命令,进而入侵系统,导致严重破坏的高危漏洞。
2、漏洞危害
利用这个漏洞攻击者可以执行服务器上的命令。
3、修复建议
1) 严格检查程序参数,特别是 "&", "&&", "|", "||"。
2) 在代码中去除system等直接命令行执行函数或者禁止把外部传入参数传入到该类可执行函数的参数中。
4、修复实例参考
ASP漏洞代码示例
<%Dim cmdSet cmd=Request.QueryString("cmd")response.write server.createobject("wscript.shell").exec("cmd.exe /c "&cmd).stdout.readall%>
ASP修复范例
<%Dim cmdSet cmd=Request.QueryString("cmd")if cmd == "dir" thenresponse.write server.createobject("wscript.shell").exec("cmd.exe /c "& "dir").stdout.readallend if%>
PHP漏洞代码示例
<%php$myvar = "varname";$x = $_GET['arg'];// 默认通过url传入ls -al 进行执行system($x);%>
PHP修复范例
<%php$myvar = "varname";$x = $_GET['arg'];// 默认通过url传入ls -al 进行执行if($x=='/bin/ls -al'){system('/bin/ls -al');}else{return;}%>
Remote File Inclusion
1、漏洞描述
远程文件包含是指程序代码在处理包含文件的时候没有严格控制。导致用户可以构造参数包含远程代码在服务器上执行,进而获取到服务器权限,造成网站被恶意删除,用户和交易数据被篡改等一系列恶性后果。
2、漏洞危害
攻击着可以利用该漏洞,在服务器上执行命令。
3、修复建议
对于PHP,建议配置php.ini关闭远程文件包含功能。E.g. allow_url_include = Off
4、修复实例参考
PHP漏洞代码示例:
<?php$path=$_GET['arg'];include $path.'/filename.php';?>
修复范例:
<?php$path='/var/www/html/common.inc';include $path.'/filename.php';?>
或者:在php.ini中进行如下配置:
allow_url_fopen=offallow_url_include=off
Path Traversal
1、漏洞描述
目录遍历指的是应用程序对文件路径没有检查导致服务器上的敏感文件/代码泄漏。
2、漏洞危害
可能会导致源代码等敏感信息泄露。
3、修复建议
严格检查文件路径参数,限制在指定的范围。严格限制文件路径参数,不允许用户控制文件路径相关的参数,限定文件路径范围。
4、修复实例参考
ASP漏洞代码示例:
<%Dim FileNameFileName = Request.QueryString("FileName")Response.ClearResponse.ContentType = "application/octet-stream"Response.AddHeader "content-disposition", "attachment; filename=" & FileNameSet Stream = server.CreateObject("ADODB.Stream")Stream.Type = 1Stream.OpenStream.LoadFromFile Server.MapPath(FileName)While Not Stream.EOSResponse.BinaryWrite Stream.Read(1024 * 64)WendStream.CloseSet Stream = NothingResponse.FlushResponse.End%>
ASP修复范例:
<%Dim FileNameFileId = Request.QueryString("FileId")FileName = GetFileNameByID(FileId)Response.ClearResponse.ContentType = "application/octet-stream"Response.AddHeader "content-disposition", "attachment; filename=" & FileNameSet Stream = server.CreateObject("ADODB.Stream")Stream.Type = 1Stream.OpenStream.LoadFromFile Server.MapPath(FileName)While Not Stream.EOSResponse.BinaryWrite Stream.Read(1024 * 64)WendStream.CloseSet Stream = NothingResponse.FlushResponse.End%>
PHP修复规范:
在php.ini中进行如下配置:
open_basedir = 服务器上WEB目录的路径(注,路径最后需要加上斜杠作为结束),如:open_basedir = /var/www/html/