0x00 前言 有时将带有正则表达式的字符串列入白名单并不好。本文通过示例演示正则表达式在将字符串列入白名单时可能会导致OSCI(操作系统命令注入)漏洞。
0x01 正文 测试代码如下:
1 2 3 4 五 6 7 8 <php $ file_name = $ _GET ['path']; if(!preg_match('/^ [\/a-zA-Z0-9 \ - \ s _] + \ .rpt $/m', $ file_name)) { echo 'regex failed'; } else { echo exec('/usr/bin/file -i -b ' $ file_name); } > 乍一看,这段代码似乎没有问题。它是一个文件,它通过字母,数字,下划线,断开的数字,斜杠和空格字符的各种组合来匹配文件名,其后缀为rpt。如果匹配成功,则执行系统命令。文件打印文件的类型和编码信息。如果匹配失败,请打印'正则表达式失败'。 一开始,我也尝试了各种攻击有效载荷,但是我没有成功注入命令。后来,我发现原始攻击点位于常规过滤器上。 \ s表示匹配任何空白字符,什么是空白字符。是常见的[\ t \ r \ n \ f](制表符,回车符,换行符,页面更改)和其他特殊字符,其中换行符非常危险,换行符在其他情况下可能无风险,但在shell中环境,有可能导致命令注入,请查看以下有效负载 1 文件%0Aid%0A.rpt %0A是URL编码的换行符。显然,这个有效载荷符合上述规律性。在shell环境中执行此有效负载时会发生什么?
为什么会如此。因为在shell环境中,多个命令的分隔符除了相同之外还有换行符;将上述有效负载传递给shell后,它将成为两个命令: 1 2 3 文件 -i -b 文件%0A id%0A rpt 所以有print id命令的内容。 所以如何解决它,很容易做到,用''(空格)替换\ s是可以的
你认为这种改变会好吗?年轻,太年轻太简单,看下面的有效载荷 1 file.rpt%0aid 看看执行后会执行什么鬼?
非常意外,命令注入成功,让我们看看它是什么造成的。 注意正则表达式末尾的/m。在php中,/m表示启用多行匹配模式。打开多行匹配模式后,^和$的含义会发生变化。在启用多线模式(即单线匹配)模式之前,^和$是匹配字符串的开头和结尾。启用多行模式后,多行模式^,$可以匹配每行的开头和结尾,因此上面的有效内容包含一个换行符,它被视为两行。一行匹配OK,因此它进入exec执行分支,进而导致命令执行。 0x02 总结 因此,当我们使用正则表达式来构建白名单时,我们必须小心,特别是在命令执行时。有时,白名单尽可能清晰。例如,如果我们遇到类似的场景,我们可以定义一些完整的允许文件名,而不是正则表达式。 本文由乘客安全翻译,作者:ForrestX386 原始链接:https://nvisium.com/blog/2015/06/11/regex-regularly-exploitable/ 黑客业务列表介绍和一般分类: 类别:攻击入侵破解开发 1:攻击业务订单:暂时取消所有此类业务订单[仅销售常规IDC流量] 2:入侵业务清单:包括网站源代码,办公系统,黑色系统,教育系统等。 3:破解业务类:软件,加密文件,二次打包,脱壳等。 4:二次开发业务清单:软件二次开发,源代码二次开发等 5:其他业务订单:特洛伊木马[通过所有防病毒],远程控制,特殊软件等 备注:未提及的业务订单可根据主要类别查询或直接联系客户服务。为避免浪费双方时间,请在咨询前阅读:业务交易流程及相关说明 注意:仅接受正式业务,个人无权接受。收集此内容。