apache 解析漏洞(CVE-2017-15715)
在p牛博客最近更新的文章,传送门,感觉很有意思,自己在自己本地测试了一下
0x01 正则表达式中的 ‘$’
apache这次解析漏洞的根本原因就是这个 $
,正则表达式中,我们都知道$用来匹配字符串结尾位置,我们来看看菜鸟教程中对正则表达符$
的解释:
匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 $ 字符本身,请使用 \$。
那么就明白了,在设置了 RegExp 对象的 Multiline 属性的条件下,$
还会匹配到字符串结尾的换行符
0x02 Linux环境
这里本地是debian系的kali linux,apache配置文件路径在/etc/apache2/
下,apache2.conf
是apache核心配置文件,由于我本地php作为apache的mod方式运行的,所以需要在mods-enabled
目录下找到关于apache-php模块的配置:
可以看见php7.0.conf是mods-available/php7.0.conf
的软链接,配置如下:
<FilesMatch ".+\.ph(p[3457]?|t|tml)$">
SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch ".+\.phps$">
SetHandler application/x-httpd-php-source
# Deny access to raw php sources by default
# To re-enable it's recommended to enable access to the files
# only in specific virtual host or directory
Require all denied
</FilesMatch>
# Deny access to files without filename (e.g. '.php')
<FilesMatch "^\.ph(p[3457]?|t|tml|ps)$">
Require all denied
</FilesMatch> # Running PHP scripts in user directories is disabled by default
#
# To re-enable PHP in user directories comment the following lines
# (from <IfModule ...> to </IfModule>.) Do NOT set it to On as it
# prevents .htaccess files from disabling it.
<IfModule mod_userdir.c>
<Directory /home/*/public_html>
php_admin_flag engine Off
</Directory>
</IfModule>
第一行就告诉了我们apache会将哪些后缀的文件当做php解析:
<FilesMatch ".+\.ph(p[3457]?|t|tml)$">
以如下方式结尾的文件会被apache当做php解析:
php
php3
php4
php5
php7
pht
phtml
如果我们再结合我们上面提到的关于$
的使用,很容易想到,如果后缀名是上面这些后缀名以换行符结尾,那么也是可以解析的,本地构造文件:
文件构造好了,从浏览器打开试试看看能不能解析:
可以看见是能解析的,那么在文件上传黑名单就可以通过这种思路来绕过了。
0x02 Windows环境
关于windows环境,p牛博客下面有一些人说测试失败,我也进行了测试,虚拟机环境 win7+phpstudy : Apache/2.4.23 (Win32) OpenSSL/1.0.2j PHP/5.4.45
配置文件(${Apache_path}/conf/extra/httpd-php.conf)如下:
LoadFile "C:/Users/admin/Desktop/phpstudy/php/php-5.4.45/php5ts.dll"
LoadModule php5_module "C:/Users/admin/Desktop/phpstudy/php/php-5.4.45/php5apache2_4.dll"
<IfModule php5_module>
PHPIniDir "C:/Users/admin/Desktop/phpstudy/php/php-5.4.45/"
</IfModule>
LoadFile "C:/Users/admin/Desktop/phpstudy/php/php-5.4.45/libssh2.dll"
<FilesMatch "\.php$">
SetHandler application/x-httpd-php
</FilesMatch>
用p牛的代码测试:
<html>
<body> <form action="test.php" method="post" enctype="multipart/form-data"> <input type="file" name="file" /> <input type="text" name="name" /> <input type="submit" value="上传文件" /> </form> </body>
</html>
<?php
if(isset($_FILES['file'])) {
$name = basename($_POST['name']);
$ext = pathinfo($name,PATHINFO_EXTENSION);
if(in_array($ext, ['php', 'php3', 'php4', 'php5', 'phtml', 'pht'])) {
exit('bad file');
}
move_uploaded_file($_FILES['file']['tmp_name'], './' . $name);
}
?>
抓包修改文件名,上传:
可以看见,这里出现了两个warning,其实并非测试不成功,可以看见其实是绕过了我们代码里的黑名单的,已经执行到了move_uploaded_file
了,说明程序并没有因为没有绕过黑名单而exit,但是因为涉及到文件读写,而windows操作系统不允许后缀以换行符结尾的文件命名方式,所以这里会文件会创建失败,就出现了这两个warning了
最新文章
- Sqlite 存储自定义对象
- NOIP水题合集[3/未完待续]
- Scala:条件表达式的好处
- 瞎折腾之Mvc WebApi的使用以及跨域问题
- android 自定义用相机拍照后的照片存储位置
- 淘宝JAVA中间件Diamond详解(一)---简介&;快速使用
- asp.net cookie和session的详细使用
- CxImage的使用
- 区间dp-zoj3541-The Last Puzzle
- 关于asyncio知识(一)
- _recruit
- Scala map与flatMap
- Python用re正则化模块在字符串查找特定字符串
- 利用Makefile安装helloworld模块(速成)
- iOS : 判断运行设备类型是否是iPad
- SSIS实践入门3:把SSIS程序包从A电脑到B电脑的转移
- .NET基础知识(一、认识.Net)
- 基本SQL命令
- MVVM的本质:视图逻辑处理、视图管理、视数中间层
- 不用配置 , 快速搭建react环境
热门文章
- Django Signals
- JavaScript的数据类型和数据类型的检测
- notepad文件对比
- 。SLI,Service Level Indicator,服务等级指标,其实就是我们选择哪些指标来衡量我们的稳定性。而 SLO,Service Level Objective,服务等级目标,指的就是我们设定的稳定性目标,比如“几个 9”这样的目标。
- 选出ip记录表最近的10行数据
- Springboot中mybatis控制台打印sql语句
- git database 数据库 平面文件 Git 同其他系统的重要区别 Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异 Git 的设计哲学
- Centos 7 安装 erlang
- postgresql 知识的整理
- tarjan 复习笔记 割点与桥