网络安全Java代码审计实战
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.3.1 XSS常见触发位置

XSS漏洞产生后必然会有相关的输入/输出,因此我们只需快速找到这些输入/输出点,即可快速地进行跟踪发现漏洞。输入在Java中通常使用“request.getParameter(param)”或“${param}”获取用户的输入信息。输出主要表现为前端的渲染,我们可以通过定位前端中一些常见的标识来找到它们,然后根据后端逻辑来判断漏洞是否存在。

1.JSP表达式

“<%=变量%>”是“<%out.println(变量);%>”的简写方式,“<%=%>”用于将已声明的变量或表达式输出到外网页中。

下面两种形式的写法实现的效果是相同的,都是将变量输出到网页中。形式一:

形式二:

通过“request.getParameter”获取msg传入的值,然后通过“<%=msg%>”将其输出到网页中。

2.EL

EL(Expression Language,表达式语言)是为了使JSP写起来更加简单。EL的灵感来自于ECMAScript和XPath表达式语言,它提供了在JSP中简化表达式的方法,使得JSP的代码更加简化。例如:“<%=request.getParameter("username")%>”等价于“${param.username}”。JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能,如图2-47所示。

图2-47 JSP标准标签库

1)<c:out>标签

<c:out>标签用来显示一个表达式的结果,与<%=%>作用相似,它们的区别是,<c:out>标签可以直接通过“.”操作符来访问属性,如下:

2)<c:if>标签

<c:if>标签用来判断表达式的值,如果表达式的值为true,则执行其主体内容:

3)<c:forEach>标签

<c:forEach>标签的作用是迭代输出标签内部的内容。它既可以进行固定次数的迭代输出,也可以依据集合中对象的个数来决定迭代的次数:

3.ModelAndView类的使用

ModelAndView类用来存储处理完成后的结果数据,以及显示该数据的视图,其前端JSP页面可以使用“${参数}”的方法来获取值:

4.ModelMap类的使用

Spring也提供了ModelMap类,这是java.util.Map实现的,可以根据模型属性的具体类型自动生成模型属性的名称:

5.Model类的使用

Model类是一个接口类,通过attribue()添加数据,存储的数据域范围是requestScope:

通过这些常见语法的总结我们不难归纳出一些常见的关键字,通过这些关键字可以快速地定位至具有前后端交互功能的代码片段: