web漏洞详解及修复建议

一、漏洞描述
跨站脚本攻击(Cross-site scripting,一般简称为XSS)发生在客户端,可被用于进行窃取隐私、钓鱼欺骗、偷取密码、传播恶意代码等攻击行为。 恶意的攻击者将对客户端有危害的代码放到服务器上做为一个网页内容, 使得其余网站用户在观看此网页时,这些代码注入到了用户的浏览器中执行,使用户受到攻击。通常而言,利用跨站脚本攻击,攻击者可窃会话COOKIE从而窃取网站用户的隐私,包括密码。
XSS攻击使用到的技术主要为HTML和Javascript,也包括VBScript和ActionScript等。XSS攻击对WEB服务器虽无直接危害,可是它借助网站进行传播,使网站的使用用户受到攻击,致使网站用户账号被窃取,从而对网站也产生了较严重的危害。
 
二、漏洞危害
1) 钓鱼欺骗:最典型的就是利用目标网站的反射型跨站脚本漏洞将目标网站重定向到钓鱼网站,或者注入钓鱼JavaScript以监控目标网站的表单输入,甚至发起基于DHTML更高级的钓鱼攻击方式。
2) 网站挂马:跨站时利用IFrame嵌入隐藏的恶意网站或者将被攻击者定向到恶意网站上,或者弹出恶意网站窗口等方式均可以进行挂马攻击。
3) 身份盗用:Cookie是用户对于特定网站的身份验证标志,XSS能够盗取到用户的Cookie,从而利用该Cookie盗取用户对该网站的操做权限。若是一个网站管理员用户Cookie被窃取,将会对网站引起巨大的危害。
4) 盗取网站用户信息:当可以窃取到用户Cookie从而获取到用户身份使,攻击者能够获取到用户对网站的操做权限,从而查看用户隐私信息。
5) 垃圾信息发送:好比在SNS社区中,利用XSS漏洞借用被攻击者的身份发送大量的垃圾信息给特定的目标群。
6) 劫持用户Web行为:一些高级的XSS攻击甚至能够劫持用户的Web行为,监视用户的浏览历史,发送与接收的数据等等。
7) XSS蠕虫:XSS 蠕虫能够用来打广告、刷流量、挂马、恶做剧、破坏网上数据、实施DDoS攻击等。
 
三、修复建议
1) 与SQL注入防御的建议同样,假定全部输入都是可疑的,必须对全部输入中的script、iframe等字样进行严格的检查。这里的输入不只仅是用户能够直接交互的输入接口,也包括HTTP请求中的Cookie中的变量,HTTP请求头部中的变量等。
2) 不只要验证数据的类型,还要验证其格式、长度、范围和内容。
3) 不要仅仅在客户端作数据的验证与过滤,关键的过滤步骤在服务端进行。
4) 对输出的数据也要检查,数据库里的值有可能会在一个大网站的多处都有输出,即便在输入作了编码等操做,在各处的输出点时也要进行安全检查。
5) 在发布应用程序以前测试全部已知的威胁。
 
四、修复实例参考
 
ASP问题示例代码:
<%
Dim param
Set param=Request.QueryString("dd")
response.write param
%>
 
 
 
ASP修复范例:
<%
Dim param
Set 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
一、漏洞描述
SQL注入攻击(SQL Injection),简称注入攻击、SQL注入,被普遍用于非法获取网站控制权,是发生在应用程序的数据库层上的安全漏洞。 在设计不良的程序当中,忽略了对输入字符串中夹带的SQL指令的检查,那么这些夹带进去的指令就会被数据库误认为是正常的SQL指令而运行, 从而使数据库受到攻击,可能致使数据被窃取、更改、删除,以及进一步致使网站被嵌入恶意代码、被植入后门程序等危害。
 
二、漏洞危害
1) 机密数据被窃取
2) 核心业务数据被篡改
3) 网页被篡改
4) 数据库所在服务器被攻击变为傀儡主机,甚至企业网被入侵。
 
