HFCTF2020-uploadBaby

前言

本题在BUUCTF上有复现环境
这道CTF思路并不算难(虽然当时因为一些知识不太清晰没有做出来DX),关键就是对于几个函数的理解和对php的session的存储方式。

php-session文件特性

sess文件的储存方式

php中,session文件有三种储存方式。
1.php_binary
2.php(默认模式)
3.php_serialize
每种储存方式都不太相同:

<?php
//这里我设定2个内容
$_SESSION['passwd'] = '233';
$_SESSION['username'] = 'guest';

/*
读取sess文件获得以下内容:
php_binary模式:
passwds:3:"233";usernames:5:"guest";
(其中为键名的字符个数的ASCII,比如passwd由6个字母组成,则的HEX为06)

php模式:
passwd|s:3:"233";username|s:5:"guest";

php_serialize模式:
a:2:{s:6:"passwd";s:3:"233";s:8:"username";s:5:"guest";}
*/

sess的启动

<?php
session_start();
$_SESSION['username'] = 'guest';
//上例在运行正常的情况下会给予用户一个Cookie——PHPSESSID
//由26个小写字母和数字的hash值组成

sess文件文件名由用户的一个Cookie——PHPSESSION决定。
一般情况下PHP由26个小写字母和数字的hash值组成,php会根据这个cookie来找到对应的sess文件,对SESSION进行读取。
php寻找对应sess文件的依据是sess文件的文件名,一个sess文件的文件名为sess_PHPSESSID。

sess在web漏洞中的应用

往往session导致的漏洞是因为程序本身逻辑出现问题:

  1. session反序列化
    很明显sess文件内容进行了序列化来储存数据。当我们可以控制session内容时(如开启了PHP_SESSION_UPLOAD_PROGRESS时…)
  2. 任意session读取导致越权等
    很明显用户可以自己修改PHPSESSID来进行任意SESSION文件的读取。本题就是这样,通过上传一个文件名为“sess”,内容是可以导致越权的序列化内容的文件,在通过hash_file后变为“sess_sha256”的文件。再改PHPSESSID为sha256即可导致越权。

hash_file()

string hash_file(string 加密方式, string 文件路径);
这个函数可以通过文件的内容产生一个hash值(不是文件名)
PS:这个函数对文件夹同样凑效
PSS:我在做这道CTF时以为其是对文件名进行hash处理,于是光荣的没做出来(

filter_input

mixed filter_input(int 数据来源, string 变量名 [, int 过滤器]);
可以通过filter_input(INPUT_POST, 'test');的方式来接受一个变量名为test的POST数据。虽然通过$_POST['test']也可以接受POST参数,但上面的写法还可以在第三个参数的地方添加过滤器。

后言

这道题的思路并不难,只是因为自己的基础不算太扎实导致没能解出…

Comments