首页 > 编程语言 >PHP代码审计——Day1-Wish List

PHP代码审计——Day1-Wish List

时间:2024-03-31 21:56:26浏览次数:13  
标签:Wish List Day1 rate file array PHP TRUE id

前言:发现红日安全代码审计小组写了关于php代码审计demo的系列文章,于是跟着一起学习。参考:
[红日安全]代码审计Day1 - in_array函数缺陷
RIPS-PHP-SECURITY-CALENDAR-2017学习记录

漏洞解析

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()函数:(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。
  • 如果 $needle 是字符串,则比较是区分大小写的。

该代码中,in_array()函数没有将第三个参数设置为TRUE进行强检查,导致攻击者可以通过构造文件名来绕过服务端的检测。比如,上传6shell.php,由于目标数组$whitelist中的元素是数字类型的,所以会发生强制类型转换,文件将被强制转换成数字6,6在range(1, 24)中,绕过了in_array()函数判断,导致任意文件可上传。

实例解析

code:piwigo2.7.1

此处in_array()函数也没有设置第三个参数为TRUE,而$rate是可以直接和SQL语句拼接的

$_GET['action']rate 的时候,就会调用文件 include/functions_rate.inc.php 中的rate_picture方法


然后再看$conf['rate_items']

尝试绕过:将$rate设置为1,1 and if(ascii(substr((select database()),1,1))=112,1,sleep(3)));#

'INSERT INTO'
.RATE_TABLE.
'(user_id,anonymous_id,element_id,rate,date)
VALUES ('
.$user['id'].','
.'\''.$anonymous_id.'\','
.$image_id.','
.$rate
.',NOW());'

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());

修复建议

  • in_array()函数第三个参数设置为TRUE作强检查
  • 使用 intval() 函数将变量强转成数字

标签:Wish,List,Day1,rate,file,array,PHP,TRUE,id
From: https://www.cnblogs.com/smile2333/p/18107330

相关文章

  • Java中List集合
    一、ArrayList集合1.ArrayList集合的特点2.ArrayList集合的一些方法①.add(Objectelement)向列表的尾部添加指定的元素。list.add("123");//add()用于向List集合容器中添加元素。②.size()返回列表中的元素个数。list.size();//size()用于获取集合中有多少个元素。③......
  • List和ObservableCollection的转换
    1、我们后台查询全部List数据的时候,前台需要ObservableCollection展示这个时候List需要转换成ObservableCollectionpublicstaticObservableCollection<T>ToObservableCollection<T>(thisIEnumerable<T>source){if(source==null){thrownewArg......
  • 监听器 Listener
    目录1、什么是Listener 2、在Web中的重要作用3、怎样使用4、在不同层面的应用1)JavaScript事件监听:2)Web框架中的监听器:3)应用服务器和容器中的监听器:区别:1、什么是Listener Listener是计算机科学中的一个重要概念,用于监视和响应特定事件的发生。在Web中,监听器的作......
  • Leetcode算法训练日记 | day11
    一、有效的括号1.题目Leetcode:第20题给定一个只包括'(',')','{','}','[',']'的字符串s,判断字符串是否有效。有效字符串需满足:1.左括号必须用相同类型的右括号闭合。2.左括号必须以正确的顺序闭合。3.每个右括号都有一个对应的相同类型的左括号。示例1:输入:s="()"......
  • Leetcode算法训练日记 | day10
    一、用栈实现队列1.题目Leetcode:第232题请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现MyQueue类:voidpush(intx)将元素x推到队列的末尾intpop()从队列的开头移除并返回元素intpeek()返回队列开头的元素......
  • C语言学习笔记day17
    1.结构体类型得定义      struct结构体名{         数据类型1成员变量1;         数据类型2成员变量2;         数据类型3成员变量3;         ...      };2.结构体变量得定义      存......
  • python 3 : list 与 深copy/浅copy
    按语:               之前,论述了python可变数据类型与不可变数据类型。        这里继续补丁list与深copy/浅copy。               这里补充一下,深copy/浅copy是python宇宙中最离奇的存在!       令99%的小白求生不......
  • Django中values()和values_list()
    values()1、不带参数,返回所有属性的键值对,比如使用filter时,会返回一个列表,列表中每一项是一个字典>>>Blog.objects.values()[{'id':1,'name':'BeatlesBlog','tagline':'AllthelatestBeatlesnews.'}],>>>Blog.objects.filte......
  • 【QT入门】 QListWidget各种常见用法详解之图标模式
    往期回顾【QT入门】Qt代码创建布局之多重布局变换与布局删除技巧-CSDN博客【QT入门】QTabWidget各种常见用法详解-CSDN博客【QT入门】QListWidget各种常见用法详解之列表模式-CSDN博客【QT入门】QListWidget各种常见用法详解之图标模式QListWidget有列表和图标两种......
  • java的ArrayList类
    ArrayList<E>E是自定义数据类型ArrayList类:构造函数: 成员方法: public boolean add(E e):将指定元素加到集合末尾Appendsthespecifiedelementtotheendofthislist.publicclassArray{publicstaticvoidmain(String[]args){ArrayLista......