网站建设验收方式,池州网站网站建设,手机网站制作相关文章,烦恼可以做网站吗一、文件包含漏洞严格来说#xff0c;文件包含就是代码注入的一种。代码注入#xff0c;其原理就是注入一段用户能控制的脚本或代码并让服务器端执行。代码注入的典型代表就是文件包含。文件包含可能会出现在JSP、PHP、ASP等语言中#xff0c;常见函数如下#xff1a;PHP文件包含就是代码注入的一种。代码注入其原理就是注入一段用户能控制的脚本或代码并让服务器端执行。代码注入的典型代表就是文件包含。文件包含可能会出现在JSP、PHP、ASP等语言中常见函数如下PHPinclude()、include_once()、require()、require_once()、fopen()、readfile()……JSP/Servletava.io.File()、java.io.FileReader()……ASPinclude file 、include virtual……PHP当使用include()、include_once()、require()、require_once()这四个函数包含一个新文件时该文件会被当做PHP代码执行且不在意被包含的文件是什么类型。想要成功利用文件包含漏洞需要满足两个条件include()等函数通过动态变量的方式引入需要包含的文件用户能够控制该动态变量1.1 本地文件包含可以温习一下dvwa的文件包含DVWA文件包含漏洞通常控制参数的值为../../etc/password代表php将访问/etc/password文件字符串截断也是文件包含中常用的技巧%00截断可以用0字节\x00作为字符串结束符长度截断目录字符串在Windows下256字节、Linux下4096字节时会达到最大值最大值长度之后的字符串会被丢弃可构造./././././././././././././abc或/abc或../1/abc/../1/abc/../1/abc通过../../../这种方式返回上层目录这种方式又被称为”目录遍历“可以通过不同编码方式来绕过但是当PHP配置了open_basedir时会使得目录遍历失效。open_basedir的作用是限制在某个特定目录下PHP能打开的文件其作用与safe_mode是否开启无关。主要注意的是open_basedir的值是目录的前缀如果open_basedir /home/app/aaa那么以下目录都是合理的/home/app/aaa/home/app/aaa123/home/app/aaabbb1.2 远程文件包含如果PHP的配置选项allow_url_includeON则include和require函数可以加载远程文件1.3 本地文件包含的利用技巧包含用户上传的文件如果文件内容包含PHP代码则这些代码会被include()加载后执行包含data://或php://input等伪协议前提是allow_url_includeON可以参考之前的文章php文件包含常用伪协议包含Session文件PHP默认生成的Session文件往往放在/tmp目录下/tmp/sess_SESSIONID包含日志文件比如Web Server的access log服务器一般会往Web Server的access log里记录客户端的请求信息在error_log里记录出错请求。因此攻击者可以间接地将PHP代码写到日志文件中在文件包含时只需要包含日志文件即可。包含/proc/self/environ文件http://www.website.com/view.php?page../../../../../proc/self/environ通常在User-Agent里注入PHP代码最终完成攻击包含上传的临时文件包含其他应用创建的文件比如数据库文件、缓存文件、应用日志等二、变量覆盖漏洞2.1 全局变量覆盖PHP中使用变量不需要初始化当register_globalsON时变量来源于各个不同的地方很可能会导致安全问题。类似的通过GLOBALS获取的变量也可能导致变量覆盖2.2 extract()变量覆盖extract() 函数从数组中将变量导入到当前的符号表。extract(array,extract_type,prefix)该函数使用数组键名作为变量名使用数组键值作为变量值。针对数组中的每个元素将在当前符号表中创建对应的一个变量。第二个参数 type 用于指定当某个变量已经存在而数组中又有同名元素时extract() 函数如何对待这样的冲突。最常见的两个值是”EXTR_OVERWRITE“和”EXTR_SKIP“。当值为”EXTR_OVERWRITE“时如果变量名冲突则覆盖已有变量值为”EXTR_SKIP“则表示跳过不覆盖。默认是”EXTR_OVERWRITE“。2.3 遍历初始化变量常见的一些以遍历的方式释放变量的代码可能会导致变量覆盖。$chs ;
if($_POST $charset ! utf-8){$chs new Chinese(UTF-8,$charset;foreach($_POST as $key $value){$$key $chs-Convert ($value);}unset($chs);若提交参数chs则可能覆盖变量”$chs“的值。2.4 import_request_variavles变量覆盖bool import_request_variables ( string $types [, string $prefix ] )import_request_variavles将GET、POST、Cookie中的变量导入到全局使用这个函数只需要简单地指定类型即可。第二个参数是为导入的变量添加的前缀若没有指定则将覆盖全局变量。2.5 parse_str()变量覆盖parse_str(string,array)该函数用于解析URL的query string但是当参数值能被用户控制时可能导致变量覆盖如果指定了第二个参数则会将query string中的变量解析后存入该数组变量中。因此在使用该函数时应该养成指定第二个参数的好习惯针对覆盖变量的安全建议1.确保register_globals OFF2.熟悉可能造成变量覆盖的函数和方法检查用户能否控制变量来源3.养成初始化变量的好习惯三、代码执行漏洞3.1 危险函数执行代码危险函数例如popen()、system()、passthru()、exec()等都可以执行系统命令eval()函数也可以执行PHP代码3.2 文件写入执行代码可以参考vulhub漏洞复现的文章CVE-2016-3088 ActiveMQ任意文件写入漏洞3.3 其他执行代码方式直接执行代码的函数PHPeval()、assert()、system()、exec()、shell_exec()、passthru()、escapeshellcmd()、pcntl_exec()等文件包含函数PHPinclude()、include_once()、require()、require_once()本地文件写入函数file_put_contents()、fwrite()、fputs()等preg_replace()代码执行如果是/e模式则允许代码执行也可能通过%00截断注入/e可参考Thinkphp 2.x 任意代码执行的漏洞复现Thinkphp 2.x 任意代码执行动态函数执行调用函数直接导致代码执行create_function()也具有此能力Curly SyntaxPHP的Curly Syntax也能导致代码执行它将执行{……}间的代码并将结果替换回去如?php
$var I was innocent until ${ls} appeared here;
?ls命令将列出本地目录的文件并将结果返回回调函数执行代码很多函数都可以执行回调函数当回调函数用户可控时将导致代码执行unserialize()导致代码执行unserialize()就是反序列化函数它能将序列化的数据重新映射为PHP变量。但是unserialize()在执行时如果定义了__destruct()函数或wakeup()函数这两个函数将执行。unserialize()代码执行有两个条件一是unserialize()的参数用户可控这样可以构造出需要反序列化的数据结构二是存在__destruct()函数或wakeup()函数这两个函数决定执行的代码。四、定制安全的PHP环境推荐php.ini中一些相关安全参数的配置reguster_globalsOFFopen_basedir在设置目录时应该在最后加上”/否则会被认为是前缀allow_url_includeOFFallow_uel_fopenOFFdisplay_errorsOFFlog_errorsONmagic_quotes_gpcOFFcgi.fix_pathinfo0session.cookie_httponly1session.cookie_secure1……