Php安全分享会
- 13. Read 类型操作可以用 GET Create Update Delete 类型操作必须用POST 使用 CSRF(Cross-site request forgery) token 防止跨站请求伪造 本站内部操作限制referer 验证码 METHOD OF CRUD
- 15. 图片地址注入: <imgsrc=“javascript:alert(123)”;> css注入: body{background:url(javascript:alert(123));} 更复杂的注入方式……eval: <imgsrc=“img.jpg”alt=“window.open(‘http://sdo.com’)”> <div id=“mycode” style=“background: url('javascript:eval(document.images[0].alt)')"> 跨站脚本XSS
- 16. HTTP截断响应攻击 一般通过如下3个条件可以达成这种攻击(前提是服务器没过滤) Set-Cookie 中的内容用户可以控制 302跳转的 Location 地址用户可以控制 其他自定义Header 用户可以控制 一些web应用程序会使用部分用户输入来生成它们的响应头部的某些值,这方面最简单的例子就是重定向,例如: http://www.test.com/index.php?interface=advanced 如果该参数interface的值是advanced,那么应用程序将响应下列内容: HTTP/1.1 302 Moved Temporarily ….. Location:http://www.test.com/main.php?interface=advanced
- 18. PHP LIFE CIRCLE 随请求到来而生,请求结束则灭,资源全部销毁回收。 最长执行时间限制,CGI默认max_execution_time = 60 若非使用常驻系统的方式运行,很难出现内存泄露。
- 19. 处理用户输入输出 输入数据处理 addslashes() stripslashes() //请成对使用 Htmlspecialchars() // 转义 $ ‘ “ < > magic_quotes_gpc// PHP 5.3不建议使用 magic_quotes_runtime // PHP 5.3不建议使用 mysql_real_escape_string //插入数据库前进行转义 PHP用户可控制的所有目标变量 完全控制:$_GET、$_POST、$_COOKIE 半控制:$_FILES、$_SERVER、$_SESSION
- 22. PHP变量覆盖 Extract()作用:展开数组中的键值对到符号表 函数声明: int extract ( array $var_array [, int $extract_type = EXTR_OVERWRITE [, string $prefix ]] ) $var_array为需要被展开的数组, $extract_type为展开模式(默认为覆盖模式EXTR_OVERWRITE), $prefix为前缀(个别模式下不能为空或者数字类型) 常见用法: $array=Array(‘var’=> ‘2’, ’foo’=>’hoho’); Extract($array); echo $var; // 2 echo $foo; // ‘hoho’ 危险所在 如果被extract的数组中出现了可以被用户控制键值对……
- 23. PHP变量类型 PHP是弱类型语言 变量声明时不需要声明类型 变量赋值后可以随意改变变量类型 弱类型语言的陷阱 判断值内容时慎用 == ,以下返回均为True 0==“0”,0==“” , 555 = “555”, true ==1 , true==“Hi” “”==null , 0==null , False==null , Array() ==null … 使用严格相等===时,以上均为False 潜在的危险?使用如下语句判断变量时 If($type ==“admin”) …..// 假如$type=true,会发生什么?
- 24. PHP文件操作 目录操作 opendir(),readdir(),closedir(), dirname(),basename(),disk_free_space() mkdir(), rmdir(),chdir() Class DirectoryIterator 文件操作 file_exists(),is_readable(), is_writable(), filesize(), stat() fopen(), fread(), fwrite(), fclose(),flock() file_get_contents(), file_put_contents () // avaliable in php 5 copy(),unlink() require(), include() // 小心远程包含 include $base . ‘xx.php’ Class SplFileInfo
- 25. 文件上传 文件类型判断 $_FILES[‘userfile’][‘type’]检测的是header中的MIME信息 图片附件可以用$image=getimagesize($_FILES[‘userfile’][‘tmp_name’]);检测$imageinfo[‘mime’]来进行判断。 文件附件中的可执行权限限制 上传文件名截断攻击readme.php%00.txt(中间有个NUL)可以绕过部分扩展名检测 防范图片式木马,cmd下输入如下类似命令: copy google.gif /b + phpinfo.php /a phpinfo.gif 就可以生成一个google.gif,附带phpinfo页面的木马。
- 26. 慎用eval 强大的eval 用法:eval($str); 作用: $str中的内容会被当作php语句而执行。在很多模板分离的PHP系统中都比较常见,特别是discuz的模板页面。 黑暗历史: discuz的好几个次被攻击都与eval漏洞有关 典型的php一句话木马的内容 <?php @ eval($_POST[‘cmd’]);
- 28. 系统命令调用 调用系统命令? system(),exec(), passthru(), shell_exec() , popen()… 指定外部可执行程序的目录 作用:特定目录中的外部程序才可以被执行,对其它程序的调用将被拒绝 方法:规定执行目录safe_mode_exec_dir,或者编译时使用--with-exec-dir,默认是 /usr/local/php/bin 设定可执行文件操作的目录 open_basedir将PHP允许操作的所有文件(包括文件自身)都限制在此组目录列表下。 当一个脚本试图打开一个指定目录树之外的文件时,将引发一个Fatal error。