nssctf-1

发布时间 2023-07-13 20:27:45作者: Focu4

刷过的题,gpt的出现是世界上最伟大的发明

[SWPUCTF 2021 新生赛]gift_F12

F12,查看源码,直接搜flag
image.png
tag:审查前端元素

[SWPUCTF 2021 新生赛]jicao

<?php
highlight_file('index.php');
include("flag.php");
$id=$_POST['id'];
$json=json_decode($_GET['json'],true);
if ($id=="wllmNB"&&$json['x']=="wllm")
{echo $flag;}
?>

函数解读:
json_decode :对json格式的字符串进行解码为php对象或数组的函数。
用法:

mixed json_decode ( string $json [, bool $assoc = false [, int $depth = 512 [, int $options = 0 ]]] )
  • json:要解码的 JSON 字符串。
  • assoc(可选):当该参数为 true 时,将返回关联数组;当为 false 或不设置时,将返回对象。
  • depth(可选):设置递归深度限制,默认为 512。
  • options(可选):设置解码选项。目前支持的选项有:
  • JSON_BIGINT_AS_STRING:将大整数作为字符串返回。

这里assoc参数为true说明返回关联数组,也就是键对值,键为x ,值为wllm,json为数组,需要用get进行传参,并且传参要以json的格式,同时要post传参id=wllmNB

json格式示例: {
"name":"john",
"age":30,
}

payload ?json={"x":"wllm"} post :id=wllmNBimage.png
tag:get/post json_decode

[SWPUCTF 2021 新生赛]easy_md5

 <?php 
 highlight_file(__FILE__);
 include 'flag2.php';
 
if (isset($_GET['name']) && isset($_POST['password'])){
    $name = $_GET['name'];
    $password = $_POST['password'];
    if ($name != $password && md5($name) == md5($password)){
        echo $flag;
    }
    else {
        echo "wrong!";
    }
 
}
else {
    echo 'wrong!';
}
?>
wrong!

函数解读:
isset:用于检验变量是否被设置并且不为null,返回的是bool值

bool isset ( mixed $var [, mixed $... ] )
  • var:要检查的变量或数组索引。
  • ...(可选):可以传入多个变量或数组索引,用于一次性检查多个变量。
  • 返回值:
  • 如果变量被设置并且不为 null,isset() 函数返回 true。
  • 如果变量未设置或者被设置为 null,或者没有传入任何参数,isset() 函数返回 false。

这里的条件需要是name!=password,但是md5加密后要相等,

在php中有一些特殊情况下,即使两个值不相等,但经过md5加密后结果却相等,因为md5生成的哈希值是固定长度的,所以不管原始数据长度如何,哈希值都是相同的。

== 和=区别
在php中
为运算符,比较两个值是否相等,而不考虑数据类型,数据类型不同会进行类型转换后进行比较
===为全等于运算符,只有数值和数据类型完全相同是才为全等。

PHP md5 相等绕过 - Ainsliaea - 博客园
payload:随便选择一个md5加密后为0e开头的字符串就行
image.png
tag:md5绕过

[SWPUCTF 2021 新生赛]easy_sql

一题普通的union注入
前面还有几个步骤
?id=1' //报错
?id=1' %23 //不报错
?id=1' order by 3 %23//判断字段数
?id=1' union select 1,2,3 %23 //判断回显字段
image.png
image.png
image.pngimage.png
image.png
tag:sql注入

[SWPUCTF 2021 新生赛]include

先用get传入一个file参数
然后得到

<?php
  ini_set("allow_url_include","on");
header("Content-type: text/html; charset=utf-8");
error_reporting(0);
$file=$_GET['file'];
if(isset($file)){
  show_source(__FILE__);
  echo 'flag 在flag.php中';
}else{
  echo "传入一个file试试";
}
echo "</br>";
echo "</br>";
echo "</br>";
echo "</br>";
echo "</br>";
include_once($file);
?> flag 在flag.php中

函数解读:
ini_set:允许在运行时修改php配置选项的值,允许动态更改php设置而无需修改php.ini文件。

ini_set('memory_limit', '256M');

配置选项的名称和要设置的新值。
header:用来向客户端发送原始的HTTP头信息,可以控制响应的头部信息。
include_once:用于在php脚本中包含并执行其他制定的文件,作用是在包含文件前先检查是否已经包含过该文件,避免重复包含同一个文件的问题。如果重复包含,将会忽略对该文件的再次包含。
show_source() 函数是一个 PHP 内置函数,用于显示指定文件的源代码。当调用 show_source(FILE) 时,将会显示当前 PHP 脚本文件的源代码。
这段代码的意思是先将php配置文件允许在包含文件时使用url路径,当为on时候,说明include_once和include、require可用,说明可以用来远程包含php文件,设置为on,说明本题应该是文件包含,设置了header的类型,说明返回应该是一段text文本,使用get传参file,先检查file是否为空,不为空则执行show,包含并执行file所指定的文件。但也只是包含了文件,而不会输出文件的内容,因此需要用到php伪协议。

php伪协议:
特殊的url方案,用于在php的文件操作函数等模拟访问不容类型的资源。
file:// 用于访问本地文件系统中的文件,可以通过指定路径来确定文件的位置
http:// \ https// :通过HTTP或https访问远程服务器上的文件或网页内容
ftp:// :用于通过FTP访问远程服务器上的文件
data:// :用于访问内存中的数据,例如将字符串作为文件内容处理
phar:// :用于操作phar(php归档文件),可以读取和执行里面内容
glob:// :用于对通配符模式进行文件搜索,返回匹配的文件列表
php:// : 用来访问php的输入输出流,提供了一种便捷方式来处理输入和输出数据,可以在不创建临时文件的情况下进行读写操作。
zlib://:处理压缩流
rar:// :rar数据压缩

利用了php://filter (用于数据流过滤和转换的特殊伪协议,允许以流的方式过滤和处理各种数据),为什么要编码呢,一种可能是文件通常是以utf-8编码的格式进行存贮,通过编码能够保证以纯文本形式传输,而不会出现特殊字符引起的问题。
payload:?file=php://filter/convert.base64-encode/resource=flag.php
image.png

[SWPUCTF 2021 新生赛]easyrce

 <?php
error_reporting(0);
highlight_file(__FILE__);
if(isset($_GET['url']))
{
eval($_GET['url']);
}
?> 

函数解析:
eval:作用是将传入的字符串作为php代码进行执行和解析,接收一个包含合法php代码的字符串作为参数,并尝试将字符串中的代码进行解析和执行。
eval通常可以用来

  1. 动态执行代码:
  2. 运行数学表达式:
  3. 执行动态处理的回调函数:

eval()函数的滥用可能导致代码注入和安全漏洞,因此可能会导致rce远程漏洞,攻击者可以在目标系统上执行任何命令,修改数据、获取敏感信息等。
远程命令与代码执行总结 - FreeBuf网络安全行业门户
比如执行payload:?url=phpinfo();image.png
利用php执行命令注入,查看system

为什么执行函数里面需要使用引号和; ?
引号的作用是将命令参数括起来,确保命令解析器将其视为整体而不是多个独立的部分,可以防止命令参数中包含空格或其他他字符时导致命令解析错误,可以使用双引号或单引号,在单引号字符串中可以使用双引号或者反斜杠对命令参数进行引用,\是防止"被错误解析
防护:进行输入验证和过滤,减少命令注入攻击的风险。

image.png
image.png
payload:?url=system("cat /flllllaaaaaaggggggg");

[SWPUCTF 2021 新生赛]caidao

image.png
熟悉的一句话木马,密码是wllm,用蚁剑进行连接
image.png
flag在根目录下
image.png
tag:木马连接

[第五空间 2021]WebFTP

一打开就是一个登录界面,先尝试了几个弱口令
image.png
然后尝试爆破
image.png
但是查看wp说是应该查看这款项目,里面有默认的初始密码,以后遇到这些都应该先查查项目,说不定开源项目会提供一些有效信息。
登录进去
image.png
最后发现这道题的思路应该是扫描目录
image.png
在开源项目的readme中有登录密码,并且flag在phpinfo中
image.png
image.png
除了这个还有源码泄露的问题image.png
学到了:信息收集很重要,开发项目脱敏很重要,不要把关于项目太详细的敏感信息公开。

[SWPUCTF 2021 新生赛]babyrce

 <?php
