1.SQL注入
Ø 风险描述
SQL注入主要发生在应用程序数据库层面上。程序员在设计程序的时候,没有对用户的输入进行校验,含有特殊字符语句会被数据库误认为是正常的SQL指令而运行,从而使数据库受到攻击,可能导致数据被窃取、更改、删除,以及进一步导致网站被嵌入恶意代码、被植入后门程序等危害。
Ø 特殊字符
对SQL注入而言,特殊字符包括但不限于 (注意大小写绕过以及双写绕过):
“--,#,//(注释符)”、“ and”、“ or”、“ select”、“ update”、“ delete”、“ drop”、“ declare”、“ insert”、“ xp_shell”以及(,)括号、||,+, (空格)连接符、' 单引号、|(竖线符号)、& (& 符号)、;(分号)、$(美元符号)、%(百分比符号)、@(at 符号)、'(单引号)、"(引号)、\'(反斜杠转义单引号)、\"(反斜杠转义引号)、<>(尖括号)、CR(回车符,ASCII 0x0d)、LF(换行,ASCII 0x0a)、,(逗号)、\(反斜杠)等。
Ø 漏洞示例
请点击此处输入图片描述
其中request.getParameter("searchWord")中的参数“searchWord”是从前端获取到的,也就是jsp页面中input标签中id为“searchWord”的值,如下:
请点击此处输入图片描述
后台SQL语句是以拼接的形式执行,代码所示:
请点击此处输入图片描述
SQL语句一旦以拼接的方式执行,那么拼接的“word” 不仅仅是作为一个参数执行,还可以表示一个SQL语句,比如:word的值为1,那么SQL语句变成:Select * from test where id = 1; 如果word的值为1’ and ‘a’=’a,而系统未对传入后台的参数做任何特殊字符过滤,或者字符过滤不全,那么SQL语句变成:Select * from test where id = 1’ and ‘a’=’a。两条查询语句都能成功执行。如果这时候将and后面的字句换成union或者order by语句就能将数据库名、表名以及表中的数据查询出来。
Ø 规范要求
1、添加全局过滤器,过滤特殊字符。方式如下:
Web.xml
<filter >
<filter-name>SQLFilter</filter-name>
< filter -class>*.SQLFilte</ filter -class >
</filter >
<filter-mapping>
<filter-name> SQLFilter </filter-name>
<url-pattern> /*</url-pattern> 拦截所有请求
</filter-mapping>
在SQLFilter.java类中:
paramValue= paramValue.replaceAll(“>”, “”)
paramValue= paramValue.replaceAll(“%”,“”)
.
.
.
2、SQL语句使用参数化查询方式,代码如下:
String sql=“select * from test where id=?”;
db=new DBHelper(sql);
try{
db.stmt.setString(1,word);
ret=db.stmt.executeQuery();
while(ret.next()){……}}
2.跨站脚本攻击(XSS)
Ø 风险描述
跨站攻击是因为网站程序对用户输入过滤不足,将用户输入的恶意脚本代码正常执行或者提交。攻击者可利用XSS漏洞获取用户cookie值、传播蠕虫、篡改页面或进行钓鱼等攻击。
Ø 特殊字符
对XSS而言,特殊字符包括但不限于 (注意大小写绕过以及双写绕过):
|(竖线符号)、& (& 符号)、 ;(分号)、$(美元符号)、%(百分比符号)、@(at 符号)、'(单引号)、"(引号)、\'(反斜杠转义单引号)、\"(反斜杠转义引号)、<>(尖括号)、()(括号)、+(加号)、CR(回车符,ASCII 0x0d)、LF(换行,ASCII 0x0a)、,(逗号)、\(反斜杠)、eval方法以及关键字document、cookie、javascript、script、onerror等。
Ø 漏洞示例
请点击此处输入图片描述
搜索框种的值即为可控参数,在URL中表现形式为:
http://.../searchword?word=
相关代码如下:
请点击此处输入图片描述
此处参数在前端为EL表达式获取,并且为添加任何过滤,最后直接显示在页面。当输入框输入的参数为:<script>alert(1)</script> 时,就会直接被浏览器当作脚本执行并弹框:
请点击此处输入图片描述
请点击此处输入图片描述
其中URL的表现形式:
http://.../searchword?word=%3Cscript%3Ealert%281%29%3C%2FscriFs%3E
上面的示例是直接与页面交互,通过在URL中构造参数来实现XSS攻击。还有一种是将参数进行传递并最终存储到数据库当中,因为参数在传递过程中未经过任何有效过滤(或者存在过滤不全,会被绕过),作为可信资源存入到数据库中并最终被执行。代码如下:
请点击此处输入图片描述
请点击此处输入图片描述
在前端页面会显示用户存储的数据,并且未做任何输出过滤(或者过滤不全),页面和代码如下:
请点击此处输入图片描述
前端的页面结构如下:
请点击此处输入图片描述
如果在编辑用户信息的时候输入:<script>alert(1)</script>
请点击此处输入图片描述
在数据库中的存储形式为:
请点击此处输入图片描述
在查询的时候就会将相应的数据显示在页面,并执行脚本:
请点击此处输入图片描述
请点击此处输入图片描述
Ø 规范要求
1、添加全局过滤器,过滤特殊字符。方式如下:
Web.xml
<filter >
<filter-name>XSSFilter</filter-name>
< filter -class>*.XSSFilte</ filter -class >
</filter >
<filter-mapping>
<filter-name> XSSFilter </filter-name>
<url-pattern> /*</url-pattern> 拦截所有请求
</filter-mapping>
在XSSFilter.java类中:
paramValue= paramValue.replaceAll(“>”, “”)
paramValue= paramValue.replaceAll(“%”,“”)
.
.
2、输出编码,编码就是让解析者知道数据不是用来执行的代码,从而可以避免受攻击。主要包括3种编码:URL编码、HTML编码、JavaScript编码。对于不可信来源的数据需要执行输出编码,确保字符被视为数据,根据场景分别使用以上1种编码或多种编码组合。
3.任意文件下载
Ø 风险描述
网站在处理用户下载文件的请求时,允许用户提交任意文件路径,并把服务器上对应的文件直接发送给用户,这将造成任意文件下载威胁。如果服务器根据用户提交的目录地址,就把目录下的文件列表发给用户,会造成目录遍历安全威胁。恶意用户会变换目录或文件地址,下载服务器上的敏感文件、数据库链接配置文件、网站源代码等。
Ø 系统敏感文件
Linux操作系统:/root/.ssh/authorized_keys、 /root/.ssh/id_rsa
/root/.ssh/id_ras.keystore、 /root/.ssh/known_hosts、 /etc/httpd/conf/httpd.conf
/root/.bash_history、/root/.mysql_history、/proc/self/fd/fd[0-9]*(文件标识符)
/proc/mounts、/porc/config.gz、/etc/passwd、/etc/shadow、/etc/my.cnf
Windows操作系统: C:\Program Files\mysql\my.ini //Mysql配置、
C:\Program Files\mysql\data\mysql\user.MYD //Mysql root
C:\Windows\php.ini //php配置信息
C:\Windows\my.ini //Mysql配置信息、C:\boot.ini //查看系统版本
C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文件
C:\Windows\repair\sam //存储系统初次安装的密码
...
Ø 漏洞示例
存在下载功能的页面
请点击此处输入图片描述
Url表现形式如下:
http://.../downloadFile.action?jpgPath=/download/&jpgName=test.jpg
在代码中的表现形式如下,文件路径和文件名都是从前端获取,然后执行下载操作:
具体下载功能代码如下:
请点击此处输入图片描述
当文件正常下载时,通过brupsuite截图如下:
请点击此处输入图片描述
在此处直接替换文件名为“WEB-INF/web.xml”,尝试下载系统配置文件:
请点击此处输入图片描述
可以看到下载文件失败,返回不一样的结果。但是可以通过添加“../”进行目录跳转:
请点击此处输入图片描述
可以看出上面返回了web.xml内容,表示已经下载成功。
Ø 规范要求
1、文件下载时进行过滤,过滤掉 “./”、“../”、“%”等,代码如下:
请点击此处输入图片描述
当输入“../”时:
请点击此处输入图片描述
2、对下载的文件路径进行严格控制,只允许下载某部分目录下的文件:
请点击此处输入图片描述
请点击此处输入图片描述
请点击此处输入图片描述
3、对下载文件后缀名做严格控制:
请点击此处输入图片描述
请点击此处输入图片描述
请点击此处输入图片描述
4、下载文件之前做权限判断,判断用户是否有下载该文件的权限。可建立文件白名单,不属于白名单内,不允许下载。
5、使用ID替换文件夹和文件名,使得整个输入由路径名变为一个表示ID的字符串,这种方法很容易验证它的有效性。
4.任意文件上传
Ø 风险描述
应用程序在处理用户上传的文件时,没有判断文件是否在允许的范围内,就把文件保存在服务器上,导致恶意用户可以上传任意文件,甚至上传脚本木马到服务器上,直接控制服务器。文件上传漏洞的利用是有限制条件的,首先要能够成功上传木马文件,其次上传的木马文件能够被执行,最后就是上传文件的路径必须可知。
Ø 漏洞示例
请点击此处输入图片描述
服务器端代码:
请点击此处输入图片描述
可以看到,服务器对上传文件的类型、内容没有做任何的检查、过滤,存在明显的文件上传漏洞。上传文件hack.php(一句话木马):
请点击此处输入图片描述
上传成功,并且返回了上传路径:
请点击此处输入图片描述
通过菜刀连接
请点击此处输入图片描述
连接成功后,就可以在服务器上执行任意命令,获取webshell权限。可以下载、修改服务器的所有文件。
请点击此处输入图片描述
Ø 规范要求
1、对上传文件的类型进行检测,设置白名单进行过滤。(建议禁止上传jsp、jspx、php、asp、aspx等格式的文件)。
2、对上传文件的内容及大小进行检测,代码如下:
在这里,代码对上传文件的类型、大小做了限制。
5.越权操作
Ø 风险描述
如果一个Web应用程序不正确检查用户是否被授权访问的特定的资源,就有可能导致产生越权漏洞。例如帐号A在登录的状态下,遍历访问请求中的ID就可以查看其它人的相关信息。甚至普通权限的用户可以通过越权获取到管理员的权限,从而可以访问本部属于自己权限的数据或页面。
Ø 漏洞示例
请点击此处输入图片描述
在test001账号访问的页面URL中直接将参数art=4改成art=6,则test001账号就可以访问原本只能被test002号访问的数据,如下所示:
请点击此处输入图片描述
相关代码如下:
请点击此处输入图片描述
在上面的代码中,没有判断用户的Session值,导致通过修改art的值就可以遍历访问其他的信息。
Ø 规范要求
1、验证一切来自客户端的参数,特别是和权限相关的参数,如用户ID或角色ID等。
2、在进行增、删、改、查等操作时,需将sessionID和认证的token绑定,存放在服务器的会话里,不要相信任何客户端发来的认证和授权信息,包括消息头、Cookie、隐藏的表单或者URL参数。下面时修复后的代码:
在修复后的代码中,首先会判断用户的Session,只有在Session为True的情况下才能够查看返回的信息,因此当用户遍历art的值来尝试访问其他人的信息时,会提示无权访问。
6.缓存区溢出
Ø 风险描述
缓存区溢出主要出现在C/C++当中,是一种非常普遍、非常危险的漏洞。利用缓冲区溢出攻击,可以导致程序运行失败、系统宕机、重新启动等后果。更为严重的是,可以利用它执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作。
Ø 漏洞示例
请点击此处输入图片描述
在代码100行处,数组在复制过程中,后面一个数组的长度是前一个数组的两倍,当需要复制的数据超过第一个数组的数组长度时,对数组完成复制后,由于数组没有结束标识,读取数组数据时存在内存溢出的可能性。
请点击此处输入图片描述
在代码3278、3283行处,使用strncpy复制时只是复制了一个字节,而数组没有经过初始化,且最后也没有对数组做结束标识处理,在直接读取数组时,可能会造成内存溢出。
Ø 规范要求
1、对传递的数据进行类型/大小/长度的检验。
2、过滤风险数据。
3、初始化参数。
7.URL跳转
Ø 风险描述
应用程序接收到用户提交的URL参数后,没有对参数做“可信任URL”的验证,就向用户浏览器返回跳转到该URL的指令。恶意攻击者可以发送给用户一个链接,但是用户打开后,却来到钓鱼网站页面,将会导致用户被钓鱼攻击,账号被盗,或账号相关财产被盗。
Ø 漏洞示例
跳转代码:response.sendRedirect(request.getParameter("url"));
某应用程序有一个名为“redirect.jsp”的页面,该页面的参数为“url”,攻击者精心构造一个链接将用户重定向到一个恶意网站,执行钓鱼攻击并安装恶意程序。
http://www.example.com/redirect.jsp?url=evil.com
Ø 规范要求
1、输入验证,对跳转的URL进行验证,对于不合法的跳转URL拒绝跳转访问。可通过白名单进行验证。
2、如果在本网站内跳转,则使用相对路径,而不要使用绝对路径,如在URL的参数中使用了绝对路径,建议在代码里剥离URL中域名部分,然后再和网站的域名重新结合成绝对路径,再跳转。
3、如果请求允许跳转的对象只是限制在有限的范围内,可创建一个匹配的规则,通过数字类型的ID来代替跳转到具体的页面。
4、仅传递一个回调url作为参数是不安全的,增加一个参数签名,保证回调url不被修改,在控制页面转向的地方校验传入的URL是否为公司域名(或者其他可信域名)
如以下是一段校验是否公司域名的JS函数
function VaildURL(sUrl)
{
return (/^(https?:\/\/)?[\w\-.]+\.(qq|paipai|soso|taotao)\.com($|\/|\\)/i).test(sUrl)||(/^[\w][\w\/\.\-_%]+$/i).test(sUrl)||(/^[\/\\][^\/\\]/i).test(sUrl) ? true : false;
}
8.跨站请求伪造(CSRF)
Ø 风险描述
CSRF 是一种攻击者迫使被攻击者网页浏览器发送HTTP 请求到攻击者所选择的网站的漏洞。CSRF依靠用户标识,并利用网站对用户标识的信任欺骗用户浏览器发送HTTP请求给目标站点。通过跨站请求伪造漏洞,攻击者能让受害用户修改可以修改的任何数据,或者是执行允许使用的任何功能。
Ø 漏洞示例
缺陷代码
请点击此处输入图片描述
请点击此处输入图片描述
请点击此处输入图片描述
恶意代码
请点击此处输入图片描述
攻击者执行完恶意代码后用户的账户和密码会在不知情的情况下被更改
Ø 规范要求
1、执行标准的会话管理,通过在每个会话中使用强随机令牌或参数来管理账户。
2、对于重要的数据提交,增加带随机令牌的隐藏字段,在提交给服务器后对令牌进行验证,确保提交的请求是合法的。
3、对于重要的数据提交,也可进行二次重新认证,以确保请求是合法的。
4、对于重要的数据提交,也可增加图形验证码进行验证,以确保请求是合法的。
示例:
请点击此处输入图片描述
9. 敏感信息泄露及错误处理
Ø 风险描述
应用系统常常产生错误信息并显示给使用者,导致信息泄露问题,很多时候,这些错误信息是非常有用的攻击信息,因为它们暴露了应用系统实施细则或有用的开发信息,对攻击系统有很大帮助。
Ø 漏洞示例
请点击此处输入图片描述
请点击此处输入图片描述
看到此信息,攻击者可以做以下判断:
1)数据库是oracle
2) 查询语句的列数不正确
3)根据这个判断,攻击者调整get请求的内容,最终达到获取数据库所有数
据的目的。
Ø 规范要求
1、通过web.xml配置文件实现,产生异常或者错误时跳转到统一的错误处理页面,避免泄漏过多敏感信息。例如:
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/error.jsp</location>
</error-page>
10. 远程系统命令执行
Ø 风险描述
系统命令执行攻击,是指代码中有一段执行系统命令的代码,但是系统命令需要接收用户输入,恶意攻击者可以通过这个功能直接控制服务器。
Ø 漏洞示例
请点击此处输入图片描述
以上代码调用系统的shell执行含有用户输入参数的命令,攻击者可以将多个命令合并在一起。比如,输入 “. & echo hello” 首先由dir命令罗列出当前目录的内容,再用echo打印出友好的信息。
Ø 规范要求
1、所有需要执行的系统命令,必须是开发人员定义好的,不允许接收用户传来的参数,加入到系统命令中去。
2、字符转义,对特殊字符进行转义。
3、输入验证,对于进入命令执行的参数进行检查,检查参数长度及包含特殊字符,重点检查各种命令分隔符(如;、&&、&、||、|等),当发现非法字符,拒绝请求。建议过滤出以下所有字符:
[1] |(竖线符号)
[2] & (& 符号)
[3];(分号)
[4] $(美元符号)
[5] %(百分比符号)
[6] @(at 符号)
[7] '(单引号)
[8] "(引号)
[9] \'(反斜杠转义单引号)
[10] \"(反斜杠转义引号)
[11] <>(尖括号)
[12] ()(括号)
[13] +(加号)
[14] CR(回车符,ASCII 0x0d)
[15] LF(换行,ASCII 0x0a)
[16] ,(逗号)
[17] \(反斜杠)
11. 代码注入
Ø 风险描述
web应用代码中,允许接收用户输入一段代码,之后在web应用服务器上执行这段代码,并返回给用户。由于用户可以自定义输入一段代码,在服务器上执行,所以恶意用户可以写一个远程控制木马,直接获取服务器控制权限,所有服务器上的资源都会被恶意用户获取和修改,甚至可以直接控制数据库。
Ø 漏洞示例
请点击此处输入图片描述
以上代码允许用户注入任意的代码,若其中args[0]参数设置如下,则将允许恶意用户创建任意文件。
请点击此处输入图片描述
Ø 规范要求
1、写死需要执行的命令,或通过白名单、预设命令的方式,限制可以执行的命令。
2、输入验证,对于进入执行代码的参数进行检查,检查参数长度及包含特殊字符,当发现非法字符,拒绝请求。
3、字符转义,对特殊字符进行转义。
12. XML注入
Ø 风险描述
XML注入攻击,和SQL注入的原理一样,都是攻击者输入恶意的代码来执行自身权限以外的功能。 XML是存储数据的一种方式,如果在修改或者查询时,没有做转义,直接输入或输出数据,都将导致XML注入漏洞。攻击者可以修改XML数据格式,增加新的XML节点,对数据处理流程产生影响。
Ø 漏洞示例
下面是一个保存注册用户信息为XML格式的例子
请点击此处输入图片描述
可以看到,这段代码没有进行任何的过滤操作。一个普通用户注册后,会产生这样一条数据记录:
请点击此处输入图片描述
攻击者输入自己email时,可以输入如下代码:
请点击此处输入图片描述
最终用户注册后,数据就变成了:
请点击此处输入图片描述
可以看到,多出了一条role=“admin_role”的管理员lf,达到攻击目的。
Ø 规范要求
1、对用户提交的数据在保存和展示前对特殊字符进行转义,防止XML注入攻击。例如:
& --> &
< --> <
> --> >
" --> "
' --> '
在XML保存和展示之前,对数据部分,单独做转义即可
请点击此处输入图片描述
13.密码安全
Ø 风险描述
密码安全问题主要存在明文密码、弱密码、密码硬编码等问题。此类问题均容易导致密码的泄露。恶意攻击者可直接读取获得明文账号密码,导致其他相关联系统应用口令泄漏,扩大入侵范围。
Ø 漏洞示例
存在安全漏洞代码如下:
请点击此处输入图片描述
如果有一个具备中间件服务器机器访问权限的人,看到了这个例如applicationContext.xml的文件,并且打开该文件,就会知道数据库的用户名和密码是什么。
下面是对该漏洞的处理:
首先,我们需要将配置文件抽取到property中来:
请点击此处输入图片描述
将上面的第一个代码修改为第二个代码,第一个类是负责抓取jdbc.properties中的属性并且填充到dataSource当中来,这样,我们就可以将所有的注意力都集中在jdbc.properties上了。然后扩展PropertyPlaceholderConfigurer父类PropertyResourceConfigurer的解密方法convertProperty:
请点击此处输入图片描述
然后将上面完成的类替换配置文件中的PropertyPlaceholderConfigurer:
请点击此处输入图片描述
处理后的jdbc.properties里面的文件内容就变成如下所示了:
请点击此处输入图片描述
Ø 规范要求
1、配置文件中涉及到需要用户验证的密码字段采用加密后保存,禁止明文或使用弱加密算法对密码进行加密。
2、涉及密码的配置,需要把密码设置具备一定的强度,大小写数字特殊字等最少3类型8位以上,并且不能包含与用户名一样的字符串。
3、程序代码中涉及到使用密码的地方,密码引用不得直接写入到程序中,需把密码写入相应的配置文件中。
4、对硬编码密码进行模糊化处理,将密码获取途径分散到其他系统或文件各处,增加直接获取密码难度。
14.敏感数据未加密
14.1.密码明文传输
Ø 风险描述
数据加密主要应用于数据存储及数据传输过程中,敏感数据未加密进行存储或传输,容易导致数据泄露,恶意攻击者可嗅探到明文传输的敏感数据,从而窃取相关信息。
Ø 漏洞示例
某登录页面输入账号密码登录,利用burpsuite抓包:
请点击此处输入图片描述
发现密码在传输过程当中未进行任何加密处理,直接已明文形式进行传输,这样很容易被第3方监听并获取明文的密码。
Ø 规范要求
建议采用不可逆的加密方式对密码进行加密如MD5。禁止明文或使用弱加密算法对密码进行加密,密码设置应具备一定的强度,大小写数字特殊字等最少3类型8位以上,并且不能包含与用户名一样的字符串。
14.2.配置文件密码明文存储
Ø 风险描述
恶意攻击者在获取一定读取权限下可获取到数据库配置文件的账号密码明文信息,通过该信息,攻击者可对数据库进行恶意操作,甚至可能导致其他系统被控制,扩大被入侵的范围。
Ø 漏洞示例
某系统配置文件中密码以明文方式存储:
请点击此处输入图片描述
在这里,很明显能看到数据库的账号密码是明文。
Ø 规范要求
禁止明文或使用弱加密算法对密码进行加密,密码设置应具备一定的强度,大小写数字特殊字等最少3类型8位以上,并且不能包含与用户名一样的字符串。
15.弱加密算法
Ø 风险描述
一些低强度的密码算法,如DES、RC2等已经可以很容易的在短时间内被人所破解,其它一些容易被误用的“密码算法”,如base64、escape、urlencode等,其实并不是密码算法,只是简单的编码而已,不能起到密码算法保护信息的作用。
Ø 漏洞示例
以“古典密码算法”为例:
public class Caesar { public static void encode(String PlainText, int Offset) { String CipherText = ""; for (int i = 0; i < PlainText.length(); i++) { if (PlainText.charAt(i) == 32) CipherText += (char)(32); else if (PlainText.charAt(i) >= 'a' && PlainText.charAt(i) <= 'z') CipherText += (char)('a' + ((PlainText.charAt(i) - 'a' + Offset) % 26)); else if (PlainText.charAt(i) >= 'A' && PlainText.charAt(i) <= 'Z') CipherText += (char)('A' + ((PlainText.charAt(i) - 'A' + Offset) % 26)); else if (PlainText.charAt(i) >= '0' && PlainText.charAt(i) <= '9') CipherText += (char)('0' + ((PlainText.charAt(i) - '0' + Offset) % 10)); } System.out.println("Ciphertext: " + CipherText); } |
由于在算法中同一字符每次都是映射到另一字符,因此,只要获取到一定数量的明文和加密后的密文,就可以清楚的还原出每个字符的映射关系。并且可以通过映射关系,可以写出解密程序,如下所示:
public static void decode(String CipherText, int Offset) { String PlainText = ""; for (int i = 0; i < CipherText.length(); i++) { if (CipherText.charAt(i) == 32) PlainText += (char)(32); else if (CipherText.charAt(i) >= 'a' && CipherText.charAt(i) <= 'z') if((CipherText.charAt(i) - Offset) < 'a'){ PlainText += (char)('z' - ('a' - (CipherText.charAt(i) - Offset)) + 1); }else{ PlainText += (char)('a' + ((CipherText.charAt(i) - 'a' - Offset) % 26)); } else if (CipherText.charAt(i) >= 'A' && CipherText.charAt(i) <= 'Z') if((CipherText.charAt(i) - Offset) < 'A'){ PlainText += (char)('Z' - ('A' - (CipherText.charAt(i) - Offset)) + 1); }else{ PlainText += (char)('A' + ((CipherText.charAt(i) - 'A' - Offset) % 26)); } else if (CipherText.charAt(i) >= '0' && CipherText.charAt(i) <= '9') if((CipherText.charAt(i) - Offset) < '0'){ PlainText += (char)('9' - ('0' - (CipherText.charAt(i) - Offset)) + 1); }else{ PlainText += (char)('0' + ((CipherText.charAt(i) - '0' - Offset) % 10)); } } System.out.println("PlainText: " + PlainText); } |
Ø 规范要求
推荐使用的安全算法
对称算法:3DES密钥长度128及以上,切k1,k2,k3互不相等。
对称算法:AES密钥长度128及以上。
非对称算法:RSA密钥长度1024及以上。
哈希算法:SHA2密钥长度256及以上。
消息认证码算法:HMAC-SHA2密钥长度256及以上。
16.文件包含
Ø 风险描述
通过文件包含函数特性去包含任意文件时,由于要包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,而攻击者可以构造的这个恶意文件可以达到执行任意代码、控制网站、甚至控制服务器的目的。
Ø 漏洞示例
以PHP本地包含文件为例,缺陷代码如下:
请点击此处输入图片描述
程序本意是获取action并引入action里的功能函数,这里上传头像image.jpg,然后包含进来发现在页面显示了phpinfo的信息
请点击此处输入图片描述
上传的头像image.jpg代码改为一句话木马:
请点击此处输入图片描述
上传成功后,使用菜刀连接,成功getshell, 可以下载、修改服务器的所有文件。
请点击此处输入图片描述
Ø 规范要求
1、如果是PHP代码则设置allow_url_fopen和 allow_url_include属性为0ff。
2、涉及到的危险函数:(如include(),include_once(),require(),require_once())当使用这些函数时,要求程序员包含文件里的参数尽量不要使用变量,如果使用变量,就一定要严格检查要包含的文件名,过滤危险字符,绝对不能由用户任意指定。
17. Cookie 安全
Ø 风险描述
Cookie作为用户身份的替代,其安全性有时决定了整个系统的安全性,Cookie的安全性问题主要如下所述:
(1) Cookie欺骗
Cookie记录了用户的帐户ID、密码之类的信息,通常使用MD5方法加密后在网上传递。虽然经过了加密处理,但是截获Cookie的人不需要知道这些字符串的含义,只要把别人的Cookie向服务器提交,并且能够通过验证,就可以冒充受害人的身份登陆网站,这种行为叫做Cookie欺骗。非法用户通过Cookie欺骗获得相应的加密密钥,从而访问合法用户的所有个性化信息,包括用户的E-mail甚至帐户信息,对个人信息造成严重危害。
(2)Cookie截获
Cookie以纯文本的形式在浏览器和服务器之间传送,很容易被他人非法截获和利用。任何可以截获Web通信的人都可以读取Cookie。Cookie被非法用户截获后,然后在其有效期内重放,则此非法用户将享有合法用户的权益。例如,对于在线阅读,非法用户可以不支付费用即可享受在线阅读电子杂志。
Ø 漏洞示例
有一个后台登录页面(login.asp)的源代码
请点击此处输入图片描述
登录页面的两个Cookies值分别为cmsname和cmsid
请点击此处输入图片描述
网页会把输入的管理员帐号和管理员ID分别赋值给cmsname和cmsid这两个cookies值,如果密码正确就会跳转到后台首页,并添加上述的两个cookies值。检查用户登录状态的文件,源代码如下:
请点击此处输入图片描述
可以看到,网页虽然有验证用户登录状态,但只仅仅验证了Cookies的内容,只要两个Cookies的内容都对得上,就能访问后台首页,这样,就会产生Cookies欺骗漏洞。
Ø 规范要求
1、设置认证COOKIE时,增加Cookie httponly这个属性。如果在Cookie中设置了"HttpOnly"属性,那么通过程序(JS脚本、Applet等)将无法读取到Cookie信息
2、增加Secure这个属性。当该属性设置为true时,表示创建的 Cookie 会被以安全的形式向服务器传输,也就是只能在 HTTPS 连接中被浏览器传递到服务器端进行会话验证,如果是 HTTP 连接则不会传递该cookie信息,所以不会被窃取到Cookie 的具体内容。就是只允许在加密的情况下将cookie加在数据包请求头部,防止cookie被带出来。secure属性是防止信息在传递的过程中被监听捕获后信息泄漏,HttpOnly属性的目的是防止程序获取cookie后进行攻击。
18.会话超时设置
Ø 风险描述
浏览器和服务器之间创建了一个Session,若没有做会话超时设置,当客户端长时间(休眠时间)没有与服务器交互的情况下,服务器也没有将此Session销毁,若攻击者获取此会话,就能一直利用该会话,进行与服务器的交互。
Ø 漏洞示例
下面一段存在漏洞的代码中,没有对session做一个失效的处理。
请点击此处输入图片描述
修复后的代码如下所示,用户在登录的时候,首先会让之前的session失效,然后又获取新的seesion。
请点击此处输入图片描述
Ø 规范要求
设置空闲会话强制超时时间,时间不能设置过长,建议设置为5分钟。
设置Session超时时间方式:
方式一:
在web.xml中设置session-config如下:
<session-config>
<session-timeout>2</session-timeout>
</session-config>
即客户端连续两次与服务器交互间隔时间最长为2分钟,2分钟后session.getAttribute()获取的值为空
API信息:
session.getCreationTime() 获取session的创建时间
session.getLastAccessedTime() 获取上次与服务器交互时间
session.getMaxInactiveInterval() 获取session最大的不活动的间隔时间,以秒为单位120秒。
方式二:
在Tomcat的/conf/web.xml中session-config,默认值为:30分钟
<session-config>
<session-timeout>30</session-timeout>
</session-config>
方式三:
在Servlet中设置
HttpSession session = request.getSession();
session.setMaxInactiveInterval(60);//单位为秒
19.日志处理
Ø 风险描述
日志处理是由于在全局过滤的时候没有考虑日志文件内容,当一些敏感内容通过日志文件保存下来的时候,或者说木马病毒代码通过日志记录下来时,可以通过日志文件查看或执行。导致敏感信息泄露,甚至被上传webshell,导致攻击者可以随时进入后台,对文件进行操作。
Ø 特殊字符
Php木马: <?php @eval($_POST[value]);?>
Asp木马:<%execute(request("value"))%>
Aspx木马:<%@ Page Language="Jscript"%>
还有password,passwd(密码),phone(电话号码),ip等。
Ø 漏洞示例
以某后台数据库为例,先执行语句setglobalgeneral_log='on',把general log设置为ON
请点击此处输入图片描述
再执行SET global general_log_file='D:/phpStudy/WWW/cmd.php',修改日志文件名。
请点击此处输入图片描述
然后执行一条sql语句。
请点击此处输入图片描述
用然后菜刀进行连接。
请点击此处输入图片描述
还有就是日志记录敏感账号密码等信息:
请点击此处输入图片描述
在代码100行处,直接将用户名密码明文形式记录在日志中。
Ø 规范要求
对日志文件中的敏感内容进行转义,凡是从日志文件中输出的内容都要进行验证。而且对于一些敏感信息,如电话号码,密码,ip地址等内容都要进行加密保存。
20.未配置全局过滤器
Ø 风险描述
在系统庞大的系统下,很多漏洞是具有通用性的,如XSS、SQL,未授权访问、任意文件上传下载等,如若一个地方出现,在未配置全局危险字符过滤器的情况下,通常其他地方也会出现同样的安全漏洞。
Ø 漏洞示例
请点击此处输入图片描述
在该配置文件中,只配置了编码过滤器,而没有配置全局危险字符过滤器。
Ø 规范要求
1、根据业务需求配置健壮的全局危险字符过滤器,对用户所有输入输出进行过滤检查,如检查异常则跳转到制定的error页面。
2、使用xml配置文件的方式记录配置信息,配置信息包含是否开启校验、是否记录日志、是否中断请求、是否替换脚本字符等。