版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、CVE-2019-11043 PHP-fpm 远程代码执行漏洞分析 作者:LoRexxar知道创宇404实验室 原文链接:/1063/本文由 干货 收集整理:/test/index.php20Copyright 404 TeamfromKnownsec. 报分析经验心得Web 安全二进制安全移动安全安全基础&教学篇CTFIoT安全区块链404 专栏专题报告 404 English Paper如何投稿归档文件 首页漏洞分析安全工具&安全开RSS 订 阅 投 稿 SearchPaper安全技术精粹PHP-fpm 远程
2、代码执行漏洞(CVE-2019-1 043)分析 2019年10月25日 漏洞分析 404专栏 作者:LoRexxar知道创宇404实验室时间:2019年10月25日英文版本: /1064/国外安全研究员 Andrew Danau在解决一道 CTF 题目时发现,向目标服务器 URL 发送 %0a 符号时,服务返回异常,疑似存在漏洞。 2019年10月23日,github公开漏洞相关的详情以及exp。当nginx配置不当时,会导致php-fpm远程任 意代码执行。 下面我们就来一点点看看漏洞的详细分析,文章中漏洞分析部分感谢团队小伙伴Hcamael#
3、知道创宇 404实验室 漏洞复现 为了能更方便的复现漏洞,这里我们采用vulhub来构建漏洞环境。 /vulhub/vulhub/tree/master/php/CVE-2019-11043git pull 并docker-compose up -d访问http:/your_ip:8080/下载github上公开的exp(需要go环境)。 go get /neex/phuip-fpizdam然后编译 go install /neex/phuip-fpizdam使用exp攻击demo网站 phuip-fpizdam htt
4、p:/your_ip:8080/攻击成功 漏洞分析 在分析漏洞原理之前,我们这里可以直接跟入看修复的commit-/php/php-src/commit/ab061f95ca966731b1c84cf5b7b20155c0a1c06a#diff- 624bdd47ab6847d777e15327976a9227从commit中我们可以很清晰的看出来漏洞成因应该是path_info 的地址可控导致的,再结合漏洞发现者公开的漏洞信息中提到 The regexp in fastcgi_split_path_info directive can be broken u
5、sing the newline char acter (in encoded form, %0a). Broken regexp leads to empty PATH_INFO, which triggers t he bug.也就是说,当path_info 被%0a截断时, path_info 将被置为空,回到代码中我就不难发现问题所在了。 其中env_path_info 就是变量path_info 的地址, path_info 为0则plien 为0.slen 变量来自于请求后url的长度 int ptlen = strlen(pt); int slen = len - ptlen;其
6、中 int len = script_path_translated_len;len为url路径长度 当请求url为/index.php/123%0atest.phpscript_path_translated来自于nginx的配置,为/var/www/html/index.php/123ntest.phpptlen则为url路径第一个斜杠之前的内容长度 当请求url为/index.php/123%0atest.php pt为/var/www/html/index.php这两个变量的差就是后面的路径长度,由于路径可控,则 path_i
7、nfo可控。由于path_info 可控,在1222行我们就可以将指定地址的值置零,根据漏洞发现者的描述,通过将指定的地址的值置零,可以控制使_fcgi_data_seg 结构体的char* pos 置零。 其中script_name 同样来自于请求的配置 char* fcgi_quick_putenv(fcgi_request *req, char* var, int var_len, unsigned int hash_v alue, char* val);而为什么我们使_fcgi_data_seg 结构体的char* pos 置零,就会影响到FCGI_PUTENV 的结果呢?这里我们深入
8、去看FCGI_PUTENV 的定义.跟入函数fcgi_quick_putenv/php/php- src/blob/5d6e923d46a89fe9cd8fb6c3a6da675aa67197b4/main/fastcgi.c#L1703函数直接操作request的env,而这个参数在前面被预定义。 /php/php- src/blob/5d6e923d46a89fe9cd8fb6c3a6da675aa67197b4/main/fastcgi.c#L908继续跟进初始化函数fcgi_hash_init. https:/gith
9、/php/php-src/blob/5d6e923d46a89fe9cd8fb6c3a6da675aa67197b4/main/fastcgi.c#L254也就是说request-env 就是前面提到的fcgi_data_seg 结构体,而这里的request-env 是nginx在和 fastcgi通信时储存的全局变量。 部分全局变量会在nginx的配置中定义 其中变量会在堆上相应的位置储存 回到利用过程中,这里我们通过控制path_info 指向request-env 来使request-env-pos 置零。继续回到赋值函数fcgi_hash_set 函数 紧接着进入fcgi
10、_hash_strndup这里 h-data-pos的最低位被置为0,且str可控,就相当于我们可以在前面写入数据。而问题就在于,我们怎么能向我们想要的位置写数据呢?又怎么向我们指定的配置写文件呢? 这里我们拿exp发送的利用数据包做例子 GET/index.php/PHP_VALUE%0Asession.auto_start=1;?QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQ
11、QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
12、QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
13、QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
14、QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
15、QQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
16、QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ HTTP/1.1Host: ubuntu.local:8080 User-Agent: Mozilla/5.0D-Gisos: 8=DEbut: mamku tvoyu在数据包中,header中的最后两部分就是为了完成这部分功能,其
17、中D-Gisos 负责位移,向指定的位置写入数据。 而Ebut会转化为HTTP_EBUT这个fastcgi_param中的其中一个全局变量,然后我们需要了解一下fastcgi中全局变量的获取数据的方法。 /php/php- src/blob/5d6e923d46a89fe9cd8fb6c3a6da675aa67197b4/main/fastcgi.c#L328可以看到当fastcgi想要获取全局变量时,会读取指定位置的长度字符做对比,然后读取一个字符串作为value.也就是说,只要位置合理,var值相同,且长度相同,fastcgi就会读取相对应的数据。而HTT
18、P_EBUT 和PHP_VALUE 恰好长度相同,我们可以从堆上数据的变化来印证这一点。 在覆盖之前,该地址对应数据为 然后执行fcgi_quick_putenv该地址对应数据变为 我们成功写入了 PHP_VALUE并控制其内容,这也就意味着我们可以控制PHP的任意全局变量。当我们可以控制PHP的任意全局变量就有很多种攻击方式,这里直接以EXP中使用到的攻击方式来举 例子。 exp作者通过开启自动包含,并设置包含目录为/tmp ,之后设置log地址为/tmp/a 并将payload写入log文件,通过auto_prepend_file 自动包含/tmp/a 文件构造后门文件。 漏洞修复 在经过
19、对漏洞的深入研究后,我们推荐两种方案修复这个漏洞。临时修复: 修改nginx相应的配置,并在php相关的配置中加入 try_files $uri =404在这种情况下,会有nginx去检查文件是否存在,当文件不存在时,请求都不会被传递到php-fpm。正式修复: 将PHP7.1.X更新至7.1.33/php/php-src/releases/tag/php-7.1.33将PHP7.2.X更新至7.2.24/php/php-src/releases/tag/php-7.2.24将PHP 7.3.X更新至7.3.11 https:
20、//php/php-src/releases/tag/php-7.3.11漏洞影响 结合EXP github中提到的利用条件,我们可以尽可能的总结利用条件以及漏洞影响范围。1、Nginx + php_fpm,且配置location /.php(/|$) 会将请求转发到php-fpm。 2、Nginx配置fastcgi_split_path_info 并且以 开始以$ ,只有在这种条件下才可以通过换行符来打断 正则表达式判断。 ps: 则允许index.php/321 - index.phpfastcgi_split_path_info (.+?.php)(/.*)$;3、fastcgi_param 中PATH_INFO 会被定义通过fastcgi_param PATH_INFO $fastcgi_path_info; ,当然这个变量会在fastcgi_params 默认定义。 4、在nginx层面没有定义对文件的检查比如try_files $uri =404 ,如果nginx层面做了文件检查,则请 求不会被转发给php-fmp。 这个漏洞在实际研究过程中对真实世界有限,其主要原因都在于大部分的nginx配置中都携带了对 文件的检查,且默认的nginx配置不包含这个问题
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 数据库基础教程 课件-第1章. 数据库概览
- 2026年企业员工保密协议书三篇
- 广电政府采购管理制度
- 工程采购材料管理制度范本
- 医院药品采购科管理制度
- 店铺日常采购管理制度
- 包装厂采购管理制度
- 江苏省淮安市清江浦区2025-2026学年九年级下学期3月学情自测语文试题(含答案)
- 2025 学跳绳作文课件
- 数字化转型下TNTZJT公司财务风险评价与控制体系重构研究
- 江西省重点中学协作体2026届高三下学期第一次联考英语试卷(不含音频及听力原文答案不全)
- 太原铁路局集团招聘笔试题库2026
- 企业信息安全事件应急响应与处理手册
- 行业招聘面试问题清单专业能力测试版
- 广西机场管理集团秋招试题及答案
- 上交所2026校招笔试题
- 2026江西省港口集团有限公司第一批次社会招聘17人笔试备考试题及答案解析
- 车间内部转运车管理制度
- 口腔科学口腔创伤 课件
- 2026年南阳农业职业学院单招职业技能考试题库及答案详解(各地真题)
- 城市更新改造类项目合作框架协议
评论
0/150
提交评论