0x00 前言
有时将带有正则表达式的字符串列入白名单并不好。本文通过示例演示正则表达式在将字符串列入白名单时可能会导致OSCI(操作系统命令注入)漏洞。
0x01 正文
测试代码如下:
1
2
3...
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:其他业务订单:特洛伊木马[通过所有防病毒],远程控制,特殊软件等
备注:未提及的业务订单可根据主要类别查询或直接联系客户服务。为避免浪费双方时间,请在咨询前阅读:业务交易流程及相关说明
注意:仅接受正式业务,个人无权接受。收集此内容。