审计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注入)