WEB安全漏洞(1)

来源:互联网 发布:ipad淘宝卖家版 编辑:程序博客网 时间:2024/06/06 00:47
本文档主要介绍WEB安全漏洞和解决方法。

1. SQL注入漏洞

漏洞描述

SQL注入攻击(SQL Injection),简称注入攻击、SQL注入,被广泛用于非法获取网站控制权,是发生在应用程序的数据库层上的安全漏洞。 在设计不良的程序当中,忽略了对输入字符串中夹带的SQL指令的检查,那么这些夹带进去的指令就会被数据库误认为是正常的SQL指令而运行,从而使数据库受到攻击,可能导致数据被窃取、更改、删除,以及进一步导致网站被嵌入恶意代码、被植入后门程序等危害。

漏洞危害

使 1) 机密数据被窃取;2) 核心业务数据被篡改;3) 网页被篡改;4) 数据库所在服务器被攻击变为傀儡主机,甚至企业网被入侵。

潜在危险等级:

解决方案

1) 所有的查询语句都使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中。
2) 对进入数据库的特殊字符('"\<>&*;等)进行转义处理,或编码转换。
3) 确认每种数据的类型,比如数字型的数据就必须是数字,数据库中的存储字段必须对应为int型。
4) 数据长度应该严格规定,能在一定程度上防止比较长的SQL注入语句无法正确执行。
5) 网站每个数据层的编码统一,建议全部使用UTF-8编码,上下层编码不一致有可能导致一些过滤模型被绕过。
6) 严格限制网站所用数据库账号的权限,给此用户仅提供能够满足其工作的权限,从而最大限度的减少注入攻击对数据库的危害。
7) 避免网站显示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漏洞代码示例】

$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修复示例】

$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));  
?>

【JAVA漏洞代码示例】

JdbcConnection conn = new JdbcConnection();

final String sql = "select * from product where pname like '%"

        + request.getParameter("pname") + "%'";

conn.execqueryResultSet(sql);

【JAVA修复示例】

JdbcConnection conn = new JdbcConnection();

PreparedStatement pstmt = conn.prepareStatement("select * from product where pname like ?";

pstmt.setString(1, “%”+ request.getParameter("pname")+”%”);

pstmt.execute();

2. 跨站脚本(XSS)漏洞

漏洞描述

跨站脚本攻击(Cross-site scripting,通常简称为XSS)发生在客户端,可被用于进行窃取隐私、钓鱼欺骗、偷取密码、传播恶意代码等攻击行为。 恶意的攻击者将对客户端有危害的代码放到服务器上作为一个网页内容, 使得其他网站用户在观看此网页时,这些代码注入到了用户的浏览器中执行,使用户受到攻击。一般而言,利用跨站脚本攻击,攻击者可窃会话COOKIE从而窃取网站用户的隐私。

漏洞危害

1) 钓鱼欺骗:最典型的就是利用目标网站的反射型跨站脚本漏洞将目标网站重定向到钓鱼网站,或者注入钓鱼JavaScript以监控目标网站的表单输入,甚至发起基于DHTML更高级的钓鱼攻击方式。
2) 网站挂马:跨站时利用IFrame嵌入隐藏的恶意网站或者将被攻击者定向到恶意网站上,或者弹出恶意网站窗口等方式都可以进行挂马攻击。
3) 身份盗用:Cookie是用户对于特定网站的身份验证标志,XSS可以盗取到用户的Cookie,从而利用该Cookie盗取用户对该网站的操作权限。如果一个网站管理员用户Cookie被窃取,将会对网站引发巨大的危害。
4) 盗取网站用户信息:当能够窃取到用户Cookie从而获取到用户身份使,攻击者可以获取到用户对网站的操作权限,从而查看用户隐私信息。
5) 垃圾信息发送:比如在SNS社区中,利用XSS漏洞借用被攻击者的身份发送大量的垃圾信息给特定的目标群。
6) 劫持用户Web行为:一些高级的XSS攻击甚至可以劫持用户的Web行为,监视用户的浏览历史,发送与接收的数据等等。
7) XSS蠕虫:XSS 蠕虫可以用来打广告、刷流量、挂马、恶作剧、破坏网上数据、实施DDoS攻击等。

