首页 > 代码库 > 审计7 水平越权

审计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 水平越权