error_reporting(0);
header("Content-Type:text/html;charset=utf-8");
highlight_file(__FILE__);
if($_COOKIE['admin']==1) 
{
    include "../next.php";
}
else
    echo "小饼干最好吃啦!";
?> 小饼干最好吃啦!

函数解析:
$_COOKIE:是一个超全局数组,用于访问客户端发送给服务器的cookie数据,cookie是一种在客户端存储数据的机制,在不同的http请求之间保持状态。
一般用法:$_COOKIE['cookie_name']用来获取特定的cookie值,比如$_COOKIE['username'] 用来返回存储在名为username的cookie中的用户名

小饼干就该想到是cookie,所以是应该构造一个cookie,使得admin的username=1,然后绕过cookie之后就可以访问next.php
image.png(以为需要flask构造那种,没想到直接写)
image.png得到下一个页面

<?php
  error_reporting(0);
highlight_file(__FILE__);
error_reporting(0);
if (isset($_GET['url'])) {
  $ip=$_GET['url'];
  if(preg_match("/ /", $ip)){
    die('nonono');
  }
  $a = shell_exec($ip);
  echo $a;
}
  ?> 

函数解析:
preg_match():用于在字符串中执行正则表达式,用来检查一个字符串是否能与指定的正则表达式模式匹配,返回布尔值

int preg_match(string $pattern, string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]])

$pattern: 要匹配的正则表达式模式。
$subject: 要匹配的目标字符串。
$matches(可选): 如果提供了该参数,将被存储匹配结果的数组。
$flags(可选): 可以设置一些选项和标记,例如 PREG_OFFSET_CAPTURE 等。
$offset(可选): 指定从目标字符串的哪个位置开始匹配。
preg_match()只返回第一关匹配项,如果要找出所有匹配项可以使用preg_match_all(),/____/里面是要匹配的表达式或参数。
die():用来终止脚本的执行,并输出一条信息,与exit()函数具有相同的功能

void die([string $message])

$message(可选): 要输出的终止消息。
shell_exec():用于在服务器上执行shell命令并返回命令的输出结果

string|null shell_exec(string $cmd)

$cmd: 要执行的 shell 命令。
返回值:
如果成功执行命令,将返回命令的输出结果作为字符串。
如果命令执行失败或出现错误,则返回 null。

get传入url参数,使用了正则匹配对空格进行过滤,然后过滤后进行命令执行,也是rce,但是要绕过空格RCE篇之命令执行中的各种绕过 | Arsene.Tang
使用$IFS$9进行绕过
image.png
image.png
还有一个问题就是eval和shell_exec的区别(来自gpt)
:::info

  1. 功能不同
    • shell_exec():用于执行外部的 shell 命令,并返回命令的输出结果。
    • eval():用于执行传入的字符串作为 PHP 代码。
  2. 执行方式不同
    • shell_exec():通过调用服务器上的 shell 环境来执行外部命令。它将命令作为字符串参数传递给 shell,并返回命令的输出结果。
    • eval():将传入的字符串作为 PHP 代码进行解析和执行。它将字符串视为有效的 PHP 代码,并在当前的执行环境中执行这些代码。
  3. 使用场景不同
    • shell_exec():常用于需要执行外部 shell 命令并获取结果的情况,比如执行系统命令、调用其他可执行文件等。
    • eval():主要用于动态执行字符串作为 PHP 代码的情况,例如根据用户提供的字符串运行动态生成的代码。
  4. 安全性不同
    • shell_exec():由于直接执行外部命令,存在一定的安全风险,特别是当将用户输入作为命令参数时,容易受到命令注入攻击的威胁。为了避免安全问题,应该对输入进行适当的验证和过滤。
    • eval():由于执行字符串作为 PHP 代码,存在较高的安全风险,特别是当执行来自不可信来源的字符串时。恶意的字符串可能会导致代码执行不受控制,因此应该谨慎使用 eval(),并确保只执行可信任的字符串。

综上所述,shell_exec() 用于执行外部命令并获取结果,而 eval() 用于执行字符串作为 PHP 代码。在使用这两个函数时应注意安全性,并适当验证和过滤输入,避免潜在的安全风险。
:::
因此shell_exec可以直接执行命令返回值,而eval需要使用到php的函数比如system,使用代码来执行。
tag:cookierce

