审计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去取