安全人员须知的TOP20漏洞编码安全规范(一)
文章来源:系统安全运维
Ø 漏洞示例
其中request.getParameter("searchWord")中的参数“searchWord”是从前端获取到的,也就是jsp页面中input标签中id为“searchWord”的值,如下:
后台SQL语句是以拼接的形式执行,代码所示:
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>
paramValue= paramValue.replaceAll(“>”, “”)
paramValue= paramValue.replaceAll(“%”,“”)
String sql=“select * from test where id=?”;
db=new DBHelper(sql);
try{
db.stmt.setString(1,word);
ret=db.stmt.executeQuery();
while(ret.next()){……}}
此处参数在前端为EL表达式获取,并且为添加任何过滤,最后直接显示在页面。当输入框输入的参数为:<script>alert(1)</script> 时,就会直接被浏览器当作脚本执行并弹框:
在前端页面会显示用户存储的数据,并且未做任何输出过滤(或者过滤不全),页面和代码如下:
前端的页面结构如下:
如果在编辑用户信息的时候输入:<script>alert(1)</script>
在数据库中的存储形式为:
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>
paramValue= paramValue.replaceAll(“>”, “”)
paramValue= paramValue.replaceAll(“%”,“”)
当文件正常下载时,通过brupsuite截图如下:
在此处直接替换文件名为“WEB-INF/web.xml”,尝试下载系统配置文件:
可以看到下载文件失败,返回不一样的结果。但是可以通过添加“../”进行目录跳转:
当输入“../”时:
2、对下载的文件路径进行严格控制,只允许下载某部分目录下的文件:
3、对下载文件后缀名做严格控制:
服务器端代码:
可以看到,服务器对上传文件的类型、内容没有做任何的检查、过滤,存在明显的文件上传漏洞。上传文件hack.php(一句话木马):
上传成功,并且返回了上传路径:
通过菜刀连接:
连接成功后,就可以在服务器上执行任意命令,获取webshell权限。可以下载、修改服务器的所有文件。
在test001账号访问的页面URL中直接将参数art=4改成art=6,则test001账号就可以访问原本只能被test002号访问的数据,如下所示:
相关代码如下:
在代码100行处,数组在复制过程中,后面一个数组的长度是前一个数组的两倍,当需要复制的数据超过第一个数组的数组长度时,对数组完成复制后,由于数组没有结束标识,读取数组数据时存在内存溢出的可能性。
某应用程序有一个名为“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、通过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] \(反斜杠)
版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。祝愿每一位读者生活愉快!谢谢!
推荐阅读
*VMware vCenter 爆出19个重大漏洞,可远程执行任意代码
*有媒体报道称疑似中国黑客攻击印尼政府网络,我驻印尼使馆回应
*媒体称Steam缺乏监管、注册有漏洞!Steam被指无法防沉迷