分类 安全研究 下的文章

由filter_var()函数引起的技术探讨

0x01 起因

最近在看PHP SECURITY CALENDAR 2017的题目,这是第二题

Day 2 - Twig

Can you spot the vulnerability?

// composer require "twig/twig"
require 'vendor/autoload.php';

class Template {
  private $twig;

  public function __construct() {
    $indexTemplate = '<img ' .
      'src="https://loremflickr.com/320/240">' .
      '<a href="{{link|escape}}">Next slide »</a>';

    // Default twig setup, simulate loading
    // index.html file from disk
    $loader = new Twig\Loader\ArrayLoader([
      'index.html' => $indexTemplate
    ]);
    $this->twig = new Twig\Environment($loader);
  }

  public function getNexSlideUrl() {
    $nextSlide = $_GET['nextSlide'];
    return filter_var($nextSlide, FILTER_VALIDATE_URL);
  }

  public function render() {
    echo $this->twig->render(
      'index.html',
      ['link' => $this->getNexSlideUrl()]
    );
  }
}

(new Template())->render();

这里考察的是XSS漏洞。对于XSS漏洞,大部分出现的地方在输出环节,如 echo $var; $var可控且无过滤,或者过滤不严格,导致了XSS漏洞的产生。

- 阅读剩余部分 -

由PHP SECURITY CALENDAR 2017引发的思考总结

0x01 起因

Day 1 - Wish List

Can you spot the vulnerability?

class Challenge {
  const UPLOAD_DIRECTORY = './solutions/';
  private $file;
  private $whitelist;

  public function __construct($file) {
    $this->file = $file;
    $this->whitelist = range(1, 24);
  }

  public function __destruct() {
    if (in_array($this->file['name'], $this->whitelist)) {
      move_uploaded_file(
        $this->file['tmp_name'],
        self::UPLOAD_DIRECTORY . $this->file['name']
      );
    }
  }
}

$challenge = new Challenge($_FILES['solution']);

这里的关键问题在in_array()函数,可以先看看In_array()的函数定义:

- 阅读剩余部分 -

对于Discuz!3.2的基础认证钓鱼漏洞分析与修复

前言

最近在某个技术论坛出现了一个基础认证钓鱼的漏洞,然后分析了Discuz!3.2版本的相关源码,对于该漏洞进行了修复,此文当做个人的学习记录,如果有错误的地方,欢迎讨论交流。

分析过程

在分析漏洞之前先了解一下相关的知识科普。

401钓鱼,也叫基础认证钓鱼。在Web站点中,绝大部分的web服务器被配置为匿名访问,即用户在请求web站点访问服务器上的相关信息时,一般不会被要求提示输入相关认证标示信息,也就是说用户不需要使用用户名或者密码就可以访问网站,这也是所有开放站点所使用的配置。

在Nginx和Apache中,默认配置都是匿名访问。
如Nginx想要配置非匿名访问需要进行如下设置:
/etc/nginx/sites-enabled/default中:

server {
    server_name blog.cnpanda.net
    root /www/panda

   # ...

   location / {
        # 下面的两句是要求非匿名访问
        auth_basic "Restricted";
        auth_basic_user_file htpasswd;
        # ...
    }

   # ...
}

然后创建一个htpasswd文件就可以了,具体的在这里就不提了。

在Apache中就比较简单了,Apache的httpd.conf默认配置如下:

<directory "/etc/www">
 Options IndexesFollowSymLinks Includes
 AllowOverride None
 Order allow,deny
 Allow from all
</Directory>

如果需要修改为非匿名访问,那么就需要传递一个WWW-Authenticate的字段,如下代码就是使用Header()函数要求客户端使用BASIC验证:



- 阅读剩余部分 -

CVE-2017-9603分析

CVE-2017-9603分析

一、CVE-2017-9603

WordPress Plugin WP Jobs < 1.5 - SQL Injection

二、漏洞分析

问题出现在wp-jobswpjobs_applications,php,第10行到第62行:

<?php
$job_id = $_REQUEST['jobid']; //获取jobid
$jb_args = array(
    'posts_per_page' => -1,
    'orderby' => 'post_date',
    'order' => 'DESC',
    'post_type' => 'job',
    'post_status' => 'publish',
    'suppress_filters' => true);

$jobs = get_posts($jb_args);
?>
<form autocomplete="off" name="form" id="form">
    <?php _e('Filter by Job', 'wp-jobs'); ?> <select name="jumpMenu" id="jumpMenu" onchange="MM_jumpMenu('parent', this, 0)">
        <option value="edit.php?post_type=job&page=WPJobsJobApps">All Applications</option>
        <?php foreach ($jobs as $job_info) : setup_postdata($jobs); ?>
            <option <?php
            if ($job_info->ID == $job_id) {
                echo 'selected="selected"';
            }
            ?> value="edit.php?post_type=job&page=WPJobsJobApps&jobid=<?php echo $job_info->ID; ?>"><?php echo $job_info->post_title; ?></option>
         <?php
            endforeach;
            wp_reset_postdata();
            ?>
    </select>
</form>
<style>
    .dctrprt tr th, .dctrprt tr td {
        font-family:Arial, Helvetica, sans-serif;
        font-size:13px;
    }
</style>
<table class="widefat dctrprt">
    <tr>
        <th><strong><?php _e('S.No', 'wp-jobs'); ?></strong></th>
        <th><strong><?php _e('Job Title', 'wp-jobs'); ?></strong></th>
        <th><strong><?php _e('Full Name', 'wp-jobs'); ?></strong></th>
        <th><strong><?php _e('Email', 'wp-jobs'); ?></strong></th>
        <th><strong><?php _e('Phone Number', 'wp-jobs'); ?></strong></th>
        <th><strong><?php _e('Download Resume', 'wp-jobs'); ?></strong></th>
    </tr>
    <?php
    $tbl = $wpdb->prefix;
    $qry = "Select * from " . $tbl . "app_user_info ";
    if ($job_id <> "") {
        $qry .= " where app_job_id = " . $job_id; //直接带入SQL语句查询
    }
    $qry .= " Order by `app_id` Desc ";
    $users = $wpdb->get_results($qry);
    $i = 1;
    foreach ($users as $user) {
?>

- 阅读剩余部分 -