«

emlog 6.0特别版的BUG些

时间:2020-10-21 16:49     作者:admin     分类: emlog


声明:本文仅供爱好者折腾参阅,且由于我这是我很久之前的手记,如有遗漏,表意不明的请多包涵。

一点关于安装出现错误编号2002的可能办法:

emlog_mysql_error_2002.png 

emlog_install.png

第一个就是发文章标签打不上之数据库标签表 emlog_tag

emlog5.3.1升级过来或者是自己瞎折腾后发现发文章标签打不上或者没了的多半是这个原因。


gid 的值 开头和结尾必须是 英文逗号 不然 问的标签 不能存入 且已经存在的会有一几率 不显示 类似这样的数据:

mysql> select * from emlog_tag;
+-----+-----------+-------+
| tid | tagname   | gid   |
+-----+-----------+-------+
|   1 | 标签1   | 1,2,  |
|   2 | 标签二 | ,1,2, |
|   3 | 测试三 | ,2,   |
+-----+-----------+-------+
3 rows in set (0.00 sec)

mysql> 

其中的 标签1 中包括的文章 都不会显示 标签1

经过查看标签源码tag_model.php 文件可以看到 在获取 添加 更新的 SQL语句均有添加 英文逗号在 gid 之前:

$query="INSERT INTO ".DB_PREFIX."tag (tagname,gid) VALUES('".$tagName."',',$blogId,')";

所以修改办法也很简单两种,把所有涉及到加逗号的改成没有前逗号,但是这种比较容易出事情

所以最好的办法是第二种,即修改数据库的tag表在最前面加上一个英文逗号即可。


一句mysql语句批量替换在 gid 字段值的头部添加逗号:

mysql> update emlog_tag set gid = concat(',',gid);
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0

mysql> select * from emlog_tag where tid >6;
+-----+---------+------+
| tid | tagname | gid  |
+-----+---------+------+
|   7 | 测试  | 3,2, |
+-----+---------+------+
1 row in set (0.00 sec)

mysql> update emlog_tag set gid = concat(',',gid) where tid >6;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from emlog_tag where tid >6;
+-----+---------+-------+
| tid | tagname | gid   |
+-----+---------+-------+
|   7 | 测试  | ,3,2, |
+-----+---------+-------+
1 row in set (0.00 sec)

mysql> 

你也可以直接替换首尾:

update emlog_tag set gid = concat(',',gid,',');

# 额外的相关 SQL 语句
删除开头第一个字符
update emlog_tag set gid=concat('',mid(gid,2,length(gid))) where tid=1;
删除末尾一个字符
update emlog_tag set gid=left(gid,char_length(gid)-1) where right(gid,1)=',';
替换之后查询下是否有重复的双引号标签:

mysql> select tid from emlog_tag where  gid like '%,,';
+-----+
| tid |
+-----+
|   8 |
|  28 |
|  35 |
|  53 |
| 283 |
+-----+
5 rows in set (1.23 sec)

mysql> update emlog_tag set gid = replace(gid,',,',',') where gid like '%,,';
Query OK, 5 rows affected (0.96 sec)
Rows matched: 5  Changed: 5  Warnings: 0

mysql> select tid from emlog_tag where  gid like '%,,';
Empty set

mysql> 
你也可以全部写在一条命了里面,判断首尾是否是逗号,如果不是就更新加入逗号。
自己可以使用where来限制范围 测试一下,没问题在全部更新,切记所有操作之前备份数据!!!
同时 修复默认模板的 文章阅读页面的字数统计,增加编码检测,不然字数就是按照系统内部的编码来统计,不准确,这里使用 'utf-8' ,对于中英文相对更准确。
同时过滤 html编码内容:
<?php echo mb_strlen(preg_replace(array("'<(.*?)>'is","'&nbsp;'","'\n\r'","' '","'\r'","'\n'"),'',$log_content),'UTF-8');?>
BUG 二 默认模板的单独页面page 评论 重复显示
<?php blog_comments($comments); ?>
<?php blog_comments_post($logid,$ckname,$ckmail,$ckurl,$verifyCode,$allow_remark); ?>
<?php blog_comments($comments); ?>

删掉 多余的一个 即可

BUG 三 微语 浏览页面(包括前后台加模板的微语,且6.0.1 一样存在) 解析 html 代码 导致 储存型XSS(入库储存)

