web渗透测试最全实战课程--渗透测试视频教程-信息安全-CSDN程序员研修院实战化课程,学完就挖SRC 学会更多实战技巧-https://edu.csdn.net/course/detail/32713
文件上传漏洞的相关讲解基于upload-labs靶场,搭建教程见文件上传漏洞靶机搭建教程
.user.ini绕过
浏览器访问http://127.0.0.1/Pass-05/index.php进入靶机pass05 环境练习页面:
(注意:该pass要求php版本大于等于5.3.0版本)
通过查看提示和文件源码发现,本pass将.php ,.php5 ,.php4 ,.php3 ,.php2 ,.html ,.htm ,.phtml ,.pht ,.pHp ,.pHp5 ,.pHp4 ,.pHp3 ,.pHp2 ,.Html ,.Htm ,.pHtml ,.jsp ,.jspa ,.jspx ,.jsw ,.jsv ,.jspf ,.jtml ,.jSp ,.jSpx ,.jSpa ,.jSw ,.jSv ,.jSpf ,.jHtml ,.asp ,.aspx ,.asa ,.asax ,.ascx ,.ashx ,.asmx ,.cer ,.aSp ,.aSpx ,.aSa ,.aSax ,.aScx ,.aShx ,.aSmx ,.cEr ,.sWf ,.swf 以及.htaccess 都过滤了,此处不能和pass04一样的技巧进行上传.htaccess 文件进行绕过。
解决方法
补充知识:
php.ini 的搜索路径如下(按顺序):
-
SAPI 模块所指定的位置(Apache 2 中的 PHPIniDir 指令,CGI 和 CLI 中的 -c 命令行选项)。 -
PHPRC 环境变量。 -
可以为不同版本的 PHP 指定不同的 php.ini 文件位置。注册表目录所在的位置取决于你的系统是 32 位还是 64 位。32-bit 的 PHP 运行在 32-bit 的系统或 64-bit 的 PHP 运行在 64-bit 系统时使用 [(HKEY_LOCAL_MACHINE\SOFTWARE\PHP] 32-bit 的 PHP 运行在 64-bit 的系统上时,则使用 [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\PHP] ] 替代。 系统版本跟 PHP 版本架构一致时,会按以下顺序依次进行检查: [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y.z] , [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y] 和 [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x] ,其中的 x,y 和 z 指的是 PHP 主版本号,次版本号和发行批次。 对于 32 bit 版本的 PHP 运行在 64 bit 系统上的情况,则会按以下顺序依次进行检查: [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x.y.z] , [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x.y] 和 [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x] ,其中的 x,y 和 z 指的是 PHP 主版本号,次版本号和发行批次。如果在其中任何目录下的 IniFilePath 有键值,则第一个值将被用作 php.ini 的位置(仅适用于 Windows)。 -
[HKEY_LOCAL_MACHINE\SOFTWARE\PHP] 内 IniFilePath 的值(Windows 注册表位置)。 -
当前工作目录(对于 CLI)。 -
web 服务器目录(对于 SAPI 模块)或 PHP 所在目录(Windows 下其它情况)。 -
Windows 目录(C:\windows 或 C:\winnt),或 --with-config-file-path 编译时选项指定的位置。
如果存在 php-SAPI.ini(SAPI 是当前所用的 SAPI 名称,因此实际文件名为 php-cli.ini 或 php-apache.ini 等),则会用它替代 php.ini。SAPI 的名称可以用 php_sapi_name() 来测定。
除了主 php.ini 之外,PHP 还会在每个目录下扫描 INI 文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录。如果被执行的 PHP 文件在 web 根目录之外,则只扫描该目录。
自php5.3.0起,PHP支持基于每个目录的.htaccess风格的INI文件。此类文件仅被CGI/Fastcgi sapi 处理。
两个新的 INI 指令, user_ini.filename 和 user_ini.cache_ttl 控制着用户 INI 文件的使用。
user_ini.filename 设定了 PHP 会在每个目录下搜寻的文件名;如果设定为空字符串则 PHP 不会搜寻。默认值是 .user.ini 。
user_ini.cache_ttl 控制着重新读取用户 INI 文件的间隔时间。默认是 300 秒(5 分钟)。
在 .user.ini 风格的 INI 文件中只有具有 PHP_INI_PERDIR 和 PHP_INI_USER 模式的 INI 设置可被识别。
补充知识:
PHP_INI_* 模式的定义
模式 | 含义 |
---|
PHP_INI_USER | 可在用户脚本 或 Windows 注册表 以及.user.ini 中设定 | PHP_INI_PERDIR | 可在php.ini ,.htaccess 或 httpd.conf 以及 .user.ini 中设定 | PHP_INI_SYSTEM | 可在 php.ini 或 httpd.conf 中设定 | PHP_INI_ALL | 可在任何地方设定 |
实际上,除了PHP_INI_SYSTEM以外的模式都是可以通过.user.ini来设置的。而且,和php.ini不同的是,.user.ini是一个能被动态加载的ini文件。也就是说修改了.user.ini后,不需要重启服务器中间件,只需要等待user_ini.cache_ttl 所设置的时间(默认为300秒),即可被重新加载。
这里就很清楚了,.user.ini 实际上就是一个可以由用户”自定义“的php.ini,我们能够自定义的设置是模式为“PHP_INI_PERDIR 、 PHP_INI_USER”的设置。
其中有两个配置,可以用来制造后门:
auto_append_file ? ; 指定一个文件,自动包含在要执行的文件前。
auto_prepend_file ; 指定一个文件,自动包含在要执行的文件后。
使用方法很简单,直接写在.user.ini中:
auto_prepend_file=test.txt
或者
auto_append_file=test.txt
-
新建一个文件名为.user.ini 的文件,并将内容写为:
-
将.user.ini 上传至服务器 -
新建一个文件名为test.txt 的文件,并将内容写为:
-
<?php phpinfo();?> 或者webshell
-
将test.txt 上传至服务器 -
再访问上传目录下的readme.php,即可将test.txt内的内容脚本正常执行。
后缀大小写绕过
浏览器访问http://127.0.0.1/Pass-06/index.php进入靶机pass06 环境练习页面:
通过查看提示和文件源码发现,本pass将.php ,.php5 ,.php4 ,.php3 ,.php2 ,.html ,.htm ,.phtml ,.pht ,.pHp ,.pHp5 ,.pHp4 ,.pHp3 ,.pHp2 ,.Html ,.Htm ,.pHtml ,.jsp ,.jspa ,.jspx ,.jsw ,.jsv ,.jspf ,.jtml ,.jSp ,.jSpx ,.jSpa ,.jSw ,.jSv ,.jSpf ,.jHtml ,.asp ,.aspx ,.asa ,.asax ,.ascx ,.ashx ,.asmx ,.cer ,.aSp ,.aSpx ,.aSa ,.aSax ,.aScx ,.aShx ,.aSmx ,.cEr ,.sWf ,.swf 以及.htaccess ,INI 都过滤了,但是仔细观察发现本pass并未对后缀名进行统一转换小写操作,那么就可以考虑进行后缀名大小写进行绕过。
解决方法
-
新建一个后缀名不在上述黑名单中的php文件,例如:shell.PHP或者shell.Php -
将新建的文件上传至服务器,发现上传成功。 -
访问被上传的文件发现文件被解析并执行 ?
|