当前位置:  开发笔记 > 编程语言 > 正文

你对于PHP漏洞有哪些了解?(详细介绍)

针对PHP的网站主要存在下面几种攻击方式,这里介绍下,大家在书写php代码的时候一定要注意下,本篇文章有一定的参考性!
针对PHP的网站主要存在下面几种攻击方式,这里介绍下,大家在书写php代码的时候一定要注意下,本篇文章有一定的参考性!

//ex1.php
";
        system("ls -al ".$dir);
        echo "
"; } ?>

我们提交http://www.sectop.com/ex1.php?dir=| cat /etc/passwd
提交以后,命令变成了 system("ls -al | cat /etc/passwd");

mixed eval(string code_str) //eval注入一般发生在攻击者能控制输入的字符串的时候
//ex2.php


当我们提交 http://www.sectop.com/ex2.php?arg=phpinfo();漏洞就产生了

动态函数


程序员原意是想动态调用A和B函数,那我们提交http://www.sectop.com/ex.php?func=phpinfo 漏洞产生

  • 防范方法
    尽量不要执行外部命令
    使用自定义函数或函数库来替代外部命令的功能
    使用escapeshellarg函数来处理命令参数
    使用safe_mode_exec_dir指定可执行文件的路径
    esacpeshellarg函数会将任何引起参数或命令结束的字符转义,单引号“'”,替换成“\'”,双引号“"”,替换成“\"”,分号“;”替换成“\;”
    用safe_mode_exec_dir指定可执行文件的路径,可以把会使用的命令提前放入此路径内
    safe_mode = On
    safe_mode_exec_di r= /usr/local/php/bin/

