java审计之xss漏洞审计

admin 2023年3月8日09:43:51评论33 views字数 3154阅读10分30秒阅读模式

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");
  1. 使用Structs2框架

通过action类绑定参数或model获取前端的参数

java审计之xss漏洞审计
image-20220622165226647

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。发现就这么单独的一行字,并没有做什么过滤

java审计之xss漏洞审计
image-20220622172102990

接下来去库存页面随意新增一个商品,输入xss代码,通过抓包看到路由指向

java审计之xss漏洞审计
image-20220622202435168

接着在idea里使用全局搜索该路由,可以跟踪我们输入商品。

java审计之xss漏洞审计
image-20220622202442248

并没有做任何过滤,因此存在存储型xss漏洞。

案例2:汽车租赁

仍然全局搜索发现没有xss过滤器的踪迹,所以应该是全面敞开了。

随意的填写一个

java审计之xss漏洞审计
image-20220622205532262
java审计之xss漏洞审计
image-20220622205543889
java审计之xss漏洞审计
image-20220622205953486

一点干货

其实这个复现的过程和结果都一目了然,主要是跟着断点熟悉了spring项目的运行结构。

controller层接收前端输入信息并给予响应(是否前后端连接上了),然后controller层将信息参数传给service处理;

service封装了一些业务并能调用dao层的api,service层也有很多接口和实现类,实现类调用方法可以操作dao层;

dao层能够对单表或多表实现增删改查。

dao层还要将增改查的结果返回service层

service层再将结果传给controller层

controller层再将信息传给前端


原文始发于微信公众号(芸潘):java审计之xss漏洞审计

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年3月8日09:43:51
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   java审计之xss漏洞审计http://cn-sec.com/archives/1245076.html

发表评论

匿名网友 填写信息