刷过的题,gpt的出现是世界上最伟大的发明
[SWPUCTF 2021 新生赛]gift_F12
[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=wllmNB
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开头的字符串就行
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 //判断回显字段
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
[SWPUCTF 2021 新生赛]easyrce
<?php
error_reporting(0);
highlight_file(__FILE__);
if(isset($_GET['url']))
{
eval($_GET['url']);
}
?>
函数解析:
eval:作用是将传入的字符串作为php代码进行执行和解析,接收一个包含合法php代码的字符串作为参数,并尝试将字符串中的代码进行解析和执行。
eval通常可以用来
- 动态执行代码:
- 运行数学表达式:
- 执行动态处理的回调函数:
eval()函数的滥用可能导致代码注入和安全漏洞,因此可能会导致rce远程漏洞,攻击者可以在目标系统上执行任何命令,修改数据、获取敏感信息等。
远程命令与代码执行总结 - FreeBuf网络安全行业门户
比如执行payload:?url=phpinfo();
利用php执行命令注入,查看system
为什么执行函数里面需要使用引号和; ?
引号的作用是将命令参数括起来,确保命令解析器将其视为整体而不是多个独立的部分,可以防止命令参数中包含空格或其他他字符时导致命令解析错误,可以使用双引号或单引号,在单引号字符串中可以使用双引号或者反斜杠对命令参数进行引用,\是防止"被错误解析
防护:进行输入验证和过滤,减少命令注入攻击的风险。
payload:?url=system("cat /flllllaaaaaaggggggg");
[SWPUCTF 2021 新生赛]caidao
熟悉的一句话木马,密码是wllm,用蚁剑进行连接
flag在根目录下
tag:木马连接
[第五空间 2021]WebFTP
一打开就是一个登录界面,先尝试了几个弱口令
然后尝试爆破
但是查看wp说是应该查看这款项目,里面有默认的初始密码,以后遇到这些都应该先查查项目,说不定开源项目会提供一些有效信息。
登录进去
最后发现这道题的思路应该是扫描目录
在开源项目的readme中有登录密码,并且flag在phpinfo中
除了这个还有源码泄露的问题
学到了:信息收集很重要,开发项目脱敏很重要,不要把关于项目太详细的敏感信息公开。
[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
(以为需要flask构造那种,没想到直接写)
得到下一个页面
<?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进行绕过
还有一个问题就是eval和shell_exec的区别(来自gpt)
:::info
- 功能不同:
- shell_exec():用于执行外部的 shell 命令,并返回命令的输出结果。
- eval():用于执行传入的字符串作为 PHP 代码。
- 执行方式不同:
- shell_exec():通过调用服务器上的 shell 环境来执行外部命令。它将命令作为字符串参数传递给 shell,并返回命令的输出结果。
- eval():将传入的字符串作为 PHP 代码进行解析和执行。它将字符串视为有效的 PHP 代码,并在当前的执行环境中执行这些代码。
- 使用场景不同:
- shell_exec():常用于需要执行外部 shell 命令并获取结果的情况,比如执行系统命令、调用其他可执行文件等。
- eval():主要用于动态执行字符串作为 PHP 代码的情况,例如根据用户提供的字符串运行动态生成的代码。
- 安全性不同:
- 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
这里有点陷阱,发送成功后不会跳转
payload:/secretttt.php
tag:XFF
[SWPUCTF 2021 新生赛]easyupload1.0
文件上传绕过
文件上传漏洞(详解) - FreeBuf网络安全行业门户
简单上传一个php文件,发现被过滤了,可能是对后缀进行过滤
修改content-type为image/jpeg
发现上传成功,用蚁剑进行连接,得到flag
关键是看服务器如何过滤我们上传的文件,如果只是文件后缀过滤,只在前端进行过滤,那我们只需要禁用js。
或者只限制了某种文件后缀,可以使用特殊的解析后缀进行绕过。
这里使用的是MIME绕过:利用服务端类型检测是通过检查http中的content-type字段的值是否合法来接收文件。
[SWPUCTF 2021 新生赛]easyupload2.0
这道题使用了特殊的解析后缀进行上传绕过phtml,服务器没有对这个进行过滤,也是上传之后进行连接得到flag
tag:文件上传
[SWPUCTF 2021 新生赛]error
首先这个数据库是属于mariadb
根据题目error知道这是一个报错注入
SQL注入漏洞 | 狼组安全团队公开知识库
sqlmap:我用sqlmap在sql注入里面就没有成功脱裤过,不过这次可以。
手注: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,抓个包看看
发现flag在header
ps:nss这个用户定义标签这个真是离谱
tag:http
[NSSCTF 2022 Spring Recruit]ezgame
点进去就是一个小游戏
提示65分有flag,当然一般不可能是真玩
f12
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参数但是会被正则过滤。
- 绕过show_resouce的过滤,得到当前正在执行的脚本文件名
preg_match()绕过的问题总结 - 无据 - 博客园
a. 使用数组绕过,因为传入的参数为数组,所以不能够使用数组绕过
b. 使用回溯次数限制绕过:
- 绕过utils正则,结合basename的性质绕过
还是不是很理解。
这道题要得到flag,需要guess=secret,但是secreet不知道,猜测他是在utils.php里面,flag可能也在里面,因此我们需要访问这个路径,但是对当前执行脚本进行了过滤,就是如果我们访问utils.php这个文件,PHP_SELF的值就是utils.php,这个应该没错,我们需要绕过他,最后就是利用basename特性和特殊字符绕过的的方法。
[UUCTF 2022 新生赛]websign
禁用了快捷键打开源码查看器,这里
这个js阻止了用f12快捷键或ctul+u打开快捷键
第五行为时间处理程序,当用于按下键盘上的任意键时,会触发该函数。
第六行currykey用来存储当前按下键的变量,evt时一个存储时间对象的变量,e为时间,e若不存在用window.event作为事件对象
第七行根据不同浏览器对键码值的支持获取当前按下的键码
第八行用条件语句判断是不是f12或ctul U,如果是则执行条件内语句
第九行为阻止事件的默认行为和事件冒泡
但是这种方法只对一般用户有效,其实要使用还是可以通过浏览器提供的功能或禁用js实现查看页面源码功能。
[CISCN 2019华东南]Web11
进来是一个页面,没发现什么信息,但是底部有个smarty,搜了搜从一道ctf题谈SmartySSTi - FreeBuf网络安全行业门户
smarty是一个php的模板引擎,类似flask,thinkphp
SSTI漏洞从0到1完全掌握 SSTI - FreeBuf网络安全行业门户
[HDCTF 2023]Welcome To HDCTF 2023
玩着玩着就出来了
其实在后面有个brainfuck,以为需要解码,也可以使用控制台直接输出,不过机理不是很懂。
[GDOUCTF 2023]EZ WEB
点击,啥也没有,而且弹窗也只是前端
扫目录
有目录结构,修改访问方式为put和访问资源就行
[HNCTF 2022 Week1]2048
是2048,目标达到20000分,但是肯定不是通过玩。
看js
有个条件,猜测这就是flag,有了之前的经验,可以直接放进控制台执行,怪不得会有24685,原来是汉字,
直接把代码放进控制台执行,省去了过程。
[SWPUCTF 2022 新生赛]ez_rce
真的什么都没有吗,扫一下目录
/robots.txt
不让爬,那就是要爬的意思
熟悉的框架,thinkphp是php的一款模板框架,版本为5.0
拿工具进行通杀扫描,最后一个参数是命令执行参数,直接执行命令,然后就ls探测flag,就是flag在nss/ctf/flag/flag底下有点难找
[羊城杯 2020]easycon
进入页面,访问index.php
eval类型的rce,直接进行注入
base64转png得到flag
[HNCTF 2022 Week1]easy_upload
[HNCTF 2022 Week1]easy_html
饼干→cookie
然后跳转到
输入手机号,手机号一般是11位,但这里限制长度为10,前端修改长度就行
[HNCTF 2022 Week1]Interesting_http
先是传入一个want
然后说不是admin,那我直接改cookie
改了cookie说不是本地,那就xff