thinkphpv6.0代码审计
前言
正好做到一题thinkphp框架漏洞,于是决定自己审计一番~,正好学学如何入门
代码审计两种方式
1**.通读全文源码**
2.功能点审计:根据漏洞对应发生函数进行功能行审计,常会用到逆向溯源数据流方法进行审计
3.正向追踪数据流:根据用户输入参数->来到代码逻辑->最后审计代码逻辑缺陷->尝试构造payload
4.逆向溯源数据流:字符串搜索指定操作函数_跟踪函数可控参数->审计代码逻辑缺陷->尝试构造payload
CMS可分为两大类
单入口cms:不管访问哪个模块都使用同一个入口文件,常见的MVC框架采用这种模式
多入口cms:每个模块都有一个入口文件(可以前端设置一个入口文件 index.php,后端创建一个入口文件admin.php,前后端的入口文件是独立的)。
代码审计思路
接下来我们从三个层次开始我们的源码审计思路
1.确定要审计的源码是什么语言
2.确定该源码是单入口还是多入口
3.确定该语言的各种漏洞诞生的函数
PHP核心配置
一个漏洞在不同环境造成的结果也是不一样的。
由于关于php.ini配置的内容过于多,这里推荐浏览官方文档 https://www.php.net/manual/zh/ini.php,我们在这里主要列下php.ini 主要使用的安全配置。
safe_mode = off
用来限制文档的存取,限制环境变量的存取,控制外部程序的执行.PHP5.4.0移除。
- 限制环境变量存取
safe_mode_allowed_env_vars = string
指定php程序可以改变的环境变量的前缀,当这个选项的值为空时,那么php可以改变任何环境变量,如果 如:safe_mode_allowed_env_vars = PHP_,当这个选项的值为空时,那么php可以改变任何环境变量。
- 外部程序执行目录
safe_mode_exec_dir = "/usr/local/bin"
当安全模式被激活,safe_mode_exec_dir参数限制通过exec()函数执行的可执行文件到指定的目录。举例来说,如果你想限制在/usr/local/bin目录执行功能,你可以使用这个指令:
safe_mode_exec_dir = “/usr/local/bin”
禁用函数
disable_functions
为了更安全的运行PHP,可以用此指令来禁止一些敏感函数的使用,当你想用本指令禁止一些危险函数时,切记把dl()函数也加到禁止列表,攻击者可以利用dl()函数加载自定义的php扩展突破disable_functions.配置禁止函数时可以使用逗号分隔函数名。
- COM组件
com.allow_dcom = false
PHP设置在安全模式下(safe_mode),仍允许攻击者使用COM()函数来创建系统组件来还行任意命令,推荐关闭这个函数。 使用COM()函数需要在PHP.ini中配置
extension=php_com_dotnet.dll
,如果PHPversion<5.4.5则不需要。
- 全局变量注册开关
register_globals = off
php.ini的register_globals选项的默认值为OFF,在4.2版本之前是默认开启的,当设定为On时,程序可以接收来自服务器的各种环境变量,包括表单提交的变量,这是对服务器分厂不安全的, register_globals = off时,服务器端获取数据的时候用$_GET[‘name’]来获取数据。 register_globals = on时,服务端使用POST或GET提交的变量,豆浆自动使用全局变量的值来接受。
- 魔术引号自动过滤
magic_quotes_gpc = on
PHP5.4.0被移除 magic_quotes_gpc = off 在php.ini中默认是关闭的,如果打开它,将自动把用户提交对sql的查询的语句进行转换,如果设置成ON,php会把所有的单引号,双引号,和反斜杠和空字符(NULL)加上反斜杠()进行转义 它会影响HTTP请求的数据(GET,POST.COOKIE),开启它会提高网站的安全性。
- 是否允许包含远程文件
allow_url_include = off
该配置为ON的情况下,可以直接包含远程文件,若包含的变量为可控的情况下,可以直接控制变量来执行PHP代码。
- 是否允许打开远程文件
allow_url_open = on
允许本地PHP文件通过调用url重写来打开或者关闭写权限,默认的封装协议提供的ftp和http协议来访问文件。
- HTTP头部版本信息
expose_php = off
防止通过http头泄漏php版本信息。
- 文件上传临时目录
upload_tmp_dir =
上传文件临时保存的目录,如果不设置的话,则采用系统的临时目录。
- 用户可访问目录
open_basedir = D:\WWW
能够控制PHP脚本只能访问指定的目录,这样能够避免PHP脚本访问不应该访问的文件,一定程度上限制了。webshell的危害
- 内部错误选项
display_errors = on
表明实现PHP脚本的内部错误,网站发布后建议关不PHP的错误回显。
- 错误报告级别
error_reporting(E_ALL & ~Enotice)
具体列表推荐:https://www.runoob.com/php/func-error-reporting.html
这里设置的作用是将错误级别调到最高,显示所有问题,方便环境部署时候排错。
环境配置
人生建议,一定要安装phpstudy的集成环境–
更改配置的根目录为www(5)的web目录
修改为www/web/目录打开即可,接下来去配置一下数据库
去config中的database.php修改一下配置信息,然后去mysql中创建一下表
create database ctf; |
但是他的很多表和库的信息我们都不清楚–。。。。所以还是老老实实重新安装整个框架了。。
https://www.kancloud.cn/manual/thinkphp6_0/1037481
这里降级的时候一直没弄好,不懂是为啥,用了其他的安装和降级指令才行
composer create-project topthink/think tp60 |
修改composer.json里面的”topthink/frameword”为6.0.0
去掉前面你的注释符,开启session 然后更改apache的根目录为框架里面的public目录 创建成功: 果然最难的就是环境的配置-- 接下来修改一下:tp60\app\controller\的index.php文件使他可以创建session漏洞原理
根据漏洞描述,是因为session可控,传入的session值最后会拼接在sess_后形成任意文件读取覆盖,所以这里我们就直接跟进session值的传入。
进入session.php观察如何进行文件写入
跟进以后发现无过滤,只要长度符合32位就对sessionID进行赋值
接下来进行save()函数进行session的保存,可以看到write函数,将data写入sessionID中
将sessionid和sess_进行拼接形成新的文件名存放在/runtime/session/路径中
将传入的data值,写入改session文件中
但是由于我网站根目录设置的是public,懒得再弄了,被配置环境弄怕了–
小结
啊 无语了,想说换成phpstudy继承的,但是发现没有适合的php版本于是就又换了回去,期间debug的更换配置也是让人很头疼,最后瞎配置 也总算是配置好了–,真的是有点傻了
说一下第一次审计的收获
1.使用ctrl加鼠标左键可以直接看该函数的出现的位置
2.可以右键单击某个值添加观察追踪其改变位置
3.根据出问题的功能追踪其功能
thinkphpv6.0代码审计