目录
  1. 1. Day 1 - Wish List
    1. 1.1. 本题解析
    2. 1.2. 实例分析
    3. 1.3. 修复建议
    4. 1.4. CTF
PHP SECURITY CALENDAR 2017 Writeup

Day 1 - Wish List

本题解析

*考点:in_array() *

源码如下

<?php
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']);

代码的逻辑是,如果上传的文件的文件名在经过range()函数随机构造的数组里面,则会将上传的文件移动到新位置。然后拼接上传的路径为 ./solutions/[你传入的]

PHP手册里对其的定义:

in_array :(PHP 4, PHP 5, PHP 7)

功能 :检查数组中是否存在某个值

定义 : bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )

在 $haystack 中搜索 $needle ,如果第三个参数 $strict 的值为 TRUE ,则 in_array() 函数会进行强检查,检查 $needle 的类型是否和 $haystack 中的相同。如果找到 $haystack ,则返回 TRUE,否则返回 FALSE。

漏洞构成的语句:if (in_array($this->file['name'], $this->whitelist))
如果上传 3.php 由于第三个参数没有配置成 true,会造成任意文件上传

实例分析

系统:piwigo2.7.1 版本

入口文件:include\functions_rate.inc.php

当 $_GET[‘action’] 为 rate 的时候,就会调用文件 include/functions_rate.inc.php 中的 rate_picture 方法
追踪 rate_picture 方法

通过使用 in_array() 函数对 $rate 变量进行检测,第23行直接拼接 $rate 变量

$rate 的值设置成1,1 and if(ascii(substr((select database()),1,1))=112,1,sleep(3)));
SQL语句就变成:

INSERT INTO piwigo_rate (user_id,anonymous_id,element_id,rate,date) VALUES (2,'192.168.2',1,1,1 and if(ascii(substr((select database()),1,1))=112,1,sleep(3)));#,NOW()) ;

化简之后的代码

修复建议

  1. 将 in_array() 函数的第三个参数设置为 true

  2. 使用 intval() 函数将变量强转成数字

  3. 使用正则匹配来处理变量

CTF

文章作者: P2hm1n
文章链接: http://yoursite.com/2019/08/02/PHP-SECURITY-CALENDAR-2017-Writeup/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 P2hm1n‘s Blog

评论