emlog代码审计(复现)
SQL注入漏洞
文件admin/comment.php
漏洞验证
删除来自该ip的所有评论这里

删除抓包,单引号致使报错,sqlmap直接跑就可以

漏洞代码
这款cms的转义方式如下


漏洞代码如下
首先判断action==delbyip,检查token,防止csrf,判断权限。如果都正常,获取get类型的ip传参,传入delcommentbyip,追踪这个函数。

直接把ip变量传入到了sql中,执行查询语句,因此这里可以使用单引号闭合,注释来进行sql注入攻击

文件上传漏洞
文件位置:admin/plugin.php
首先确定action变量等于upload_zip参数,检查token,获取files的参数,然后判断失败,使用getFileSuffix方法获取文件后缀。接着emunzip解压文件,跟踪emunzip这个函数

这里调用了一个PHP的ZipArchive类,它是用来压缩文件的
说明文档
https://blog.csdn.net/luoluozlb/article/details/72853885
在这里调用open方法打开一个zip文件,如果不得与true,返回文件权限的问题
if (@$zip->open($zipfile) !== TRUE) {
return 2;//文件权限问题
}
接着在这里使用explode函数,用’/’当作分割符,把字符串分割为数组形式
GetNameIndex方法使用索引返回一个文件,如果为0,则读取整个条目
$r = explode('/', $zip->getNameIndex(0), 2);
在$dir这里检测$r[0]存在,如果存在,在末尾添加一个’/’
然后switch分支,由于传过来的$type为plugn,所以进入case ‘plugn’这里
首先使用substr提取字符串,调用getFromName方法使用文件名返回文件内容,判断是否与文件夹名称相同的php文件
最后getfromname做的就是(shell/shell.php)把我传入的内容获取

把一个shell文件,放入shell文件夹下,解压成zip文件,上传


上传成功后会在src/content/plugins/shell下

文件备份拿shell
首先看一下源码,首先判断权限,获取files信息,在这里获取文件名的后缀,解压文件

这里dirname获取临时文件名的路径名称拼接上,用str_replace替换之后的sql文件。
然后检查备份文件头的信息,执行sql命令,更新缓存的操作。这里没有检查是否对文件进行了修改,增加恶意代码的操作


在admin/data.php目录下备份文件之后,打开sql文件,增加如下内容
设置了 general_log 和 general_log_file 之后所有SQL记录都会写入指定的文件,所以可以通过这种方法将php语句写到log中
set global general_log='on';
SET global general_log_file='E:/phpstudy/WWW/CodeAudit/emlog_6.0.0/eval.php';
SELECT '<?php phpinfo();?>';

然后导入本地备份,会在这个目录下生成一个php文件


存储型xss
文件在这里admin/link.php
首先获取我们输入的信息,通过addslashes转义(addslashes() 函数返回在预定义字符之前添加反斜杠的字符串),然后判断了sitename和siteurl为空,接着正则匹配,只能输入开头为http或ftp。然后带入addlink方法,跟踪addlink方法

Addlink方法传入4个参数,判断taxis大于30000或taix小于0。
然后执行sql语句,插入到数据库中

接下来看输出的代码
当action为空的时候,首先去调用getLinks方法

getLinks方法首先去数据库查询数据给了$res,然后通过while循环把数组结果放入links
循环体的内容,把sitename名称这里使用了转义函数,description描述,这里使用了htmlclean设置过滤及保留属性,而siteurl地址这里没有做任何处理,直接返回到页面当中

因为使用addslashes函数虽然会转义’”符号,但是不会把转义过的字符串插入数据库中,从数据库中取出数据的时候一样会导致xss漏洞
“><script>alert(1)</script>


浙公网安备 33010602011771号