1、SQL注入
SQL注入通常是由于直接将未可信的用户输入作为数据库查询的参数,用于数据库查询操作,从而引发数据库信息的泄露。SQL注入可导致未授权的访问敏感数据,更新或删除数据库信息等恶意操作。引发信息泄露/任意代码执行漏洞。
示例:
<select id="rpt_info_compliance.selectSqlModel" parameterClass="java.lang.String" resultClass="java.util.HashMap" remapResults="true" > 其中$selectSqlSting$由用户输入带入 |
解决方案:
iBatis框架中的SQL语句尽量使用预编译#方式传参数,特别注意in语句和like语句写法,如必须使用$方式拼接SQL语句,则不应带入用户输入,或使用ESAPI中的SQLEscape方法过滤用户输入。
where h.dif_register_detail_inc_id in |
<isNotEmpty prepend="and" property="chnlId"> |
2、XSS
跨站点脚本发生于在动态生成的Web页面直接显示未可信(未严格验证)的外部输入,恶意用户可以利用该缺陷往动态页面中注入恶意脚本,当用户打开页面时,该恶意脚本将自动执行。注入的恶意脚本可以获取用户的帐号密码、改变用户设置、窃取cookies或往页面中插入一些恶意的内容。可导致恶意内容显示/任意脚本(代码)执行问题。
示例:
上传文件使用用户输入的文件名存储,若文件名中包含<script>alert("aaa")</script>则出现下图中的XSS问题
上传解析Excel时为进行过滤,导致用户输入反射到页面形成XSS问题
解决方案:
系统统一使用XssSpFilter进行用户输入过滤,需要配置web.xml中过滤器,文件:XssSpFilter.java,XssSpCommonsMultipartResolver.java。
同时在上传文件、解析Excel等位置使用用户输入存库时,通过Jsoup.clean(value, Whitelist.relaxed());方法进行过滤。
3、CSRF
用户以当前身份浏览到flash或者第三方网站时,JS/flash可以迫使用户浏览器向任意CGI发起请求,此请求包含用户身份标识,CGI如无限制则会以用户身份进行操作。
解决方案:
部署anti csrf token;限制访问的referer;不使用get方式提交数据;重要操作进行二次验证(验证码)等请求referrer验证;关键请求使用验证码。
4、路径可控制
利用用户的未可信的输入来控制访问服务器上的哪个文件,允许用户控制或访问不在用户访问路径上的文件。所访问文件的文件名(含路径)来源于外部输入(或部分受控制),通过控制用户访问路径上的“../”或“//”等特殊字符来访问其他目录下的文件(或添加新文件),可造成以下风险:读敏感数据文件、删除重要文件、DOS攻击。
示例:
String path = getInputPath(); if (path.startsWith("/safe_dir/")){ File f = new File(path); f.delete() } |
由于有“/safe_path/”的限定,程序假定path就是可信的。但当恶意用户输入/safe_dir/../important.dat,则导致程序误删父目录下的文件important.dat。
解决方案:
写死路径、白名单路径,随机化文件名(如../);要检测../,对../ 进行替换转义;使用文件服务器;限制文件及目录权限。
5、日志欺骗
通过构造输入形成伪造的日志记录,达到隐藏痕迹的目的。
示例:
用户登录,日志记录登录状态
Username=Alex&Password=nopassword
19:30-Login failed for username:Alex
攻击者登录,日志被篡改
Username=Alex%0d%0a19%3a31-Login+successed+for+username%3a+Admin&Password=nopassword
19:30-Login failed for username:Alex
19:31-Login successed for username:Admin
解决方案:
日志记录时过滤换行及换行转义字符