em60_xss.png

是因为 在输出的时候 没有转义

admin/views/twitter.php 第76行:

<?php echo $val['t'];?> <br/><?php echo $img;?>
可以看到 没有经过转义 就直接输出 造成 xss
只需要加上一个 htmlspecialchars()函数 即可
<?php echo htmlspecialchars($val['t']);?> <br/><?php echo $img;?>

图片也是可以 xss 的 如果 我们post的是 类似这样的内容 (目前 6.0版本没有图片上传 但是预留 6.0.1有完整的功能 可以上传 发表带 图片的 微语):

em60+601_twitter_content_img_xss.png

t=+%3Asmile%3A++123132&img=x" onerror='alert(1)';
那么 就会触发 XSS

图片的话 就只需要调用 URL 不用输出完整的 标签 且 URL 判断是否合规 不合规的不能入库 输出拼接的时候再进行 过滤再拼接输出成图片标签。

$img = empty($val['img']) ? "" : '<a title="'.langs('view_image').'" href="'.BLOG_URL.str_replace('thum-', '', $val['img']).'" target="_blank"><img style="border: 1px solid #EFEFEF;" src="'.BLOG_URL.$val['img'].'"/></a>';
替换
$img = empty($val['img']) ? "" : '<a title="'.langs('view_image').'" href="'.BLOG_URL.str_replace('thum-', '', $val['img']).'" target="_blank"><img style="border: 1px solid #EFEFEF;" src="'.BLOG_URL.htmlspecialchars($val['img']).'"/></a>';
至于 图片的路径名称的合法性 需要在 twitter_model.php 入口处addTwitter 添加微语的功能处审核。

twitter_model.php 还有一处 XSS :

<?php echo $row['content']?>
<?php echo htmlspecialchars($row['content'])?>
BUG 四 微语不能入库储存

原因是在twitter_model.php的function formatTwitter($t) {} 函数的 替换有问题,导致替换后的输入内容为空了。。。
暂时不替换 直接入库
为了安全 可以考虑 使用
htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体
strip_tags() 函数剥去字符串中的 HTML、XML 以及 PHP 的标签
// $input = strip_tags($input);  // 清除标签内容
原函数修改为:

function formatTwitter($t) {
        //识别URL
        // $t = htmlspecialchars(preg_replace("/\/\/[\w-.?\/=&%:]*/i", "[+@] href=\"\$0\" target=\"_blank\"[@+]\$0[-@+]", $t), ENT_NOQUOTES);
        // $t = str_replace(array('[+@]','[@+]','[-@+]'), array('<a','>','</a>'), $t);
        $t=strip_tags($t);
        $t=htmlspecialchars($t);
        return $t;
    }
参考:https://learnku.com/articles/32529
在线PHP沙盒调试:https://sandbox.onlinephpfunctions.com/

初略统计 这么多 肯定有遗漏 建议 不允许 微语回复 !

BUG 五 默认模板首页的最新评论跳转链接 缺少 comment- 导致不能定位
module.php 修改最新评论处的 URL

$url = Url::comment($value['gid'], $value['page'], 'comment-'.$value['cid']);

标签: 代码 漏洞 php emlog 代码审计

版权所有:Mrxn's Blog
文章标题:emlog 6.0特别版的BUG些
除非注明,文章均为 Mrxn's Blog 原创,请勿用于任何商业用途,转载请注明作者和出处 Mrxn's Blog

扫描二维码,在手机上阅读
评论:
avatar
Secret 2021-01-25 16:50
这篇文章似乎触发了这个主题的 BUG,侧边栏跑到底部来了。
avatar
寒星皓月 2021-01-20 11:05
温馨提示下:博主你网站的侧边栏在发表评论下方显示。
avatar
寒星皓月 2021-01-20 11:03
我使用的是emlog6.0.1也有好多bug :
1.编辑文章 点击保存草稿时,“版权设置”、“转载地址”保存不成功
2.编辑文章页面 勾选允许评论,在“保存草稿”或“保存”之后批量发布草稿后,文章评论模块失效
3.在程序后台评论管理中管理员进行回复评论,提交出现白屏问题

希望博主未来也会出下解决教程
avatar
tishang 2020-10-23 19:11
现在很少人用了吧 自从被那多说了之后
commentator
Mrxn 2020-10-23 19:12
@tishang: 是的 少数人在用