审计7 水平越权

Posted 一手重锤

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了审计7 水平越权相关的知识,希望对你有一定的参考价值。

 1 <?php
 2 include_once(\'../sys/config.php\');
 3 if (isset($_POST[\'submit\']) && !empty($_POST[\'username\']) ) {
 4 
 5     if (strlen($_POST[\'username\'])>16) {
 6         $_SESSION[\'error_info\'] = \'用户名過長(用戶名長度<=16)\';
 7         header(\'Location: edit.php\');
 8         exit;
 9     }
10 
11     $clean_username = clean_input($_POST[\'username\']);
12     $clean_user_id = clean_input($_POST[\'id\']);
13     
14     //判断用户名已是否存在
15     $query = "SELECT * FROM users WHERE user_name = \'$clean_username\'";
16     $data = mysql_query($query, $conn);
17     if (mysql_num_rows($data) == 1) {
18         $_SESSION[\'error_info\'] = \'用户名已存在\';
19         header(\'Location: edit.php\');
20         exit;
21     }
22     
23     $query = "UPDATE users SET user_name = \'$clean_username\' WHERE user_id = \'$clean_user_id\'";
24     mysql_query($query, $conn) or die("update error!");
25     mysql_close($conn);
26     //刷新缓存
27     $_SESSION[\'username\'] = $clean_username;
28     header(\'Location: edit.php\');
29 }
30 else {
31     not_find($_SERVER[\'PHP_SELF\']);
32 }
33 ?>

首先在./user/edit.php中看见名字为

搜索关键字  username 找到  ../sys/config.php  在11行和12行直接把user 和 id 读出来直接赋值带入数据库

而且没有做任何的过滤

在23行$query = "UPDATE users SET user_name = \'$clean_username\' WHERE user_id = \'$clean_user_id\'";

发现他直接可以更新用户的用户名,而且用户id可控,也就是说可以修改任意id的用户名,并且查询用户资料。

构造pyload:

首先 需要三个参数   $_POST[\'submit\']    $_POST[\'username\']   $_POST[\'id\']

post 给updateName.php

首先观察到用户  id为10的用户名字为shuaibi

我目前的用户为root   id为8

submit的值可以为任意数,只要设定了就好

构造post参数  越权修改id为10的用户名字

可以发现此时我已经以hankbay的身份登录

查看数据库:

id为10的用户姓名已被我修改。

修复:需要在

user_id = \'$clean_user_id\'";的地方修改为在ssion里去取,而不是直接post去取

 

以上是关于审计7 水平越权的主要内容,如果未能解决你的问题,请参考以下文章

19-PHP代码审计——jizhicms逻辑漏洞分析(由越权引发的sql注入)

pikachu靶场-垂直/水平越权

web安全逻辑越权水平垂直&Burp插件项目

业务安全-02业务逻辑漏洞之越权操作

干货文章学点高级测试工程师才懂的技术:手把手教你进行越权测试

代码审计常见场景之CSRF与变量覆盖