[SWPUCTF 2021 新生赛]Do_you_know_http

Please use 'WLLM' browser!

是http的报文头部参数http 请求头中各参数的含义 - wangssd - 博客园
先user-agent,再xff
这里有点陷阱,发送成功后不会跳转
image.pngimage.png
payload:/secretttt.php
tag:XFF

[SWPUCTF 2021 新生赛]easyupload1.0

文件上传绕过
文件上传漏洞(详解) - FreeBuf网络安全行业门户
简单上传一个php文件,发现被过滤了,可能是对后缀进行过滤
修改content-type为image/jpeg
发现上传成功,用蚁剑进行连接,得到flag
image.png
关键是看服务器如何过滤我们上传的文件,如果只是文件后缀过滤,只在前端进行过滤,那我们只需要禁用js。
或者只限制了某种文件后缀,可以使用特殊的解析后缀进行绕过。
这里使用的是MIME绕过:利用服务端类型检测是通过检查http中的content-type字段的值是否合法来接收文件。

[SWPUCTF 2021 新生赛]easyupload2.0

这道题使用了特殊的解析后缀进行上传绕过phtml,服务器没有对这个进行过滤,也是上传之后进行连接得到flag
image.png
tag:文件上传

[SWPUCTF 2021 新生赛]error

image.png首先这个数据库是属于mariadb
根据题目error知道这是一个报错注入
SQL注入漏洞 | 狼组安全团队公开知识库
sqlmap:我用sqlmap在sql注入里面就没有成功脱裤过,不过这次可以。image.png
手注:sql注入之报错注入_Dar1in9的博客-CSDN博客
报错注入:
报错注入是指人为的制造错误条件,使得查询结果能够出现在错误信息中。
可以利用xpath语法错误:extractvalue和updatexml两个函数

updatexml(xml_document,xpath_string,new_value)

第一个参数:xml_document是string格式,为xml文档对象的名称 
第二个参数:xpath_string是xpath格式的字符串
第三个参数:new_value是string格式,替换查找到的负荷条件的数据 作用:改变文档中符合条件的节点的值

不懂。。。。。

[NCTF 2018]签到题

点击连接,直接跳转到了baidu,抓个包看看
image.png
发现flag在header
ps:nss这个用户定义标签这个真是离谱
tag:http

[NSSCTF 2022 Spring Recruit]ezgame

image.png点进去就是一个小游戏
image.png
提示65分有flag,当然一般不可能是真玩
f12
image.png
tag:F12

[鹤城杯 2021]EasyP

<?php
include 'utils.php';

if (isset($_POST['guess'])) {
    $guess = (string) $_POST['guess'];
    if ($guess === $secret) {
        $message = 'Congratulations! The flag is: ' . $flag;
    } else {
        $message = 'Wrong. Try Again';
    }
}

if (preg_match('/utils\.php\/*$/i', $_SERVER['PHP_SELF'])) {
    exit("hacker :)");
}

if (preg_match('/show_source/', $_SERVER['REQUEST_URI'])){
    exit("hacker :)");
}

if (isset($_GET['show_source'])) {
    highlight_file(basename($_SERVER['PHP_SELF']));
    exit();
}else{
    show_source(__FILE__);
}
?> 

函数解析:
$_SERVER:用于存储关于当前运行脚本的服务器和执行环境的信息,包含了诸多键值。

$_SERVER['PHP_SELF']:当前正在执行的脚本的文件名。
$_SERVER['SERVER_ADDR']:服务器IP地址
$_SERVER['SERVER_NAME']:服务器的主机名
$_SERVER['REQUEST_METHOD']:当前请求的HTTP方法
$_SERVER['REQUEST_URI']:由域名和查询字符串组成的当前请求的完整 URL。
$_SERVER['QUERY_STRING']:当前请求的查询字符串部分。
$_SERVER['HTTP_HOST']:当前请求的主机名。
$_SERVER['HTTP_USER_AGENT']:当前请求的用户代理(浏览器信息)。
$_SERVER['REMOTE_ADDR']:当前请求的客户端 IP 地址。

basename:用于获取路径中的文件名部分,接收一个路径或url作为参数,并返回该路径中的文件名,就是返回的是最末尾的文件名。
hilelight_file:用来将指定文件中的代码以语法高亮的形式输出到浏览器,接收一个文件路径作为擦书,并将文件中的代码高亮显示,
这道题是文件包含,包含了utils.php ,需要进行绕过,使得正在执行的脚本文件名不能为utils.php,url里面不能有show_source字符串,当post传入的guess等于secret的时候就输出flag,同时还有get传入show_source参数,show_source应该是用来查看指定文件的源代码。需要传入show_source参数但是会被正则过滤。

  1. 绕过show_resouce的过滤,得到当前正在执行的脚本文件名

preg_match()绕过的问题总结 - 无据 - 博客园
a. 使用数组绕过,因为传入的参数为数组,所以不能够使用数组绕过
b. 使用回溯次数限制绕过:

  1. 绕过utils正则,结合basename的性质绕过

还是不是很理解。
这道题要得到flag,需要guess=secret,但是secreet不知道,猜测他是在utils.php里面,flag可能也在里面,因此我们需要访问这个路径,但是对当前执行脚本进行了过滤,就是如果我们访问utils.php这个文件,PHP_SELF的值就是utils.php,这个应该没错,我们需要绕过他,最后就是利用basename特性和特殊字符绕过的的方法。

[UUCTF 2022 新生赛]websign

image.png
禁用了快捷键打开源码查看器,这里image.png
这个js阻止了用f12快捷键或ctul+u打开快捷键
第五行为时间处理程序,当用于按下键盘上的任意键时,会触发该函数。
第六行currykey用来存储当前按下键的变量,evt时一个存储时间对象的变量,e为时间,e若不存在用window.event作为事件对象
第七行根据不同浏览器对键码值的支持获取当前按下的键码
第八行用条件语句判断是不是f12或ctul U,如果是则执行条件内语句
第九行为阻止事件的默认行为和事件冒泡
但是这种方法只对一般用户有效,其实要使用还是可以通过浏览器提供的功能或禁用js实现查看页面源码功能。

[CISCN 2019华东南]Web11

image.png
进来是一个页面,没发现什么信息,但是底部有个smarty,搜了搜从一道ctf题谈SmartySSTi - FreeBuf网络安全行业门户
smarty是一个php的模板引擎,类似flask,thinkphp
SSTI漏洞从0到1完全掌握 SSTI - FreeBuf网络安全行业门户

[HDCTF 2023]Welcome To HDCTF 2023

image.png
玩着玩着就出来了
image.png
其实在后面有个brainfuck,以为需要解码,也可以使用控制台直接输出,不过机理不是很懂。

[GDOUCTF 2023]EZ WEB

image.png点击,啥也没有,而且弹窗也只是前端
扫目录
image.png
image.png
有目录结构,修改访问方式为put和访问资源就行
image.png

[HNCTF 2022 Week1]2048

是2048,目标达到20000分,但是肯定不是通过玩。
看js
image.png
有个条件,猜测这就是flag,有了之前的经验,可以直接放进控制台执行,怪不得会有24685,原来是汉字,image.png
直接把代码放进控制台执行,省去了过程。

[SWPUCTF 2022 新生赛]ez_rce

真的什么都没有吗,扫一下目录
/robots.txt
image.png
不让爬,那就是要爬的意思
熟悉的框架,thinkphp是php的一款模板框架,版本为5.0
image.png
拿工具进行通杀扫描,最后一个参数是命令执行参数,直接执行命令,然后就ls探测flag,就是flag在nss/ctf/flag/flag底下有点难找
image.png
image.png

image.png

[羊城杯 2020]easycon

进入页面,访问index.php
image.png
eval类型的rce,直接进行注入
image.pngimage.png
base64转png得到flag
image.png

[HNCTF 2022 Week1]easy_upload

用php上传试试,发现没有任何过滤
image.png
flag在根目录下面
image.png

[HNCTF 2022 Week1]easy_html

饼干→cookie
image.png
然后跳转到
image.png
输入手机号,手机号一般是11位,但这里限制长度为10,前端修改长度就行
image.png
image.png

[HNCTF 2022 Week1]Interesting_http

先是传入一个want
image.png
然后说不是admin,那我直接改cookie
image.png
改了cookie说不是本地,那就xff
image.png