ctfhub闯关
目录
第一关(eval执行)
既然都说了是eval执行,先去了解知识点Linux eval命令用法详解:如何动态地执行shell命令(附实例)-Linux入门自学网 (bashcommandnotfound.cn)
eval()是危险的函数,ok啊,那就是一般不会用这个函数咯
其中两种使用方法
eval "$(cat file.txt)"
cmd="ls -l"
eval "$cmd"
在网上搜了一下,然后我就这样写,根据我的经验应该要用这个获取127.0.0.1/flag.php文件,然后就好了,那我怎么用这个获取那个网址下的文件呢
反正得学会把,不能只看答案把
先看一下他给的源码
这个好像是一句话木马啊,才看出来,可以直接用蚁剑连接,因为这个就是这个网站的本目录,他这个是php代码
<?php
if (isset($_REQUEST['cmd'])) {
eval($_REQUEST["cmd"]);
} else {
highlight_file(__FILE__);
}
?>
/cmd=ls,这样写失败
在尝试一下这样写失败,但是报错了,有一点希望了
尝试找网站目录下的flag.php文件,cmd=eval "$(cat var/www/html/flag.php)"这样写失败
你妹的,答案是?cmd=system('ls');
?cmd=system('ls /');
?cmd=system("ls /");
这样就能找到根目录下的文件,这个找到flag的文件,使用cat文件就能看到里面flag的内容
这个需要冒号,具体忘记了,在sql注入好像也要这样
使用?cmd=system("ls /flag_11536");
但是我不理解,为什么说是eval执行,为什么执行的system函数,
懂了,考的是eval函数,他已经写出来了eval函数,让我去利用他,也就是他的作用是可以将一串字符串当做php去执行,也就是说system("ls"); 可以执行这个php代码
还是有点没懂,但是知道的是ctfhub的解析好像确实清晰一点
来自这篇的eval执行 | CTFHub
第二关(文件包含)
这篇文章不错,文件包含 | CTFHub
这题是直接先看答案的,我觉得也有必要去看一下文件包含的知识点的
好像懂了他的网站主页有index.php,这个里面有文件包含漏洞,因为这个题目,看了一下include()函数,他是这样执行的,检查参数后面是否含有flag字段,如果有则输出hack,如果没有,那就包含指定的文件,也就是你包含什么文件都可以,他什么文件都会将里面的内容当做php代码执行,题目中又给我提示了,说这个文件里面有那个命令执行的命令,所以我们只需要包含他就能执行这个命令,怎么包含,只需要在后面加上index.php?file=xx文件,就可以了
这里有点疑问,我觉得应该是index.php是以php结尾的,所以就执行php,
一个是检查index.php,这个就是网站的首页地址,
来自讯飞ai解析
<?php
error_reporting(0); // 关闭错误报告
if (isset($_GET['file'])) {
if (!strpos($_GET["file"], "flag")) { // 检查是否包含"flag"字符串
include $_GET["file"]; // 包含指定的文件
} else {
echo "Hacker!!!"; // 如果包含"flag"字符串,则输出警告信息
}
} else {
highlight_file(__FILE__); // 如果没有提供文件参数,则高亮显示当前文件内容
}
?>
最开始我是这样写的
发现不行,我就看答案了,发现可以用post提交,因为那里是request去接受呀
<?php eval($_REQUEST['ctfhub']);?>
,什么请求都接受,get、post、cookie,里面有这个变量都接受,我怎么知道的,因为小迪讲的,昨天刚看到,我能说什么,爱死你了呀xiaosedi
一样的思路,先看根目录,网站目录没有就看跟目录,一层一层看
找到flag,
第三关(php://input)
我觉得基础知识没必要学这么久,但是也要理解,基础知识学一两天了,还在做这个,所以我直接开了
PHP伪协议的几种使用姿势-腾讯云开发者社区-腾讯云 (tencent.com)
原理,利用php://put协议,图片来源ctfhub——php://input_ctfhubphpinput-优快云博客
利用的两个条件,一下图片来源CTFHUB技能树-RCE - OHuoo - 博客园 (cnblogs.com)
解题:利用php://的协议课执行php的特点,写入php代码
至于为什么不能用hackbar使用post请求,好像使用post请求需要变量来传入参数,比如a=xxx
别人好像可以,可能是因为工具不同把
第四关(远程包含)
发现这个功能还是打开的,依然可以是用php://input伪协议
网上说需要服务器配合去完成,RCE--文件包含--远程文件包含,vps可能就是服务器,可以试用是什么意思,懂了,新人注册云服务器账号可以试用一个月把好像,华为试用一个月,但是我注册过了,
第二种方法,就是使用php://input伪协议
一样的思路
第五关(利用php://filter读取源代码)
还是要截图源代码的习惯才行,这一关的话,先看源代码
这里的话,少了phpinfo文件,不能确定php://input是否可以使用,但是又要我们使用file后面的参数包含php://
<?php
error_reporting(E_ALL);
if (isset($_GET['file'])) {
if ( substr($_GET["file"], 0, 6) === "php://" ) {
include($_GET["file"]);
} else {
echo "Hacker!!!";
}
} else {
highlight_file(__FILE__);
}
?>
<hr>
i don't have shell, how to get flag? <br>
flag in <code>/flag</code>
i don't have shell, how to get flag?
flag in /flag
我是看了答案的,不能使用php://input函数,可能是限制了
但是这个应该可以使用,因为在这两个功能关闭也能正常使用PHP伪协议的几种使用姿势-腾讯云开发者社区-腾讯云 (tencent.com)
使用方法如下,参数resource必选,其他参数可选
构造参数
?file=php://filter/resource=/flag
第六关(命令执行)
这关考的应该是管道符|
,表示把上一条命令的输出作为下一条命令的输入,来自博客园
这篇也挺好的“eval执行”、“命令注入”_ctfhub web eval-优快云博客
方法是这样的,主页有个php文件,打开确实空白的,里面可能有特殊字符,特殊字符就是注释,他不会在网页显示,但是把它加密成base64不就可以打印出来了,
还有个用分号;执行多条命令语句也是可以的,我用的管道符|
这个更好了,来自CTF刷题记录CTFHub-RCE-命令注入_ctfhub命令注入-优快云博客
二、知识点:
1、每个命令之间用(分号)”;”隔开;
说明:各命令的执行结果,不会影响其他命令的。
意思是说每个命令都会执行,但不保证每个命令都执行成功。
2、每个命令之间用&&隔开
说明:若前面的命令执行成功,才会去执行后面的命令。这样的话,可以保证所有的命令执行完毕后,执行的过程都是成功的。
3、每个命令之间用||隔开
说明:||是或的意思,只有前面的命令执行失败后采取执行下一条命令,直到执行成功一条命令为止。
4、|是管道符号。管道符号改变标准输入的源或者是标准输出的目的地。
5、&是后台任务符号。后台任务符号使shell在后台执行该任务,这样用户就可以立即得到一个提示符并继续其他工作。
**
先看下源代码
<?php
$res = FALSE;
if (isset($_GET['ip']) && $_GET['ip']) {
$cmd = "ping -c 4 {$_GET['ip']}";
exec($cmd, $res);
}
?>
<!DOCTYPE html>
<html>
<head>
<title>CTFHub 命令注入-无过滤</title>
</head>
<body>
<h1>CTFHub 命令注入-无过滤</h1>
<form action="#" method="GET">
<label for="ip">IP : </label><br>
<input type="text" id="ip" name="ip">
<input type="submit" value="Ping">
</form>
<hr>
<pre>
<?php
if ($res) {
print_r($res);
}
?>
</pre>
<?php
show_source(__FILE__);
?>
</body>
</html>
这关的flag的代码给我隐藏了,我了个豆啊
还得是用burp咯
我还用了find / -name *flag*都没能找到flag文件,原来就在网站目录下,把它注释了,只是我没找到
第七关(过滤cat)
这里考的是读取文件的常用命令有哪些,有cat、tail、head等命令都可以读取文件
其他步骤和上一关一样
第八关(过滤空格)
将空格替换成<即可完成绕过,其他步骤都是一样的,%20、/**/绕过不了
127.0.0.1<cat flag_25936217919800.php
其他的过滤方法参考CTFHub技能树笔记之RCE:命令注入、过滤cat、过滤空格_ctf命令注入-优快云博客
第九关(过滤目录分割符)
127.0.0.1 | cd flag_is_here;cat flag_25936217919800.php //不知道为什么这么写错了
127.0.0.1 | cd flag_is_here | cat flag_25936217919800.php //这样也不行
本来我这样127.0.0.1 | ls //可以获取当前目录下的文件,但是后面加个分号拼接不起来了。
得这样写127.0.0.1;cd flag_is_here;cat flag_25936217919800.php
这篇文章有很多种字符绕过,借用CTFHub技能书解题笔记-RCE-过滤空格、过滤目录分隔符、过滤运算符-优快云博客
第十关(过滤运算符)
有点懒了,先看一下过滤运算符是什么
ok知道了,是类似|,&,但是也只是过滤了这两个,还有分号;可以利用
<?php
$res = FALSE;
if (isset($_GET['ip']) && $_GET['ip']) {
$ip = $_GET['ip'];
$m = [];
if (!preg_match_all("/(\||\&)/", $ip, $m)) {
$cmd = "ping -c 4 {$ip}";
exec($cmd, $res);
} else {
$res = $m;
}
}
?>
ai解析
这段PHP代码的作用是检查GET请求中是否包含名为'ip'的参数,
并且该参数不为空。如果满足条件,它会尝试执行一个ping命令来测试与该IP地址的网络连接。
如果IP地址中包含"|"或"&"字符,则不会执行ping命令,而是将匹配到的字符存储在$res变量中。
第十一关(综合过滤)
一样先看源代码
<?php
$res = FALSE;
if (isset($_GET['ip']) && $_GET['ip']) {
$ip = $_GET['ip'];
$m = [];
if (!preg_match_all("/(\||&|;| |\/|cat|flag|ctfhub)/", $ip, $m)) {
$cmd = "ping -c 4 {$ip}";
exec($cmd, $res);
} else {
$res = $m;
}
}
?>
这个我好像看的懂一点了
就是过滤了|、&、;、空格、\/、cat、flag、ctfhub。
这些都过滤了
我还绕个屁啊,之前是把运算符给去掉,但是没有吧这个名字给绕过了呀
这样,具体我也不晓得为啥这样写,
先显示这个ls当前目录
http://challenge-519d851fc34c770b.sandbox.ctfhub.com:10800/?ip=127.0.0.1%0als
至于这个为什么要在url上输出呢,我试过了,在那个框框那里输%0a他会再把%0a编码一次,也就是%250a,字符串a不编码,不要问,问就是不知道
至于为什么是%0a呢,试一下不就知道了,终于搞懂了回车与换行的区别 - linux开源系统学习入门提高 - PythonTab中文网
%0a是换行的意思
%0d是回车的意思
/r/n就是我们平常的回车键(回车式的换行)有个crlf漏洞就是利用这个
换行符 '\n' 和 回车符 '\r' 的区别?-腾讯云开发者社区-腾讯云 (tencent.com)
在显示那个目录显示
http://challenge-519d851fc34c770b.sandbox.ctfhub.com:10800/?ip=127.0.0.1%0als%09*is_here
什么是%09呢,ls后面跟着tab键是什么意思呢,我好像猜到了,实践一下
好像是绕过空格,这个tab键在windows操作系统,按tab键会有空格,但是刚在centos系统却不行
*匹配任意字符,后面接指定数字,说明就是这一关文件
引入绕过空格过滤的字符:<
、<>、%20(space)、%09(tab)、$IFS$9、 ${IFS}、$IFS等
最后显示
这个还可以用16进制编码绕过,好像有点麻烦