您现在的位置是:主页 > news > 郑州做音响网站的公司/百度系app有哪些
郑州做音响网站的公司/百度系app有哪些
admin2025/4/25 1:42:46【news】
简介郑州做音响网站的公司,百度系app有哪些,毕业设计代做的网站靠谱吗,做淘客找单子的网站沙漏安全团队欢迎真正热爱技术的你!本文首发于先知社区➡https://xz.aliyun.com/t/8409前言:审计代码能力太弱了,每次一看到审计代码的题目就不知道要如何进行,恰好做Web题的时候发现了一个有关ThinkPHP6.0漏洞的题目…

沙漏安全团队
欢迎真正热爱技术的你!
本文首发于先知社区➡https://xz.aliyun.com/t/8409
前言:审计代码能力太弱了,每次一看到审计代码的题目就不知道要如何进行,恰好做Web题的时候发现了一个有关ThinkPHP6.0漏洞的题目,趁这个机会也练习一下。
0x00:漏洞介绍
2020年1月10日,ThinkPHP团队发布一个补丁更新,修复了一处由不安全的
SessionId
导致的任意文件操作漏洞。该漏洞允许攻击者在目标环境启用session的条件下创建任意文件以及删除任意文件,在特定情况下还可以getshell。
具体受影响版本为ThinkPHP6.0.0-6.0.1
。
0x01:环境准备
Windows:Apache + Thinkphp(6.0.0) + php7.2.10
先安装composer
工具,我这里使用的是phpstudy
,在php目录找到一个php7版本的即可,安装好之后
composer create-project topthink/think tp 6.0.0#tp是文件夹命名#6.0.0是版本号
进入安装目录,执行命令
php think run#会开启一个临时的开发环境的服务器,默认运行在localhost:8000
0x02:漏洞分析
根据官方Github上提供的修改的文件是
src/think/session/Store.php
先来看一下,添加ctype_alnum
这个函数有什么作用
这个函数是用来检测输入的
$text
中所有的字符全部是字母和(或者)数字,返回 TRUE 否则返回FALSE
通过官方的修复可以推出来漏洞的成因,主要原因应该是出现在Session
中,那下面就来分析一下Session
的相关代码
/vendor/topthink/framework/src/think/session/Store.php#TP6存储Session文件的目录
漏洞介绍中说到该漏洞允许攻击者在目标环境启用session
的条件下可以删除任意文件和创建任意文件,那就先定位一下关键词delete
,既然是任意文件删除,那么参数就一定是用户可控的。
含
delete
关键字的一共有三处,可以推测在函数265
行的位置很可能是该漏洞的形成位置,因为涉及到了SessionId
。而且漏洞介绍中也说了可以任意创建文件,在delete
关键字上面就有一个write
函数且包含有SessionId
跟踪一下这个
write
函数,在全局搜索函数中找到了write()
和delete()
函数的详细定义
vendor/topthink/framework/src/think/session/driver/File.php
发现有一个
writeFile
函数,再跟进一下看看发现了函数
file_put_contents()
,这里进行了写入文件操作,根据所含的参数进行反向分析一下,看能否找到可控点:
file_put_contents
函数中的两个参数来源于writeFile($path, $content)
函数中而
writeFile
这个函数中的参数又是从write()
函数的两个参数$sessID、$sessData
中获取到的全局搜索一下参数
write
函数发现很开可疑的
$sessionID
和$data
,进去仔细查看一下,这里就可看出来了,这两个参数来源是来自Save()
函数调用write()
函数而且
$sessionID
是从getId()
函数得到了,可以直接搜这个函数,也可以进行猜测,既然有getId
函数,就一定有setId()
兜兜转转又回到了官方修补的地方,再继续审计
$this->id = is_string($id) && strlen($id) === 32 && ctype_alnum($id) ? $id : md5(microtime(true) . session_create_id());
当传入的参数$id
满足32位的时候,便会将该值设置为$this->id
。查找一下setId
被调用的地方
vendor/topthink/framework/src/think/middleware/SessionInit.php
简单分析一下,变量
cookieName
的值来源于getName
函数找一下属性
name
所以
cookieName
的值为PHPSESSID
,而$sessionId
是cookie
中名为PHPSESSID
的值,因此是攻击者可控的,从而导致写入的文件名可控。
既然写入文件名可控,那么写入的内容是否可控那?在默认环境下,session
的内容vendor/topthink/framework/src/think/session/Store.php:261
的变量$data
传入找一下
$data
,发现默认为空值,默认环境是不开启session的写入的内容就是创建
session
使用的内容。但是session
的创建是由实际的后端业务逻辑来决定的,而默认环境下并没有创建session
。因此,默认环境下无法做到任意文件写入。
参考了Is4b3lla3
师傅的方法,尝试复现复现
在app\controller\index.php
中修改下代码,如下:
<?php namespace app\controller;use think\facade\Session;use app\BaseController;class Index extends BaseController{ public function index() { Session::set('name','thinkphp'); return 'lemon'; return '
:)
ThinkPHP V613载初心不改 - 你值得信赖的PHP框架
'; } public function hello($name = 'ThinkPHP6') { return 'hello,' . $name; }}
除此之外,还需要开启一下session
,删除/app/middleware.php
最后一行的注释即可
0x04:本地复现
修改好文件之后,进行抓包
注意:要删除官方修补添加的ctype_alnum函数,否则会实验不成功
只需要构造
PHPSESSID
的值即可,值为string
且长度为32
在\runtime\session
查看一下生成的session文件查看一下内容
a:1:{s:4:"name";s:8:"thinkphp";}
session
的内容经过了序列化操作,只要将session
的内容反序列化即可getshell
,但前提是后端需要有类似的Session::Set('name',$_POST['i'])
代码才可以利用。
0x05:总结:
•在环境开启Session的条件下,此漏洞经过构造可进行任意文件删除•在环境开启Session且Session中的数据可控的情况下,可以通过此操作达到构造webshell的目的
0x06:[GYCTF2020]EasyThinking
用御剑扫发现有源码文件,下载下来发现是Thinkphp6.0
题目提示是漏洞搜索,那就很容易联想到TP6任意文件操作漏洞,先观察一下
Store.php
文件
vendor/topthink/framework/src/think/session/Store.php
没有加上
ctype_alnum
函数,所以应该是存在这个漏洞的。
在注册时就会将session文件写入到\runtime\session
中,所以从注册开始就进行修改,只要满足32位
就可以写好之后,发现有搜索功能,可以传入key值,感觉应该是搜索的内容直接被写入了SESSION,就先传入一句话木马试试
发现上传木马成功
使用蚁剑进行连接
一看这种格式的就是需要绕过
disable_functions
,传一个phpinfo
看看先尝试下
bypass_disablefunc_via_LD_PRELOAD
方法,上传下文件这种方法不行就换另外一种常见的,恰好是这题是php7的,可以使用下
bypass PHP7.0-7.3 disable_function
这个exp,上传进去访问后便可获取到flag
参考博客:https://blog.csdn.net/zhangchensong168/article/details/104106869 https://paper.seebug.org/1114/ http://www.pdsdt.lovepdsdt.com/index.php/2020/05/15/thinkphp6-getshell/

沙漏安全团队
奋发努力
拼搏向上
本期编辑:bosoun_ho
▇ 扫码关注我们哦
沙
漏