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