日常刷题记录20210812

感谢郭哥提供的环境和一万个hint

[724]upload

给了一个上传页面,beatiful front(笑)

看一下给的源码中关于上传文件的部分

1
2
3
4
5
6
7
8
9
10
11
if(isset($_POST['filename'])&&isset($_POST['content'])){
if(stristr($_POST['filename'], 'h')){
die('no h!');
}
$filepath = './files/'.$_POST['filename'];
$filename = basename($_POST['filename']);
file_put_contents($filepath,$_POST['content']);
$_SESSION['files'][$filename] = $filepath;
$_SESSION['paths'][$filepath] = 'file';
header('Location:/?file='.$filename);
}

filename中不能含有h,很方便地把一堆后缀连带.htaccess给过滤了

题目还给了一个info.php的界面,可以直接看到服务器的phpinfo,得到session的路径

然鹅路径里带h,session动不了手脚

然后就在这题卡了一个多星期😅

后来找郭哥证实了是环境没配好,原题是session路径是tmp。那么这里我本地搭建环境,手动改session模拟一下

看一下下面这段源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
foreach ($_SESSION['paths'] as $path=>$class){
$temp = new $class($path);
if($class=='file'){
$filelist[] = (string)$temp;
}
else{
$filelist[] = $temp;
}
}
$out = '<p>your file:';

foreach ($filelist as $value){
$out .= $value.' ';
}
echo $out.'</p>';

显然易知,session可控的情况下可以new一些奇怪的类出来。(参考链接:http://www.whoamianony.top/2021/03/10/Web%E5%AE%89%E5%85%A8/PHP%20%E5%8E%9F%E7%94%9F%E7%B1%BB%E7%9A%84%E5%88%A9%E7%94%A8%E5%B0%8F%E7%BB%93/#2021-MAR-DASCTF-%E6%98%8E%E5%BE%A1%E6%94%BB%E9%98%B2%E8%B5%9B-ez-serialize)

在phpstudy的目录下面放一个flag文件模拟一下

上传文件名为../../flag的文件,然后把$_SESSION[‘paths’][$filepath]改为SplFileObject

SplFileObject 类

SplFileInfo 类为单个文件的信息提供了一个高级的面向对象的接口,可以用于对文件内容的遍历、查找、操作等。详情请参考:https://www.php.net/manual/zh/class.splfileobject.php

flag{ibukifalling_test_flag}

感想和总结

php有很多可以利用的原生类,在new出来的类可控的时候可以考虑利用。

代码审计真的很重要,对代码逻辑有清楚的认识才能更好地解题(来自一个看php代码看了几天才看懂的人)