0x1 漏洞分析
位置:/4.1.190209/Lib/Lib/Action/Home/ForumAction.class.php
line 71~107
public function update(){
$post = $_POST;
$post['forum_cookie'] = md5('forum_'.intval($post['forum_sid']).'_'.intval($post['forum_pid']).intval($post['forum_uid']).'_'.intval($post['forum_cid']));
//报错取消验证
if($post['forum_sid'] == 24){
D("Forum") -> setProperty("_validate", '');
}
//写入数据库
$info = D("Forum")->ff_update($post);
if($info){
$email_type = '';
if( $info['forum_sid'] == 5 ){
if( C('user_email_guestbook') ){
$email_type = '留言';
}
}elseif( $info['forum_sid'] == 24 ){
if( C('user_email_error') ){
$email_type = '报错';
}
}else{
if( C('user_email_forum') ){
$email_type = '评论';
}
}
if( $email_type ){
D("Email")->send(C('site_email'), '站长您好', '收到用户('.$info['forum_uid'].')的'.$email_type, $info['forum_content']);
}
//返回状态
if (C('user_check')) {
$this->ajaxReturn($info, "谢谢,我们会尽快审核你的发言!", 201);
}else{
$this->ajaxReturn($info, "感谢你的参与!", 200);
}
}else{
$this->ajaxReturn('', D("Forum")->getError(), 0);
}
}
先来看下流程:
- 先获取了
post
传输过来的数据 - forum_cookie是获取传入过来的forum的各种id参数并且是强制int和md5加密的
- 接下来进行了写入到数据库操作跟进
D("Forum")->ff_update()
方法 - 获取返回值根据返回值的确定进行了什么操作
- 最后返回状态
跟进Lib/Lib/Model/ForumModel.class.php
中的ff_update()
方法
这里只是进行了数据的添加具体数据库,ForumModel
继承了RelationModel
,会先验证传入的数据是否满足要求
问题出现在了
array('forum_ip','get_client_ip',1,'function'),
这里 没有对
继续跟进 get_client_ip
位置/Lib/Common/common.php
Line 2703~2715
function get_client_ip(){
if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
$ip = getenv("HTTP_CLIENT_IP");
else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
$ip = getenv("REMOTE_ADDR");
else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
$ip = $_SERVER['REMOTE_ADDR'];
else
$ip = "unknown";
return($ip);
}
这里我们那可以控制HTTP_X_FORWARDED_FOR
而且没有对数据进行过滤或者验证处理
0x02 漏洞利用
首先注册一个用户,跳转到留言页面添加留言
拦截数据包 增加payload到X-Forwarded-For
可以看到可以控制的是两个地方但是只能输入20个字符 所以尝试使用分段突破字符限制
因为这个评论内容是顺序排列的所以payload分为三次提交:
*/</script><!--
*/alert(1);/*
<script>/*
这时打开后台管理跳转到评论页面就会自动弹出
至于怎么偷取cookie 自行使用js的各种拼接创建元素就可以了
点击收藏 | 0
关注 | 1
打赏