代码审计之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等方面的东西。
