因为他的session的机制是从 【数据库中取出 存入的】,所以有个注入点就可以操控他的session了。
在 front_class.php 1509 - 1522行中
session类,一些初级的操作。
构造函数中370行
因为有__autoload所以会自动载入文件.
这个功能就是将session数据存储到数据库。
可以参考官网给的解释。
在这个类的构造函数中
session_start();
就打开了session,所以会依次执行下面的open read write close
read返回的是 :参见上面的说明 和serialize() 函数很相似,但是不是相同的。
这里流程差不多说完了.
------------------------
下面就是漏洞的地方
在 tool_act.php 184行 uploadfile_action中
这是一个上传的功能 其中有这样一条代码
在200行
checkstr函数 似乎是检查上传内容有没有一些危险代码吧。我们进去看看。
front_class.php 673行
在573行
说明一下 write 流程是这样的 如果传入的 PHPSESSID 在表中没有记录的话就会插入一条记录
插入的
$sql = "INSERT INTO {$this->_prefix}sessionox (PHPSESSID, update_time, client_ip, data) VALUES ('$id','$time','$this->_ip','$data')";
这样的,不能任意操作data列的数据。列都定死了。
如果里面有记录的话就会update
UPDATE {$this->_prefix}sessionox SET update_time='$time',data='$data' WHERE PHPSESSID = '$id'";
我们可以闭合单引号,来达到任意写session数据的目的。
---------------------------------------------------
现在来闭合单引号 front::flash(print_r($match,true));
用了print_r把所有的结果全部打印出来传给flash
输入<script> 匹配的好几个结果.
进入数据库是这样的(我这个是session表里已经有记录了的,没有记录的可以先请求一次<script>这个然后就有记录了。)因为他会把原先的数据会融合在一起的。
我研究了一下了
<script*/',DATA=111, client_ip=/*>
这样就可以闭合单引号了。
sql日志:
现在我们只需要按照他的格式来写入DATA列里就可以了
他这个格式和 serialize相似
session的名字 |隔开 s 字符串 124长度 xxxx值 ;结束
message|s:4:"xxxx";
------------------
找了个地方可以直接注册管理员 或提升管理员 做个演示把。
在user_act.php respond_action函数中
这个$classname = front::$get['ologin_code']; 也就是等于 $_GET['ologin_code']
我们可以直接把 groupid这个数组覆盖掉 因为 session::get('openid')已经可以控制的。
【这里插一句,之前没发现这个漏洞的时候我看到这里 发现了这个问题,之前的想法是 把password覆盖掉,因为session::get('openid')值是空的,注册成功后 所以底下会有个setcookie的地方。password 会被加密掉 加密方式就是 md5($_password.config::get('cookie_password'))
这个 因为 我们的密码是空的 ,所以获得了 config::get('cookie_password')密码的md5值。
而这个 cookie安全码是这样获得 config::modify(array('cookie_password' => md5(rand() . time())));
rand+安装时间。测试了 在windows下rand()生成的数字是不大于32768的.(自己在kail下测试生成的数非常大。。。)但是这样前提是知道安装时间才行..暴力破解的话 (一秒钟就需要3万条。)数量太大了。寻找安装时间,只能通过保存快照的一些网站入手了,但是这个效果不理想.(得到cookie安全码就可以注射。)】
(ps 下这里下面还有个登录的地方也是可以的
)
---------------------------------------------------------------------------
。
先让你的sessiono里有数据存入,我演示就用新的sessionid把
数据库里已经有了
然后在写入我们的session数据
openid|s:1:"2"; 转换成hex,好了提交成功了
然后我们在来注册。
(我先把我的新的session换上去)
**.**.**.**/cmseasy/index.php?case=user&act=respond&ologin_code=groupid
POST提交
regsubmit=1&username=test_Noxxx&password=test_Noxxx
提交了自动转跳了 ,
看看数据库里
好了 ,直接能登录后台
这个更改附件类型 应该可以直接上传php文件吧。
【附上POST包】: