关于assert函数
官方文档:PHP: assert - Manual
在PHP版本<7.0时
assert会将传入的参数试着作为PHP代码去执行,这个参数可以是一个函数或者是一个表达式(是表达式时和本文讨论内容关系不大,具体请参考官方文档中的演示)也可以是一个字符串。在参数是字符串时则对其中的PHP代码语法要求不严格(字符串中的PHP代码最后一句代码尾端的;可以省略,其余的则不行),但对于多句PHP代码组成的字符串只会执行第一句(如果这个字符串中PHP代码存在语法错误则该字符串中的所有PHP代码均不会被执行)。
在PHP版本>=7.0时
在这时PHP对于assert函数进行了更新(具体是在PHP7的哪个版本这里博主并不清楚Orz,但这个更新导致的后果通常是对于7.0及以上的版本来讨论的),assert在更新后无法将使用字符串作为参数,而传入GET或POST的数据默认的类型就是字符串,这就导致了assert不适宜再用来直接写马。
奇怪的特性
assert无法执行关于echo的代码,起初以为是echo是语言构造器的原因,但是用了同为语言构造器的print,发现却能用,emmmm…
关于eval函数
官方文档:PHP: eval - Manual
eval会将传入的字符串作为PHP代码来进行解析,字符串中可以包含多句PHP代码,且所有的PHP代码均会被执行,但如果存在语法错误则整个字符串中的PHP代码均不会执行。字符串中可以包含PHP标签,但必须和已存在的标签闭合(PHP文件头部和尾部的PHP标签)。此外eval并没有assert的奇怪特性,关于echo的代码能够被正常执行。
关于蚁剑
要明白为什么会此前payload中仅有部分可用就得先明白蚁剑通过payload中的SHELL究竟干了啥,这里用wireshark看下蚁剑发的包(这里蚁剑编码采用了base64,用default会导致有时的连不上马)。
可以看到蚁剑使用了POST方式对cmd传入eval执行一个随机生成的POST变量名的值base64解码,并且获得了相应的响应,便有了蚁剑绿色框显示的连接成功。这里将POST变量名的值转码一下再继续观察。
通过观察这段蚁剑测试连接起主要作用代码,不难发现两个特点:
使用了echo
由多句PHP代码构成
那么结论就明了了,关于payload部分可用的结果可以做出如下解释:
使用GET值作为马的连接密码的payload全部不可连接->蚁剑探测马是否可以用只使用了POST方式进行探测
仅使用assert的payload不可连接->原因有两个,一是因为蚁剑用来探测的语句由多句PHP代码构成,但assert只能执行第一句PHP代码;二是因为探测的语句使用了echo,而assert无法执行关于echo的代码
参考文章:https://www.cnblogs.com/Article-kelp/p/14704975.html