emlog官方的“反垃圾评论”插件(感觉70%以上的人在用,因为内核代码里没有垃圾评论的处理,要处理垃圾评论只有用插件),未对某处xss进行过滤导致直接打管理员cookie。

代码如下:

<?php while($res = $DB->fetch_array($query)): $ishide = $res['hide']=='y'?'<font color="red">[待审]</font>':''; $mail = !empty($res['mail']) ? "({$res['mail']})" : ''; $ip = !empty($res['ip']) ? "<br />IP:<a href=\"./plugin.php?plugin=anti_spam_comment&advance=true&ip={$res['ip']}\">{$res['ip']}</a>" : ''; $url = !empty($res['url']) ? "({$res['url']})" : ''; $res['content'] = str_replace('<br>',' ',$res['comment']); $sub_content = subString($res['content'], 0, 50); $res['title'] = subString($res['title'], 0, 42); ?> <tr> <td><input type="checkbox" value="<?php echo $res['cid']; ?>" name="com[]" class="ids" /></td> <td><a href="./plugin.php?plugin=anti_spam_comment&advance=true&act=edit&cid=<?php echo $res['cid']; ?>" title="<?php echo $res['content']; ?>"><?php echo $sub_content; ?></a> <?php echo $ishide; ?> <br /><?php echo smartDate($res['date']); ?> <span style="display:none; margin-left:8px;"> <a href="javascript: asc_confirm(<?php echo $res['cid']; ?>, 'name');">屏蔽内容</a> <a href="javascript: asc_confirm(<?php echo $res['cid']; ?>, 'url');">删除地址</a> </span> </td> <td><a href="./plugin.php?plugin=anti_spam_comment&advance=true&poster=<?php echo urlencode($res['poster']);?>"><?php echo htmlspecialchars($res['poster']);?></a> <?php echo $url; ?> <?php echo $ip;?> <?php echo $mail;?></td> <td><a href="./plugin.php?plugin=anti_spam_comment&advance=true&gid=<?php echo $res['gid']; ?>"><?php echo $res['title']; ?></a></td> </tr> <?php endwhile; ?>

数据库中取出评论内容$res['comment'],$sub_content取前50个字符就直接输出了。而且插入数据库时也未进行数据处理:

emlog官方插件导致xss可打管理员cookie

直接导致执行javascript:

emlog官方插件导致xss可打管理员cookie

可打cookie:



emlog官方插件导致xss可打管理员cookie


emlog官方插件导致xss可打管理员cookie

使用该cookie可以直接登录后台。

修复方案:

echo htmlspecialchars($sub_content);