Web安全之权限攻击

权限攻击可以分为水平权限攻击和垂直权限攻击。


水平权限攻击

水平权限攻击,也叫作访问控制攻击。Web应用程序接收到用户请求,修改某条数据时,没有判断数据的所属人,或者在判断数据所属人时从用户提交的表单参数中获取了userid。导致攻击者可以自行修改userid修改不属于自己的数据。所有的更新语句操作,都可能产生这个漏洞。

攻击

我们来看看攻击案例,Web应用在修改用户个人信息时,从用户提交的表单中获取userid,执行修改操作:

<form action="/struts1/edituser.htm" method="post">
    <input name="userid" type="hidden" value="<%=userid%>">
       <table border="1">
        <tr>
        <td>username:</td>
        <td><%=rs.getString("name")%></td>
        </tr>
        <tr>
        <td>passwd:</td>
        <td> <input name="pass" value="<%=rs.getString("pass")%>"></td>
        </tr>
        <tr>
        <td>type:</td>
        <td><%=rs.getString("type")%></td>
        </tr>
        <tr>
        <td>realname:</td>
        <td><input name="realname" value="<%=rs.getString("realname")%>"></td>
        </tr>
        <tr>
        <td>email:</td>
        <td> <input name="email" value="<%=rs.getString("email")%>"></td>
        </tr>
        <tr>
        <td>tel:</td>
        <td> <input name="tel" value="<%=rs.getString("tel")%>"></td>
        </tr>
</table>
<html:submit/>
</form>

表单中,将用户的userid作为隐藏字段,提交给处理修改个人信息的应用。
下面是修改个人信息的后台代码:

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();

这段代码从表单参数列表中获取userid,修改userid对应的用户数据。
攻击者可以随意修改表单的userid:

这里写图片描述
修改userid后,提交表单,就可能修改了其他用户的数据。

防御

这种情况似乎很容易被忽略,包括我现在着手的一个项目也是才发现这样的一个问题。那么应该如何解决呢?其实也很容易。就是从用户的加密认证cookie中获取当前用户id,并且在执行的sql语句中加入当前用户id作为条件语句。由于cookie是加密的,所以攻击者无法修改加密信息。

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,并加入判断。


垂直权限攻击

垂直权限攻击又叫做权限提升攻击。其原理是由于Web应用没有做权限控制,或仅仅在菜单上做了权限控制,导致恶意用户只要猜测其他管理页面的URL,就可以访问或控制其他角色拥有的数据或页面,达到权限提升的目的。

攻击

我们来看看攻击案例,下面是一个仅仅做了菜单控制的代码:

<tr><td><a href="/user.jsp">管理个人信息</a></td></tr>
<%if (power.indexOf("administrators")>-1){%>
<tr><td><a href="/userlist.jsp">管理所有用户</a></td></tr>
<%}%>

攻击者只需要猜中管理所有用户的页面url就可以越权操作了。

防御

这种攻击很容易防御,只需要在每个页面的加载之前进行权限验证即可。一个普通的权限系统,菜单是通过数据库中对应权限和角色来进行字符串拼接形成的,而不是静态的通过在页面上进行权限判断决定的。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,我要强调一点:SQL注入攻击是非常危险的,可以导致数据泄露、系统瘫痪等严重后果。所以,在进行实验之前,请确保你正在使用的是测试环境而不是真实的生产环境。 下面是一个简单的实验,演示如何进行SQL注入攻击: 1. 准备工作 首先,需要准备一个测试环境。可以使用一些开源的Web应用程序,如DVWA (Damn Vulnerable Web Application) 或 bWAPP 等。这些应用程序都是专门设计用于测试和学习Web应用程序安全性的。 2. 确认存在漏洞 打开Web应用程序,尝试在输入框中输入一些SQL语句,看看是否可以成功执行。如果能执行,那么就说明这个应用程序存在SQL注入漏洞。 例如,在一个登录页面中,输入以下语句: ``` ' or 1=1-- ``` 如果能够登录成功,那么就说明存在SQL注入漏洞。这个语句的作用是将输入的用户名和密码均设置为1=1,这样就可以跳过正常的身份验证过程。 3. 获取数据 一旦确认存在SQL注入漏洞,就可以开始尝试获取数据了。下面是一个示例: 假设存在一个查询页面,可以根据输入的用户ID来查询用户的详细信息。在输入框中输入以下语句: ``` 1' or '1'='1 ``` 这个语句的作用是将查询条件设置为1=1,这样就会返回所有用户的详细信息。如果能够成功获取到数据,就说明攻击成功了。 4. 防范措施 为了防止SQL注入攻击,可以采取以下措施: - 使用参数化查询,而不是拼接SQL语句 - 对用户输入的数据进行严格的验证和过滤,防止恶意输入 - 限制数据库用户的权限,不要使用具有过高权限的账户连接数据库 总之,SQL注入攻击是一种非常危险的攻击方式,需要我们时刻保持警惕,并采取相应的防范措施。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值