当前位置: 首页 > news >正文

CTF_1

CTF_Show

萌新赛

1.签到题

<?php 
if(isset($_GET['url'])){system("curl https://".$_GET['url'].".ctf.show");
}else{show_source(__FILE__);
}?>

和 AI 一起分析

1.if(isset($_GET['url']))检查GET请求中是否存在名为url的参数。

curl

2.curl是一个利用URL语法在命令行方式下工作的文件传输工具,它支持多种协议,包括HTTP、HTTPS、FTP等。

基本用法

curl [url?param1=value1]                   默认为 get 请求

curl -data "param1=value1" [url]        POST请求

curl -o filename [url]                           下载文件

curl -F filename [url]                            上传文件

由于 用户输入命令被直接拼接到 system 里执行,故可以用 ; 来分隔不同语句(Linux)

==》

?url=love;ls;love

关键在于  ;ls;

复原后为

curl http://love;ls;love.ctf.show

?url=love;less flag;love

ctfshow{b3f6c155-0fd8-4a2b-baf4-7f1c798379e9}

less 命令:

  • less file,打开文件,并允许逐页浏览内容
  • Page Upb:向上翻页。
  • Page DownSpace:向下翻页。
  • /word:向下搜索“word”这个词。

2.假生赛

<?php
session_start();
include('config.php');
if(empty($_SESSION['name'])){show_source("index.php");
}else{$name=$_SESSION['name'];$sql='select pass from user where name="'.$name.'"';echo $sql."<br />";system('4rfvbgt56yhn.sh');$query=mysqli_query($conn,$sql);$result=mysqli_fetch_assoc($query);if($name==='admin'){echo "admin!!!!!"."<br />";if(isset($_GET['c'])){preg_replace_callback("/\w\W*/",function(){die("not allowed!");},$_GET['c'],1);echo $flag;}else{echo "you not admin";}}
}
?>

题目提示 register.php,login.php,是两个登录窗口

根据index里的内容判断,首先需要以admin身份登录(session认证),然后传入c绕过正则

这里注册同名账号admin

直接注册 admin空格 ,pass=1

登录成功

分析 index.php 的判断语句

这里的正则表达式/\w\W*/意味着匹配一个单词字符(\w)后面跟着任意数量的非单词字符(\W*)。这个正则表达式可以匹配任何非空字符串。

工作原理是查找匹配非空字符串,并使用一个回调函数来替换它们。在这个例子中,回调函数是一个匿名函数,当匹配到任何字符串时,它会终止脚本执行(die("not allowed!")),并且不会替换任何内容。

1preg_replace_callback函数的第四个参数,表示只进行一次替换。

传入 c=666,也被当作字符,不行;c留空,即c=

得到flag

ctfshow{1f7d382e-2ca1-4f55-89a0-7586f4a58826}

瞅了一眼官方wp

这题其实考的是二次注入。可以注册和登陆。登陆后会将用户名带入查询。
需要成为admin。进入下一关
预期解:
二次注入。写入session内容为name|s:5:"admin";。然后替换session就能成为admin用户。
因为session实质上是将数据序列化后存入session_对应sessionID的。
比如/tmp/sess_2bevmvtacut18mlo3de90j6hha内容是name|s:5:"admin";
那么sessid为2bevmvtacut18mlo3de90j6hha的用户就是admin。
payload:
" union select unhex('6e616d657c733a353a2261646d696e223b') into outfile '/tmp/sess_2bevmvtacut18mlo3de90j6hha'#
然后替换sessionid登陆即可。
然而。在写入session时。是以mysql用户写入的。而session文件必须和中间件(apache)是同一用户。当时部署环境时。修改所属用户的脚本没写好。所以没部署成功就上线了。
非预期1:
群主直接在数据库中。插入了admin用户的数据。导致二次注入可以拿到admin密码。从而登陆
非预期2:
由于源码中只将输入小写。判断admin。并没有去除空格。而插入数据库时。mysql会自动忽略空格。所以注册admin空格。可以绕过检测。并成功插入数据库。从而登陆

直接对于session和数据库操作不熟,还是得练。

http://www.lryc.cn/news/507636.html

相关文章:

  • 【系统】Mac crontab 无法退出编辑模式问题
  • K8s中 statefulset 和deployment的区别
  • springboot中的AOP以及面向切面编程思想
  • 降低Mobx技术债问题-React前端数据流方案调研整理
  • RabbitMQ消息可靠性保证机制7--可靠性分析-rabbitmq_tracing插件
  • SQL进阶技巧:如何求解直接线上最多的点数?
  • 【老白学 Java】泛型应用 - 卡拉 OK(四)
  • android studio更改应用图片,和应用名字。
  • SQL Server 表值函数使用示例
  • SpringBoot项目的创建方式
  • 微服务设计(第2版)读书笔记
  • idea无法识别文件,如何把floder文件恢复成model
  • vscode的keil assistant 中搜索不到全局变量
  • html+css网页设计 美食 餐饮杰12个页面
  • 重撸设计模式--代理模式
  • Redis性能调优:深入剖析变慢原因及应对策略
  • Python联合Halcon的详细教程
  • raid 状态查看 storcli64
  • 时间管理系统|Java|SSM|JSP|
  • 使用Docker启用MySQL8.0.11
  • Qt之修改窗口标题、图标以及自定义标题栏(九)
  • 每天40分玩转Django:Django测试
  • JS子页面调用父页面函数,监听刷新事件
  • Element@2.15.14-tree checkStrictly 状态实现父项联动子项,实现节点自定义编辑、新增、删除功能
  • 详细介绍如何使用rapidjson读取json文件
  • 【Qt】显示类控件:QLabel、QLCDNumber、QProgressBar、QCalendarWidget
  • 设计模式-访问者设计模式
  • Spring框架IOC
  • 有哪些免费的 ERP 软件可供选择?哪些 ERP 软件使用体验较好?
  • 思科CCNA认证都学什么考什么?