访问控制----垂直、水平权限攻击,攻击以及解决方案

目录

Vertical Access Control

代码示例

攻击方法

解决方案

Horizontal Access Control

安全威胁

代码示例

攻击实例

解决方案

常见问题


Vertical Access Control

Vertical Access Control ,垂直权限安全攻击,也就是权限提升攻击。
由于 web 应用程序没有做权限控制,或仅仅在菜单上做了权限控制,导致的恶意用户只要猜测其他管理页面的 URL ,就可以访问或控制其他角色拥有的数据或页面,达到权限提升目的。
这个威胁可能导致普通用户变成管理员权限。

代码示例

一个仅仅做了菜单控制的代码:
管理个人信息
<%if (power.indexOf("administrators")>-1){%>
管理所有用户
<%}%>

攻击方法

恶意用户,可以直接猜测“管理所有用户”的页面,通过 URL 访问,看到管理员页面。

解决方案

在打开管理页面 URL 时,首先判断当前用户是否拥有该页面的权限,如果没有权限, 就判定为“权限提升”攻击,同时记录安全日志。
建议使用成熟的权限框架处理权限问题,比如 spring security

Horizontal Access Control

安全威胁

Horizontal Access Control ,访问控制攻击,也就是水平权限安全攻击。
Web 应用程序接收到用户请求,修改某条数据时,没有判断数据的所属人,或判断数据所属人时,从用户提交的 request 参数(用户可控数据)中,获取了数据所属人 id , 导致恶意攻击者可以通过变换数据 ID ,或变换所属人 id ,修改不属于自己的数据。
恶意用户可以删除或修改其他人数据。

代码示例

访问数据层(dao),所有的更新语句操作,都可能产生这个漏洞。
以下代码存在这个漏洞, web 应用在修改用户个人信息时,从从用户提交的 request 参数(用户可控数据)中,获取了 userid ,执行修改操作。
修改用户个人信息页面
username: <%=rs.getString("name")%>
passwd: ">
type: <%=rs.getString("type")%>
realname: ">
email: ">
tel: ">
表单中,将用户的 useird 作为隐藏字段,提交给处理修改个人信息的应用。
下面代码是修改个人信息的应用
int userid=Integer.valueOf( request.getParameter("userid"));
String email=request.getParameter("email");
String tel=request.getParameter("tel");
String realname=request.getParameter("realname");
String pass=request.getParameter("pass");
JdbcConnection conn = null;
try {
conn = new JdbcConnection();
Object[] params = new Object[5];
params[0] = email;
params[1] = tel;
params[2] = realname;
params[3] = pass;
params[4] = userid;
final String sql = "update user set email=?,tel=?,realname=?,pass=? where userid=?";
conn.execUpdate(sql,params);
conn.closeConn();
这段代码是从 request 的参数列表中,获取 userid ,也就是表单提交上来的 userid , 之后修改 userid 对应的用户数据。
而表单中的 userid 是可以让用户随意修改的。

攻击实例

攻击者通常在修改数据时,变化数据的 id ,如果存在这个漏洞,就可以修改成功。
如果“代码示例”中的代码,是 alibaba.com 下的一个 web 应用程序。
攻击者通过一个浏览器插件,拦截提交的数据,并修改了这个数据,如下图:
访问控制----垂直、水平权限攻击,攻击以及解决方案_第1张图片

修改后,提交,即可修改userid所对应的其他用户的数据。

这个例子是判断了所属人,但是却从“用户可控数据”中,获取了所属人。还有一种形式是没有判断所属人,直接修改数据。

解决方案

从用户的加密认证cookie中,获取当前用户的id,并且需要在执行的SQL语句中,加入当前用户id作为条件语句。由于是web应用控制的加密算法,所以恶意用户无法修改加密信息。

示例代码:

int userid=Integer.valueOf( GetUseridFromCookie(request));
String email=request.getParameter("email");
String tel=request.getParameter("tel");
String realname=request.getParameter("realname");
String pass=request.getParameter("pass");
JdbcConnection conn = null;
try {
	conn = new JdbcConnection();
	Object[] params = new Object[5];
	params[0] = email;
	params[1] = tel;
	params[2] = realname;
	params[3] = pass;
	params[4] = userid;
	final String sql = "update user set email=?,tel=?,realname=?,pass=? where userid=?";
	conn.execUpdate(sql,params);
	conn.closeConn();

代码中通过GetUseridFromCookie,从加密的COOKIE中获取了当前用户的id,并加入到SQL语句中的WHERE条件中。

常见问题

并不是所有的语句都有这个漏洞,有些是定时任务,或后台管理员执行的,这些必须和开发人员一一确认。

你可能感兴趣的:(安全,网络)