简介
1
简介
in_array()
函数搜索数组中是否存在指定的值。
语法:in_array(search,array,type)
| 参数 | 描述 |
|---|---|
| search | 必需。规定要在数组搜索的值。 |
| array | 必需。规定要搜索的数组。 |
| type | 可选。如果设置该参数为 true,则检查搜索的数据与数组的值的类型是否相同。 |
class Challenge { //设置图片上传目录 const UPLOAD_DIRECTORY = './solutions/'; private $file; private $whitelist; //当对创建时调用的函数 public function __construct($file) { //将外部上传的图片内容信息赋值给$this->_file $this->file = $file; //设置1-24的值分别赋值给whitelist白名单 $this->whitelist = range(1, 24); } //当对象销毁时使用 public function __destruct() { //判断传进来的图片名称是否符合白名单里面的信息 //这段代码的主要漏洞就在这里in_array()判断不严格 没加true 此时判断是不会判断类型的 //所以我们可以上传1-24数字开头的值即可绕过导致图片任意上传 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']);
一个CTF例子
index.php
<?php include 'config.php'; $conn = new mysqli($servername, $username, $password, $dbname); if ($conn->connect_error) { die("连接失败: "); } $sql = "SELECT COUNT(*) FROM users"; $whitelist = array(); $result = $conn->query($sql); if($result->num_rows > 0){ $row = $result->fetch_assoc(); $whitelist = range(1, $row['COUNT(*)']); } $id = stop_hack($_GET['id']); // $id = $_GET['id']; $sql = "SELECT * FROM users WHERE id=$id"; print_r($sql); if (!in_array($id, $whitelist)) { die("id $id is not in whitelist."); } $result = $conn->query($sql); if($result->num_rows > 0){ $row = $result->fetch_assoc(); echo "<center><table border='1'>"; foreach ($row as $key => $value) { echo "<tr><td><center>$key</center></td><br>"; echo "<td><center>$value</center></td></tr><br>"; } echo "</table></center>"; } else{ die($conn->error); } ?>