emlog 6.0特别版的BUG些

2020-10-21 / 2 评论 emlog / Mrxn

本文共计 4005 字,感谢您的耐心浏览与评论.

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

一点关于安装出现错误编号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,',');

替换之后查询下是否有重复的双引号标签:

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']).'" rel="external nofollow"  rel="external nofollow"  target="_blank"><img style="border: 1px solid #EFEFEF;" src="'.BLOG_URL.$val['img'].'" rel="external nofollow" /></a>';
替换
$img = empty($val['img']) ? "" : '<a title="'.langs('view_image').'" href="'.BLOG_URL.str_replace('thum-', '', $val['img']).'" rel="external nofollow"  rel="external nofollow"  target="_blank"><img style="border: 1px solid #EFEFEF;" src="'.BLOG_URL.htmlspecialchars($val['img']).'" rel="external nofollow" /></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", "[[email protected]] href=\"\$0\" target=\"_blank\"[@+]\$0[[email protected]+]", $t), ENT_NOQUOTES);
		// $t = str_replace(array('[[email protected]]','[@+]','[[email protected]+]'), 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 代码审计

转载:转载请注明原文链接 - emlog 6.0特别版的BUG些


2条回应:“emlog 6.0特别版的BUG些”

  1. tishang

    现在很少人用了吧 自从被那多说了之后


发表评论

{view_code_no}