代码审计之request.getParameter和request.getAttribute

1,前言

最近审计的java项目基本上都会用到request.getParameter和request.getAttribute,报的问题基本上就一个,就是跨站。

2,介绍

字面理解request.getParameter是获取请求参数,request.getAttribute是获取请求属性。先说request.getParameter,它可以获取get和post提交的参数,跨站问题在于它直接获取了用户可控的某个参数。

存储跨站例如用户更新资料,后台使用request.getParameter获取用户提交的参数然后进行了数据库存储。反射跨站例如搜索功能,页面要显示搜索的关键字,使用了request.getParameter。

这里举一个最简单的反射例子,下面是一个jsp页面,用来获取test参数的值,存储同理。

<%@ page language="java"  contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD  HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type"  content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
         <%=request.getParameter("test")  %>
</body>
</html>

request.getAttribute用来获取属性的值,这个属性需要提前用request.setAttribute来设定,相当于设置了一个变量并赋值。

当setAttribute设置的值可控时,就会有跨站风险,而getAttribute获取值时没有过滤等措施,也会有跨站风险。这种方式传值很多,例如用户注册提交信息、更新信息、向服务器提交一些资料等,都可以用这种方式来接收。

例如1.jsp设置了username的值,然后给到2.jsp来接收。示例代码如下。

<%@ page language="java"  contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD  HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type"  content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
         <%
                   String  username=request.getParameter("username"); 
                   request.setAttribute("username",username); 
         %>
         <jsp:forward  page="2.jsp" />
</body>
</html>
<%@ page language="java"  contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD  HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type"  content="text/html; charset=ISO-8859-1">

<title>Insert title here</title>

</head>

<body>

         <%=  request.getAttribute("username") %> 

</body>

</html>

3,区别

request.getParameter一般用来获取页面的参数值,例如GET、POST请求,request.getAttribute可用来获取对象,可获取servlet传来的值等。

4,总结

request.getParameter和request.getAttribute基本都会使用到,造成问题归根结底还是数据可控没有过滤,审计时追踪参数的传输过程即可。


分享关于信息搜集、Web安全、内网安全、代码审计、红蓝对抗、Java、Python等方面的东西。

经验分享 程序员 微信小程序 职场和发展