在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了

最新文章

  1. Sqlite 存储自定义对象
  2. NOIP水题合集[3/未完待续]
  3. Scala:条件表达式的好处
  4. 瞎折腾之Mvc WebApi的使用以及跨域问题
  5. android 自定义用相机拍照后的照片存储位置
  6. 淘宝JAVA中间件Diamond详解(一)---简介&amp;快速使用
  7. asp.net cookie和session的详细使用
  8. CxImage的使用
  9. 区间dp-zoj3541-The Last Puzzle
  10. 关于asyncio知识(一)
  11. _recruit
  12. Scala map与flatMap
  13. Python用re正则化模块在字符串查找特定字符串
  14. 利用Makefile安装helloworld模块(速成)
  15. iOS : 判断运行设备类型是否是iPad
  16. SSIS实践入门3:把SSIS程序包从A电脑到B电脑的转移
  17. .NET基础知识(一、认识.Net)
  18. 基本SQL命令
  19. MVVM的本质:视图逻辑处理、视图管理、视数中间层
  20. 不用配置 , 快速搭建react环境

热门文章

  1. Django Signals
  2. JavaScript的数据类型和数据类型的检测
  3. notepad文件对比
  4. 。SLI,Service Level Indicator,服务等级指标,其实就是我们选择哪些指标来衡量我们的稳定性。而 SLO,Service Level Objective,服务等级目标,指的就是我们设定的稳定性目标,比如“几个 9”这样的目标。
  5. 选出ip记录表最近的10行数据
  6. Springboot中mybatis控制台打印sql语句
  7. git database 数据库 平面文件 Git 同其他系统的重要区别 Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异 Git 的设计哲学
  8. Centos 7 安装 erlang
  9. postgresql 知识的整理
  10. tarjan 复习笔记 割点与桥