进入./admin/index.php
可以看到第一行就包含了当前目录下的core.php
文件,我们进入这个文件看看
这是core
文件的不完整截图,但是仅仅只看这 47 行就足够了,我们来分析一下,
第一行是关闭错误,第五行包含核心文件,第 8 行包含配置文件,第 11,14 行实例化控制器和帮助类,第 17 行到 26 行是从cookie
或者session
获取登陆之后的身份,第 28 行到 47 行是一个判断和检测的过程,首先判断$account
不等于null
,随后将获取到的身份信息进行 base64 解码,带入数据库查询,因为他这里采用了预编译所以不存在 sql 注入,接着将查询到的内容放入$name
中,然后判断$name[‘u_name’]
是否设置,如果设置则判断$index_session
是否等于null
,如果等于,就重新将这个session
赋值,所以我们一次越权就足够了,后面都不用经过 burp 抓包放包。
漏洞复现:
首先我们将参数名sem-cms_manager_index
和账号 admin 进行 base64 加密,然后再 cookie 中以键值对的方式放到 cookie 中(base64(参数名)=base64(admin)),加密后如下:c2VtLWNtc19tYW5hZ2VyX2luZGV4=YWRtaW4=这就是我们要放入 cookie 中的值
开启代理,接着开启 burp
我们现在来访问 http://localhost/admin/index.php,抓到如下的包
在最后加上我们构造的c2VtLWNtc19tYW5hZ2VyX2luZGV4=YWRtaW4=
我们将包放出去,看看页面
完全 ok 的,我们关闭代理,现在已经存在session
了,不用每次都截取
修复方案:
不要从外部获取参数,这样比较危险,移除获取cookie
,只用session
,如果坚持使用cookie
的话,建议使用更复杂的加密获取账号密码来验证,这样将无法越权。