XSS漏洞原理
攻击者在被攻击的web服务器网页中嵌入恶意脚本,通常使用js编写的恶意代码,当用户使用浏览器访问被嵌入恶意代码的网页时,恶意代码将会在用户的浏览器上执行。XSS其实也是注入的一种,前端注入。(用户输入的传参会被当作前端代码执行)。
常见获取前端参数方式
1.使用Servlet
技术
public class ServletCheckLogin extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1.准备
PrintWriter out = resp.getWriter();
// 2.获取请求里面的用户名和密码
String username = req.getParameter("username");
String password = req.getParameter("password");
-
使用 Structs2
框架
通过action类绑定参数或model获取前端的参数
3.使用springMvc获取前端参数
对象方式
@Controller
@RequestMapping("/param")
public class TestParamController {
private static final Logger logger = LoggerFactory.getLogger(TestParamController.class);
/**
* 请求参数名和Controller方法的参数一致
* produces 设置返回参数的编码格式可以设置返回数据的类型以及编码,可以是json或者xml
* }
* @param user 用户信息
* @return
*
*/
@RequestMapping(value = "/addByObject", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})
@ResponseBody
public String addUserByObject(User user){
logger.debug("name:" + user.getName() + ",pwd:" + user.getPwd());
return "name:" + user.getName() + ",pwd:" + user.getPwd();
}
}
自定义方法参数名
/**
* 自定义方法参数名-当请求参数名与方法参数名不一致时
* @param u_name 用户名
* @param u_pwd 密码
* @return
*/
@RequestMapping(value = "/addByDifName", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})
@ResponseBody
public String addUserByDifName(@RequestParam("name") String u_name, @RequestParam("pwd")String u_pwd){
logger.debug("name:" + u_name + ",pwd:" + u_pwd);
return "name:" + u_name + ",pwd:" + u_pwd;
}
使用ServletRequest
绑定注解获取参数
/**
* 通过HttpServletRequest接收
* @param request
* @return
*/
@RequestMapping(value = "/addByHttpServletRequest", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})
@ResponseBody
public String addUserByHttpServletRequest(HttpServletRequest request){
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
logger.debug("name:" + name + ",pwd:" + pwd);
return "name:" + name + ",pwd:" + pwd;
}
XSS漏洞审计流程
(1)通过熟悉代码后快速全局搜索是否存在”XSS”,”xssFilter”,以及是否含有对常见的js标签进行黑名单过滤的工具,如果没有,则大概率的情况下是没有进行XSS漏洞的防御。 (2)如果发现了存在基于黑名单过滤特殊字符,要去评估黑名单是否完整,也就是说是否基本覆盖了常见的危险字符。否则会造成绕过的风险,一般情况下这种修复手段不建议使用(第一存在被绕过的可能性,第二就是过滤请求参数不全面(在没有全局配置过滤器Filter的情况)) (3)如果配置了全局式的XSS过滤器,需要确定过滤器是否正常开启,否则形同虚设。(4)对于XSS漏洞,存在情况1:一般是全站式XSS,往往是因为开发时完全没有考虑到对所有的参数进行防御。情况2:拥有一定的安全经验和以前被披露过XSS漏洞,通过自己的工具仅仅解决了部分参数的XSS漏洞,这种情况也是不完整的(可能配置了全局过滤器,但是防御范围仅仅局限于某些参数,而非所有前端可控的参数)
案例1:market
进入项目全局搜索XSS。发现就这么单独的一行字,并没有做什么过滤
接下来去库存页面随意新增一个商品,输入xss代码,通过抓包看到路由指向
接着在idea里使用全局搜索该路由,可以跟踪我们输入商品。
并没有做任何过滤,因此存在存储型xss漏洞。
案例2:汽车租赁
仍然全局搜索发现没有xss过滤器的踪迹,所以应该是全面敞开了。
随意的填写一个
一点干货
其实这个复现的过程和结果都一目了然,主要是跟着断点熟悉了spring项目的运行结构。
controller层接收前端输入信息并给予响应(是否前后端连接上了),然后controller层将信息参数传给service处理;
service封装了一些业务并能调用dao层的api,service层也有很多接口和实现类,实现类调用方法可以操作dao层;
dao层能够对单表或多表实现增删改查。
dao层还要将增改查的结果返回service层
service层再将结果传给controller层
controller层再将信息传给前端
原文始发于微信公众号(芸潘):java审计之xss漏洞审计
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论