php 代码格式化工具PHP中对XSS进行过滤的简单(绕过)方法。php代码格式化工具
2022-04-22
集成绕过。
接下来将展示一些简单(绕过)过滤关键字的方法。
(1)过滤代码
('/(and|or|||)/I',$id)
绕过方法:过滤关键字and,or,,,构造代码类似11|| ( user from by =1 ) = '' 绕过。
(2)过滤代码
('/||||eval||||j
|link|'|%|/*|*|../|./|,|.|--|"|and,$str)
绕过方式:只过滤小写注入关键字,大写可以绕过。
三、XSS 审计
是近年来流行的一种攻击方式。恶意攻击者将恶意 html 代码插入网页。当用户浏览网页时,会执行嵌入的html代码,从而达到恶意攻击用户的特殊目的。 那么 PHP 中的 XSS 审计呢?
这是一段历史,第一次在X3.1版本的补丁中修复,但是对于仍然使用的旧版本的X3.1(其实大部分都在用老版本,因为X3.1在出补丁的时候已经放了很久了)和以下版本的网站,这个还是有效的。让我们来看看审计过程。
此漏洞的代码在下面的.php 中。
119 如果($){
120 if(($, 'ed2k://') != ) {
121 $ = ("/ed2k://(.+?)//e", "('1')",
$);
122 }
123 }
显然,这段代码是检测ed2k协议是否开启,并处理第121行的ed2k链接。为了让大家更清楚的理解这些PHP代码,这里简单介绍一下涉及到的一些API,假设你的PHP 的掌握处于入门阶段。第121行的函数原型如下。
($,$,
$ [, int $ = -1 [, int &$]] )
// 进行正则表达式搜索和替换:搜索的匹配部分被替换为
对于刚接触的初学者,可能会觉得自己对代码的掌握还不够。不要紧。每种语言的官方手册都有每个功能的详细说明,供开发者学习。对于有一定经验的审计人员来说,开源项目的手册或说明文本中还有很多重要的部分,同一个厂商的过去也可能为审计指明方向,不要羞于站在巨人的肩膀上!
这个函数调用()函数对$进行常规处理,我们来跟踪处理函数()。
320 ($url) {
321 $_G;
322 list(,$type, $name, $size,) = ('|', $url);
//用于读取连接的类型、名称和大小
323 $url = 'ed2k://'.$url.'/';
324 $name = ($name);
325 if($type == '文件') {
326 $ = ''.(3);
327'
">'.(($name)).'
('.($size).')
$(''.$.'').=(
((''.$name.'')))+' ('.
($size).')';';
328 } 其他 {
329 ''.$url.'';
330 }
331 }
从这段代码可以看出,()没有对参数$size进行安全处理,甚至没有对$size进行类型转换(暂时认为这是程序员的疏忽) ,所以在函数($size)中传入的是字符串类型的$size变量。
下一个 up()函数,在.php同目录下:
1601 ($size) {
1602 if($size >=) {
1603 $size = ($size/ * 100)/100 . 'GB';
1604 } 否则 if($size >= ) {
1605 $size = ($size / * 100) / 100 .'MB';
1606 } else if($size >= 1024) {
1607 $size = ($size / 1024 * 100) / 100 . 'KB';
1608 } 其他 {
1609 $size = $size 。 '';
1610 }
1611 美元大小;
1612 }
此代码用于划分文件大小。 类型的 $size 的值与类型比较时,会被强制转换为类型,然后进行比较。如果传入的$size不是纯数字字符串,则将$size的值转换为NaN(Not a),不会触发前三个if语句,直接进入else语句,函数在else 不正确 $size 进行类型转换,直接与 '' 配对。配对后的字符串最终返回到.php中第121行的$,然后输出。
第 1609 行在 ×3.1 补丁中被替换为:
1609 $size = ($size)。' ';
函数将 $size 转换为整数,从而避免了对 $size 的 XSS 攻击。
让我们测试一下:
在X3.1或以下版本的论坛发帖时插入这句话:
ed2k://|file|xss|'+(123)+'|xss/
图 16 所示的对话框展示了漏洞的存在。
图 16 XSS 对话框
顺便说一句,由于格式限制,这个不能包含各种引号。不要气馁,在这里你可以使用 .(.(... ...));写html标签,比如这里的属性src不需要引号来加载外部的js文件,然后就用这个吧。
通过简单分析可以发现,程序员为了简化代码(其实打补丁后并没有简化),通过强制转换将字符串类型的$size与整数类型进行比较,然后直接比较 $size 和指示的文件大小,单位字符串连接,这种简化是一个很不好的习惯,在写代码的时候,应该避免使用强制类型转换来比较不同类型的变量,这种方法经常被攻击者使用(比如这里)。
四、变量覆盖
关于变量覆盖,首先要了解PHP的特点。 PHP 是一种松散类型的语言,它会根据变量的值自动将变量转换为正确的数据类型。变量覆盖是指攻击者在攻击过程中给它一个特定的值,并覆盖原来的固定值,从而引起一些安全问题。常见的变量覆盖如下所述。
1、变量初始化
这种类型的变量覆盖需要 =on 才能发生。我们来看看《黑云与白帽》的一个漏洞。
这里的变量没有初始化,而是直接代入查询语句,导致变量覆盖,这里触发注入。注入格式为 ?=list&= 语句。
2、危险函数导致的变量覆盖
角色
() 函数是将数组中的变量导入到当前符号表中。当函数中的类型参数为默认值且传入的变量同名时,会被覆盖,导致其他安全问题。我们来看一个开源程序代码。
第4行的($)命令导致变量覆盖,所以我们可以直接覆盖$,完成注入语句。
五、命令执行
命令执行是PHP的一种常见类型,危害更大,直接威胁服务器的安全。在PHP中,命令执行经常发生在高危函数上,如eval()、()、()、exec()、()、()、()。由于开发者的疏忽,这些函数执行的命令有时是用户可控的,导致攻击者提交恶意代码达到攻击目的。下面就来分析一下。
1、常用命令执行函数
(1)eval()
此函数根据 PHP 代码执行字符串。语法:
eval();
以下是问题的代码:
这是一个非常简单的代码。可以看到代码中将参数com的值传递给了变量com,然后变量com的值直接作为PHP代码执行,因此漏洞出现。当参数com为();时,结果如图17所示。
图 17 执行命令
(2)()
该函数类似于C语言的()函数,用于执行指令并输出结果。语法格式:
( , int []);
以下是问题的代码:
当参数com为时,结果如图18所示。
图 18 执行命令
当参数com为ping时,结果如图19所示。
图 19 执行 ping 命令
(3)()
此函数在应用用户自定义函数后返回数组。回调函数接收的参数个数应该和传递给()函数的数组个数一样,语法格式:
(, , , ...)
以下是问题的代码:
让上面代码中的参数为 ,结果如图20所示。
图 20 执行命令
2、动态函数
在实际开发中,有些程序员希望动态调用某些函数,却往往忽略了动态函数的风险。
以下是问题的代码:
在上面的代码中,程序员的初衷是动态调用A函数和B函数,所以变量作为函数名,是可控的。但这实际上等同于执行任何函数。当参数为,参数com为ping时,结果如图21所示。
图21直接执行ping命令
六、上传绕过
熟悉的朋友一定知道,文件上传是主要方式之一,是获取Web权限的重要方式,而且往往是最后一级,可见其重要性。下面我们来分析一下常见的文件上传绕过。
1、Java 绕过
我们先来看一个示例代码:
让我们看看函数。
可以看到调用是一段Java代码,我们回到函数。
此代码在文件类型无效时调用,但无论调用失败与否,都会执行上传代码,所以只要禁用Java,就可以知道上传文件的路径。
这里直接替换包(因为Java是客户端脚本语言,只限制浏览器),如图22。
图 22 改为更改包
2、文件头验证绕过
问题代码如下。
以上代码判断文件类型,只允许/gif类型。但是人们仍然可以伪造这样的标题进行上传。
3、逻辑问题
示例代码如下。
问题出在后缀判断和功能上。我们先来看看后缀判断。
如果($[0] == ($[1]) && $[1] ==
"")
上传XX.jpg.php时:
$[0]=××
$[1]=jpg
$[2]=php
但是可以看到if语句没有判断$[2],所以成功绕过进入函数。
($[''] . "/" . $[$]['name'], $
dat[''] 。 “/”。 $[0] 。 “。” . ($[1]));
这里将之前上传的××.jpg.php重命名为××.jpg。但是根据功能特点网站优化,第二次上传同名文件时php 代码格式化工具,比如××.jpg.php,会进入进程尝试重命名××.jpg,但是因为×× .jpg 已经存在,上传成功。 ××.jpg.php.
七、文件包含
文件包含也是 PHP 中的一个常见漏洞,因此它通常是极其有害的。那么什么是文件包含?它经常出现在 ()、()、()、() 以及这些加载文件的函数上。由于文件名没有被过滤,攻击者可以包含任意文件或特定文件,从而达到攻击的目的。
1、漏洞
问题代码如下。
这段代码的初衷应该是调用一个文件的样式和函数。但是因为这里的目录是用户可控的,所以可以调用任何文件。问题就出在这,如果攻击者上传一张末尾带有PHP恶意代码的图片,比如/××.jpg,然后访问?dir=/××.jpg,恶意代码就会被引入到当前文件中并执行,从而达到攻击的目的。
当然,文件包含不限于包含上传的文件,还可以包含一些配置文件。
?dir=.
?dir=../../../../../../web.
?dir=../../../../../../../../../var/log//.log
?dir=../../../../../../../../../proc/.gz(需要root权限)
?dir=../../../../../../../../../etc/(需要root权限)
2、绕过限制
在实际开发中,开发者为了避免受害,对包含路径做了很多限制,比如下面的代码。
从这里可以看出,开发者同时控制目录和后缀。但是可以提交 ../ 以轻松绕过对目录的限制,同时绕过对带有截断的后缀的限制。如?dir=../../../../../../../etc/,从而包含恶意文件。
截断需要=off,只有在PHP版本小于5.3.4时才能实现。
当然,对于上面的代码,还有其他方法可以绕过它的限制,比如路径长度截断(PHP版本小于5.2.8,文件名长度大于4096字节,长度大于256字节),句点截断(PHP版本小于5.2.8,仅适用于系统,句点长度必须大于256字节) 等。
让我们看看另一段过滤目录的代码。
.php:
这个过滤代码使用一个函数将../替换为./,这样攻击者就无法使用../跳出目录。但是在提交.../的时候,因为../被./替换了,又变成了../,从而跳出了目录。所以当人们提交 ?dir=.../.php 时,文件就被成功包含进来了。
测试结果如图23所示。
图 23 包含本地文件
3、读取任何文件
是最常用的文件读取函数,用于将整个文件读入一个字符串。语法:
(路径, , , , )
也称为任意文件读取,它控制要读取的文件的路径,从而达到攻击的目的,比如读取一些数据库配置文件。
我们先来看一段代码:
提交 ?dir=/data/web.结果如图 24 所示。
图 24 读取本地文件
八、写在最后
随着互联网的普及,商业网站、政府网站、个人博客数不胜数。建站门槛越来越低,建站流程越来越标准化、智能化。很多不懂网站开发的人也可以使用腾云网络搭建自己的网站。云网络价格低廉,很多企业和政府也选择了安全性高、口碑好的腾云网络进行网站建设。因此php 代码格式化工具,腾云网络的安全尤为重要。如今,随着PHP的广泛使用,PHP在开源市场中的地位越来越高。在这里,我以总结的形式谈谈开源审计的经验。
在审计开始时,应该先通读全局文件,看看是否有一些全局过滤,大致了解程序的结构。如果做全局过滤,可以尝试对代码进行过滤,如果成功了,就彻底落下了。
在审计中,应特别注意用户可控制的参数。对于可控参数的搜索,可以检索一些参数组小程序开发,以提高审计效率。常用参数组见表1。
表1常用参数组
当找到一个可控参数时,可以分析它经过了几次,是否进入了查询语句,经历了几次功能。说到函数,在PHP审计中,寻找高风险函数也是最有效的方法之一。常见的高危函数见表2。
表2常见的高风险函数
在开源程序中,它显得更为次要。可想而知,如果需要带走的物品很多,但一次拿的不多,可以分两次拿走。第二次也是如此。将一次攻击分成两次,但可以达到同样的目的,而且这种隐蔽性比较高,在大中型的腾云网络中经常出现。脑力,也是对审核员耐心和体力的考验。