潜在危险等级:

解决方案

对参数做html转义过滤(要过滤的字符包括:单引号、双引号、大于号、小于号,&符号),防止脚本执行。在变量输出时进行HTML ENCODE 处理。

PHP应用,可以使用htmlspecialchars对用户参数进行编码

ASP.net应用,可以使用HTMLEnCode 或AntiXSS

JAVA应用,可以使用org.apache.commons.lang.StringEscapeUtils提供的Escape函数

代码示例

【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问题代码示例】

$aa=$_GET['dd'];
echo $aa."123";
?>

【PHP修复示例】

$aa=$_GET['dd'];
echo htmlspecialchars($aa)."123";
?>

3. HTTP header注入漏洞

漏洞描述

Web程序代码中把用户提交的参数未做过滤就直接输出到HTTP响应头中,导致攻击者可以利用该漏洞来注入到HTTP响应头中,造成xss攻击、欺骗用户下载恶意可执行文件等攻击。

潜在危险等级:

修复建议

1)对参数做合法性校验以及长度限制,谨慎的根据用户所传入参数做http响应的header设置;

2) 在设置HTTP响应头时,过滤回车换行(%0d%0a、%0D%0A)字符;

4. 目录遍历漏洞

漏洞描述

目录遍历(或路径遍历)(directory traversal/path traversal)是由于Web服务器或Web应用程序对用户输入文件名称的安全性验证不足而导致的一种安全漏洞,使得攻击者通过HTTP请求和利用一些特殊字符就可以绕过服务器的安全限制,访问任意受限的文件(可以是Web根目录以外的文件),甚至执行系统命令。

潜在危险等级:

解决方案

严格检查文件路径参数,限制在指定的范围。严格限制文件路径参数,不允许用户控制文件路径相关的参数,限定文件路径范围。

5. 文件包含漏洞

漏洞描述

文件包含是指程序代码在处理包含文件的时候没有严格控制。导致用户可以构造参数包含远程代码在服务器上执行,进而获取到服务器权限,造成网站被恶意删除,用户和交易数据被篡改等一系列恶性后果。

漏洞危害

攻击者可以利用该漏洞,在服务器上执行任意命令。

潜在危险等级:高

解决方案:

PHP:配置php.ini关闭远程文件包含功能(allow_url_include = Off)

代码示例

【PHP问题代码示例】

$path=$_GET['arg'];

include $path.'/filename.php';

?>

【PHP修复示例】

$path='/var/www/html/common.inc';

include $path.'/filename.php';

?>

6.任意文件下载漏洞

漏洞描述

Web应用程序在处理文件下载时,接受用户指定的路径和文件名进行下载,攻击者利用此漏洞来下载服务器的其它文件甚至任意文件(源代码、数据库甚至passwd等)。

潜在危险等级:高

修复建议

1. 限制可下载文件所在的目录为预期范围;

2. 通过指定文件编号的方式来定位待下载文件。

7.文件上传漏洞

漏洞描述

文件上传的Web程序未对文件类型和格式做合法性校验,导致攻击者可以上传Webshell或者非期望格式的文件

潜在危险等级:高

修复建议

1)对上传文件的大小和类型进行校验,定义上传文件类型白名单;

2)保存上传文件的目录不提供直接访问;

代码示例

 

【PHP问题代码示例】

  if ($_FILES["file"]["error"] > 0)

    echo "Error: " . $_FILES["file"]["error"] . "
";

  else

    move_uploaded_file($_FILES["file"]["tmp_name"],

      "upload/" . $_FILES["file"]["name"]);

【PHP修复示例】

|| ($_FILES["file"]["type"] == "image/jpeg")

|| ($_FILES["file"]["type"] == "image/pjpeg"))

&& ($_FILES["file"]["size"] < 20000))

  {

  if ($_FILES["file"]["error"] > 0)

    echo "Error: " . $_FILES["file"]["error"] . "
";

  else

    move_uploaded_file($_FILES["file"]["tmp_name"],

      "upload/" . $_FILES["file"]["name"]);

  }

else

  echo "Invalid file";

后续见下篇

0 0
原创粉丝点击