客户端脚本植入

  • 客户端脚本植入(Script Insertion),是指将可以执行的脚本插入到表单、图片、动画或超链接文字等对象内。当用户打开这些对象后,攻击者所植入的脚本就会被执行,进而开始攻击。
    可以被用作脚本植入的HTML标签一般包括以下几种:
    "; ?>


    当我们具有admin权限,提交http://localhost/manage/delbook.php?id=2 时,就会删除id为2的留言
    利用方法:
    我们使用普通用户留言(源代码方式),内容为

    
    
    
    


    插入4张图片链接分别删除4个id留言,然后我们返回首页浏览看,没有什么变化。。图片显示不了
    现在我们再用管理员账号登陆后,来刷新首页,会发现留言就剩一条,其他在图片链接中指定的ID号的留言,全部都被删除。
    攻击者在留言中插入隐藏的图片链接,此链接具有删除留言的作用,而攻击者自己访问这些图片链接的时候,是不具有权限的,所以看不到任何效果,但是当管理员登陆后,查看此留言,就会执行隐藏的链接,而他的权限又是足够大的,从而这些留言就被删除了
    修改管理员密码

    //pass.php
    if($_GET["act"])
    {
    $username=$_POST["username"];
    $sh=$_POST["sh"];
    $gg=$_POST["gg"];
    $title=$_POST["title"];
    $copyright=$_POST["copyright"]."
    设计制作:厦门随缘网络科技"; $password=md5($_POST["password"]); if(empty($_POST["password"])) { $sql="update gly set username='".$username."',sh=".$sh.",gg='".$gg."',title='".$title."',copyright='".$copyright."' where id=1"; } else { $sql="update gly set username='".$username."',password='".$password."',sh=".$sh.",gg='".$gg."',title='".$title."',copyright='".$copyright."' where id=1"; } mysql_query($sql); mysql_close($conn); echo ""; }


    这个文件用于修改管理密码和网站设置的一些信息,我们可以直接构造如下表单:

    
    


    存为attack.html,放到自己网站上http://www.sectop.com/attack.html,此页面访问后会自动向目标程序的pass.php提交参数,用户名修改为root,密码修改为root,然后我们去留言板发一条留言,隐藏这个链接,管理访问以后,他的用户名和密码全部修改成了root

    防范方法
    防范CSRF要比防范其他攻击更加困难,因为CSRF的HTTP请求虽然是攻击者伪造的,但是却是由目标用户发出的,一般常见的防范方法有下面几种:
    1、检查网页的来源
    2、检查内置的隐藏变量
    3、使用POST,不要使用GET
    检查网页来源
    在//pass.php头部加入以下红色字体代码,验证数据提交

    if($_GET["act"])
    {
    if(isset($_SERVER["HTTP_REFERER"]))
    {
            $serverhost = $_SERVER["SERVER_NAME"];
            $strurl   = str_replace("http://","",$_SERVER["HTTP_REFERER"]);  
            $strdomain = explode("/",$strurl);           
            $sourcehost    = $strdomain[0];              
            if(strncmp($sourcehost, $serverhost, strlen($serverhost)))
            {
                    unset($_POST);
                    echo "";
            }
    }
    $username=$_POST["username"];
    $sh=$_POST["sh"];
    $gg=$_POST["gg"];
    $title=$_POST["title"];
    $copyright=$_POST["copyright"]."
    设计制作:厦门随缘网络科技"; $password=md5($_POST["password"]); if(empty($_POST["password"])) { $sql="update gly set username='".$username."',sh=".$sh.",gg='".$gg."',title='".$title."',copyright='".$copyright."' where id=1"; } else { $sql="update gly set username='".$username."',password='".$password."',sh=".$sh.",gg='".$gg."',title='".$title."',copyright='".$copyright."' where id=1"; } mysql_query($sql); mysql_close($conn); echo ""; }


    检查内置隐藏变量
    我们在表单中内置一个隐藏变量和一个session变量,然后检查这个隐藏变量和session变量是否相等,以此来判断是否同一个网页所调用

    ";                   echo "alert(‘数据来源异常!');";                  echo " location='index.php';";                           echo "";         }}
    ……
        ">  


    使用POST,不要使用GET
    传递表单字段时,一定要是用POST,不要使用GET,处理变量也不要直接使用$_REQUEST

    http响应拆分

    HTTP请求的格式

    1)请求信息:例如“Get /index.php HTTP/1.1”,请求index.php文件

    2)表头:例如“Host: localhost”,表示服务器地址

    3)空白行

    4)信息正文

    “请求信息”和“表头”都必须使用换行字符(CRLF)来结尾,空白行只能包含换行符,不可以有其他空格符。

    下面例子发送HTTP请求给服务器www.yhsafe.com

    GET /index.php HTTP/1.1↙ //请求信息

    Host:www.yhsafe.com↙ //表头

    ↙ //空格行

    ↙符号表示回车键,在空白行之后还要在按一个空格才会发送HTTP请求,HTTP请求的表头中只有Host表头是必要的饿,其余的HTTP表头则是根据HTTP请求的内容而定。

    HTTP请求的方法

    1)GET:请求响应

    2)HEAD:与GET相同的响应,只要求响应表头

    3)POST:发送数据给服务器处理,数据包含在HTTP信息正文中

    4)PUT:上传文件

    5)DELETE:删除文件

    6)TRACE:追踪收到的请求

    7)OPTIONS:返回服务器所支持的HTTP请求的方法

    8)CONNECT:将HTTP请求的连接转换成透明的TCP/IP通道

    HTTP响应的格式

    服务器在处理完客户端所提出的HTTP请求后,会发送下列响应。

    1)第一行是状态码

    2)第二行开始是其他信息

    状态码包含一个标识状态的数字和一个描述状态的单词。例如:

    HTTP/1.1 200 OK

    200是标识状态的是数字,OK则是描述状态的单词,这个状态码标识请求成功。

    HTTP请求和响应的例子

    打开cmd输入telnet,输入open www.00aq.com 80

    打开连接后输入

    GET /index.php HTTP/1.1↙

    Host:www.00aq.com↙

    使用PHP来发送HTTP请求

    header函数可以用来发送HTTP请求和响应的表头

    函数原型

    void header(string string [, bool replace [, int http_response_code]])

    推荐学习:《PHP视频教程》

    以上就是你对于PHP漏洞有哪些了解?(详细介绍)的详细内容,更多请关注其它相关文章!

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有