appScan常见高危漏洞,走过的坑啊
一、SQL 盲注(SQL注入)
1、 过滤特殊字符
2、使用预编译,不要拼接sql
3、对sql执行部分异常进行捕获,不要抛出不同的异常,以免被推测有漏洞
4、可能appscan误报
误报解决:
(1)、把错误的页面单独反复测试
(2)、把AppScan扫描的线程数改成1(默认10)
二、存储的跨站点脚本编制(xss漏洞)
1、对存储的内容进行xss过滤。
2、删除存储的脚本。
三、跨站脚本编制(xss漏洞)
1、通过fliter对参数进行过滤,过滤一般
package com.system.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
public class XssFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest)request);
chain.doFilter(xssRequest, response);
}
@Override
public void destroy() {
}
}
package com.system.filter;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.apache.commons.lang3.StringEscapeUtils;
import org.owasp.validator.html.AntiSamy;
import org.owasp.validator.html.CleanResults;
import org.owasp.validator.html.Policy;
import org.owasp.validator.html.PolicyException;
import org.owasp.validator.html.ScanException;
import com.system.utils.StringUtils;
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
//AntiSamy使用的策略文件
private static Policy policy = null;
static {
//指定策略文件,策略文件记得放在classpath下,文件在jar包里面可以复制,也可在网上下载
String antiSamyPath = XssHttpServletRequestWrapper.class.getClassLoader().getResource("antisamy-ebay.xml").getFile();
//String antiSamyPath = "E:\\ecpliseSpace\\newsi\\eip-si\\eip-si-aop\\src\\main\\resources\\antisamy-ebay.xml";
if(antiSamyPath.startsWith("file")){
antiSamyPath = antiSamyPath.substring(6);
}
try {
policy = Policy.getInstance(antiSamyPath);
} catch (PolicyException e) {
e.printStackTrace();
}
}
public XssHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
}
/**
* @desc Header为空直接返回,不然进行XSS清洗
*
*/
@Override
public String getHeader(String name) {
String value = super.getHeader(name);
if(StringUtils.isEmpty(value)){
return value;
}
else{
String newValue = cleanXSS(value);
return newValue;
}
}
/**
* @desc Parameter为空直接返回,不然进行XSS清洗
*/
@Override
public String getParameter(String name) {
String value = super.getParameter(name);
if(StringUtils.isEmpty(value)){
return value;
}
else{
value = cleanXSS(value);
return value;
}
}
/**
* @desc 对用户输入的参数值进行XSS清洗
*
*/
@Override
public String[] getParameterValues(String name) {
String[] values = super.getParameterValues(name);
if (values != null) {
int length = values.length;
String[] escapseValues = new String[length];
for (int i = 0; i < length; i++) {
escapseValues[i] = cleanXSS(values[i]);
}
return escapseValues;
}
return super.getParameterValues(name);
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public Map<String,String[]> getParameterMap(){
Map<String,String[]> request_map = super.getParameterMap();
Iterator iterator = request_map.entrySet().iterator();
System.out.println("request_map"+request_map.size());
while(iterator.hasNext()){
Map.Entry me = (Map.Entry)iterator.next();
//System.out.println(me.getKey()+":");
String[] values = (String[])me.getValue();
for(int i = 0 ; i < values.length ; i++){
System.out.println(values[i]);
values[i] = cleanXSS(values[i]);
}
}
return request_map;
}
/**
* @desc AntiSamy清洗数据
*
*/
private String cleanXSS(String taintedHTML) {
try{
AntiSamy antiSamy = new AntiSamy();
final CleanResults cr = antiSamy.scan(taintedHTML,policy);
//AntiSamy会把“ ”转换成乱码,把双引号转换成""" 先将 的乱码替换为空,双引号的乱码替换为双引号
String str = StringEscapeUtils.unescapeHtml4(cr.getCleanHTML());
str = str.replaceAll(antiSamy.scan(" ",policy).getCleanHTML(),"");
str = str.replaceAll(antiSamy.scan("\"",policy).getCleanHTML(),"\"");
/**下面是我根据appScan测试出来的特俗字符串,来进行单独过滤的*/
str = str.replaceAll("alert", "xsszh");
str = str.replaceAll("onmouseover", "xsszh");
str = str.replaceAll("onmouseover", "xsszh");
str = str.replaceAll("eval", "xsszh");
str = str.replaceAll(".source", "xsszh");
str = str.replaceAll("window", "xsszh");
str = str.replaceAll("font-family", "xsszh");
str = str.replaceAll("expression", "xsszh");
str = str.replaceAll("location", "xsszh");
str = str.replaceAll("style", "xsszh");
return str;
}catch( ScanException e) {
e.printStackTrace();
}catch( PolicyException e) {
e.printStackTrace();
}
return taintedHTML;
}
}
(3)、配置web.xml
<filter>
<filter-name>xssFilter</filter-name>
<filter-class>com.ustcinfo.ishare.eip.basic.system.filter.XssFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>xssFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
appscan xss注入样例:
(1)、οnmοuseοver=“alert(119)”
(2)、
(5)、+alert(19)+
(6)、“style=fontfamily:expression(eval(/ale/.source+/rt/.source+/(288)/.source))!(最变态的一种)
(7)、还有会把alert放在alert中间,如alalertert这种。
(8)、οnfοcus=x=’\x61\x6c\x65\x72\x74\x28\x31\x29’;new Function(x)()//
(9)、”+[window[‘location’]=’\x6a\x61\x76\x61\x73\x63\x72\x69\x70\x74\x3a\x61\x6c\x65\x72\x74\x2815\x29’]+"
四、已解密的登录请求
这个尝试了很多办法,如对密码参数进行加密处理、改变密码参数,不出现password,强制使用post请求,最后是在nginx配置https
五、查询中的密码参数
将参数名称改成普通的,不要有密码之类的字样,https也没有能规避这个漏洞。
六、其他链接型漏洞
可以根据链接提示,对响应链接进行拦截过滤即可
注:部分sql注入,nosql注入可能是在发送参数,后台报错引起的,只要在后台捕获异常,不让它抛出,appscan可能就不会推理这是个漏洞。