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 Up
或b
:向上翻页。Page Down
或Space
:向下翻页。/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!")
),并且不会替换任何内容。
1
是preg_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和数据库操作不熟,还是得练。