三、修复建议
1) 全部的查询语句都使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中。当前几乎全部的数据库系统都提供了参数化SQL语句执行接口,使用此接口能够很是有效的防止SQL注入攻击。
2) 对进入数据库的特殊字符('"\<>&*;等)进行转义处理,或编码转换。
3) 确认每种数据的类型,好比数字型的数据就必须是数字,数据库中的存储字段必须对应为int型。
4) 数据长度应该严格规定,能在必定程度上防止比较长的SQL注入语句没法正确执行。
5) 网站每一个数据层的编码统一,建议所有使用UTF-8编码,上下层编码不一致有可能致使一些过滤模型被绕过。
6) 严格限制网站用户的数据库的操做权限,给此用户提供仅仅可以知足其工做的权限,从而最大限度的减小注入攻击对数据库的危害。
7) 避免网站显示SQL错误信息,好比类型错误、字段不匹配等,防止攻击者利用这些错误信息进行一些判断。
8) 在网站发布以前建议使用一些专业的SQL注入检测工具进行检测,及时修补这些SQL注入漏洞。
 
四、修复实例参考
ASP漏洞代码示例
<%
Dim oComm, oRs
Set 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 = oConn
Comm.CommandType = 1   
oComm.CommandText = "select * from all_objects where rownum ="& id
Set oRs = oComm.Execute
%>
 
 
ASP修复范例
<%
Dim oComm, oRs
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 = oConn
Comm.CommandType = 1   
oComm.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
一、漏洞描述
代码注入是指因为服务端代码漏洞致使恶意用户输入在服务端被执行的一种高危安全漏洞。
 
二、漏洞危害
利用该漏洞,能够在服务器上执行攻击者拼装的代码。
 
三、修复建议
严格检查控制程序的参数。
 
四、修复实例参考
ASP漏洞示例:
<%
' 期待输入sub.asp
execute 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)  在代码中去除system等直接命令行执行函数或者禁止把外部传入参数传入到该类可执行函数的参数中。
 
四、修复实例参考
ASP漏洞代码示例
<%
Dim cmd
Set cmd=Request.QueryString("cmd")
response.write server.createobject("wscript.shell").exec("cmd.exe /c "&cmd).stdout.readall
%>
 
 
ASP修复范例
<%
Dim cmd
Set cmd=Request.QueryString("cmd")
if cmd == "dir" then
         response.write server.createobject("wscript.shell").exec("cmd.exe /c "&  "dir").stdout.readall
end 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
一、漏洞描述
远程文件包含是指程序代码在处理包含文件的时候没有严格控制。致使用户能够构造参数包含远程代码在服务器上执行,进而获取到服务器权限,形成网站被恶意删除,用户和交易数据被篡改等一系列恶性后果。
 
二、漏洞危害
攻击着能够利用该漏洞,在服务器上执行命令。
 
三、修复建议
对于PHP,建议配置php.ini关闭远程文件包含功能。E.g. allow_url_include = Off
 
四、修复实例参考
 
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=off
allow_url_include=off
 
 
 
Path Traversal
一、漏洞描述
目录遍历指的是应用程序对文件路径没有检查致使服务器上的敏感文件/代码泄漏。
 
二、漏洞危害
可能会致使源代码等敏感信息泄露。
 
三、修复建议
严格检查文件路径参数,限制在指定的范围。严格限制文件路径参数,不容许用户控制文件路径相关的参数,限定文件路径范围。
 
四、修复实例参考
 
ASP漏洞代码示例:
<%
Dim FileName
FileName = Request.QueryString("FileName")
Response.Clear
Response.ContentType = "application/octet-stream"
Response.AddHeader "content-disposition", "attachment; filename=" & FileName
Set Stream = server.CreateObject("ADODB.Stream")
Stream.Type = 1
Stream.Open
Stream.LoadFromFile Server.MapPath(FileName)
While Not Stream.EOS
Response.BinaryWrite Stream.Read(1024 * 64)
Wend
Stream.Close
Set Stream = Nothing
Response.Flush
Response.End
%>
 
 
ASP修复范例:
<%
Dim FileName
FileId = Request.QueryString("FileId")
FileName = GetFileNameByID(FileId)
Response.Clear
Response.ContentType = "application/octet-stream"
Response.AddHeader "content-disposition", "attachment; filename=" & FileName
Set Stream = server.CreateObject("ADODB.Stream")
Stream.Type = 1
Stream.Open
Stream.LoadFromFile Server.MapPath(FileName)
While Not Stream.EOS
Response.BinaryWrite Stream.Read(1024 * 64)
Wend
Stream.Close
Set Stream = Nothing
Response.Flush
Response.End
%>
 
 
PHP修复规范:
在php.ini中进行以下配置:
open_basedir = 服务器上WEB目录的路径(注,路径最后须要加上斜杠做为结束),如:open_basedir = /var/www/html/
相关文章
相关标签/搜索