热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP网站渗透中的奇技淫巧:检查相等时的漏洞

PHP是现在网站中最为常用的后端语言之一,是一种类型系统动态、弱类型的面向对象式编程语言。可以嵌入HTML文本中,是目前最流行的web后端语言之一,并且可以和WebServer如apache和nginx方便的融合。目前,已经占据了服务端市场的极大占有量。

PHP是现在网站中最为常用的后端语言之一,是一种类型系统 动态、弱类型的面向对象式编程语言。可以嵌入HTML文本中,是目前最流行的web后端语言之一,并且可以和Web Server 如apache和nginx方便的融合。目前,已经占据了服务端市场的极大占有量。

但是,弱类型,一些方便的特性由于新手程序员的不当使用,造成了一些漏洞,这篇文章就来介绍一下一些渗透中可以用的特性。

上面都是废话,下面我们进入正题

1.弱类型的比较==导致的漏洞

注:这些漏洞适用于所有版本的php

先来复习一下基本的语法:php中有如下两种比较符号:两个等号和三个等号(这一点和Javascript)有些类似

	

$a==$b $a===$b

我们来一下php官方手册的说法

明确的看到,两个等于号的等于会在比较的时候进行类型转换的比较。

如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。此规则也适用于 switch 语句。当用 === 或 !== 进行比较时则不进行类型转换,因为此时类型和数值都要比对.

明确的写出了 如果一个数值和一个字符串比较,那么会将字符串转换为数值(而不是相反,将数值转化为字符串)

然而,php是如何将一个字符串转化为数值的呢,我们继续查看php手册

当一个字符串被当作一个数值来取值,其结果和类型如下:如果该字符串没有包含 ‘.’,’e’ 或 ‘E’ 并且其数字值在整型的范围之内(由 PHP_INT_MAX 所定义),该字符串将被当成 integer 来取值。其它所有情况下都被作为 float 来取值。该字符串的开始部分决定了它的值。如果该字符串以合法的数值开始,则使用该数值。否则其值为 0(零)。合法数值由可选的正负号,后面跟着一个或多个数字(可能有小数点),再跟着可选的指数部分。指数部分由 ‘e’ 或 ‘E’ 后面跟着一个或多个数字构成。

这是官方手册上面的几个例子

	

我们大概可以总结出如下的规则:当一个字符串被转换为数值时

如果一个字符串为 “合法数字+e+合法数字”类型,将会解释为科学计数法的浮点数

如果一个字符串为 “合法数字+ 不可解释为合法数字的字符串”类型,将会被转换为该合法数字的值,后面的字符串将会被丢弃

如果一个字符串为“不可解释为合法数字的字符串+任意”类型,则被转换为0! 为0…为0


当然,上面的那些等式对于===都是false的,原本一些应该用===的地方误用了==,导致了可以注入的地方。

示例代码 1:利用转为数字后相等的漏洞

这是一个ctf的题目,非常有趣,可以看到,要求给出两字符串,一个是纯数字型,一个只能出现字符,使两个的md5哈希值相等,然而这种强碰撞在密码学上都是无法做到的。

但是我们看到,最终比较两者的哈希的时候,使用的是等于 而不是 全等于 ,因此可以利用一下这个漏洞

再回头看一md5()函数

	

string md5 ( string $str [, bool $raw_output = false ] )

str原始字符串。raw_output如果可选的 raw_output 被设置为 TRUE,那么 MD5 报文摘要将以16字节长度的原始二进制格式返回。

可以知道,第二个参数为true的时候,显示16位的结果,而为false和没有第二个参数时,为32位的16进制码(16位的结果是把32位的作为ASCII码进行解析)

16进制的数据中是含有e的,可以构建使得两个数字比较的,这里有一个现成的例子:

	

md5('240610708') //0e462097431906509019562988736854.md5('QNKCDZO') //0e830400451993494058024219903391

可以看到,这两个字符串一个只包含数字,一个只包含字母,虽然两个的哈希不一样,但是都是一个形式:0e 纯数字这种格式的字符串在判断相等的时候会被认为是科学计数法的数字,先做字符串到数字的转换。

转换后都成为了0的好多好多次方,都是0,相等。(大家可以自己尝试一下)因此

用===可以避免这一漏洞。

示例代码2: 利用 类’a'==0的漏洞

这次这个例子是传入一个JSON的数据,JSON在RESTful的网站中是很常用的一种数据传输的格式。这个表单会把一个name为key的input的数据作为json传到服务端

	

{"key":"your input"}

我们该如何破解?想”a”==0这个漏洞,之用我们使$json->key是一个数字类型的变量就可以,怎么做到呢?

php的json_decode()函数会根据json数据中的数据类型来将其转换为php中的相应类型的数据,也就是说,如果我们在json中传一个string类型,那么该变量就是string,如果传入的是number,则该变量为number。因此,我们如果传入一个数字,就可以使之相等。网页中的表单可能限制了所有的输入都是string,即使输入数字,传入的东西也是

	

{"key":"0"}

这是一个字符串0,我们需要让他为数字类型,用burp拦截,把两个双引号去掉,变成这样:

	

{"key":0}

即可。

值得讨论的一点是,在这种方法的漏洞利用中,很难在直接表单类型的POST的数据中使用,这是为什么呢,这个和HTTP协议有关。首先,我们看一下,在POST给服务器的数据中,有几种类型,也就是HTTP header中的Content-Type:

	

application/x-www-form-urlencoded multipart/form-data application/json application/xml

第一个application/x-www-form-urlencoded,是一般表单形式提交的content-type第二个,是包含文件的表单。第三,四个,分别是json和xml,一般是js当中上传的.

但是因为在直接的POST的payload当中是无法区分字符串和数字的,因为在其中并没有引号出现,举一个抓包的例子


可以看到,payload是放在http包的最后面的,而且都是以没有引号的形式传递的,并没有办法区分到底是字符串还是数字。因此,PHP将POST的数据全部保存为字符串形式,也就没有办法注入数字类型的数据了而JSON则不一样,JSON本身是一个完整的字符串,经过解析之后可能有字符串,数字,布尔等多种类型。

2. strcmp漏洞

注:这一个漏洞适用与5.3之前版本的php

我们首先看一下这个函数,这个函数是用于比较字符串的函数

	

int strcmp ( string $str1 , string $str2 )

参数 str1第一个字符串。str2第二个字符串。如果 str1 小于 str2 返回 <0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。

可知,传入的期望类型是字符串类型的数据,但是如果我们传入非字符串类型的数据的时候,这个函数将会有怎么样的行为呢?实际上,当这个函数接受到了不符合的类型,这个函数将发生错误,但是在5.3之前的php中,显示了报错的警告信息后,将return 0 !!!! 也就是虽然报了错,但却判定其相等了。

这对于使用这个函数来做选择语句中的判断的代码来说简直是一个致命的漏洞,当然,php官方在后面的版本中修复了这个漏洞,使得报错的时候函数不返回任何值。但是我们仍然可以使用这个漏洞对使用老版本php的网站进行渗透测试。看一段示例代码:


对于这段代码,我们能用什么办法绕过验证呢, 只要我们$_POST['password']是一个数组或者一个object即可,但是上一个问题的时候说到过,只能上传字符串类型,那我们又该如何做呢。

其实php为了可以上传一个数组,会把结尾带一对中括号的变量,例如xxx[]的name(就是$_POST中的key),当作一个名字为xxx的数组构造类似如下的request


即可使得上述代码绕过验证成功。

3 总结

这一类型的漏洞的特点主要就是利用PHP中 的类型特性来绕过验证。由于 == 和 === 有着明显的区分,因此,估计短期内PHP的作者并不会调整对于这两个符号的策略。

而对于开发市场而言,随着培训机构的增多,后端程序员尤其是php后端程序员的门槛越来越低,其水平必定也是良莠不齐,这些二把刀程序员可能带来更多的此类对于特性的不当使用导致的漏洞,因此这类漏洞仍然是非常具有利用价值的。

总结一下,对于开发人员,需要坚持几个习惯:

  • 认真阅读PHP manual,不能以其他语言的经验来完全带入php进行编码

  • 在使用一个运算符或者函数之前,详细的查看文档,搞清楚函数在什么样的条件下,会有怎样的行为。

记住保证安全的几句箴言:任何用户输入都是不可信的!对于web应用来说,前端(浏览器端)的安全限制只能起到防止一般用户的误输入行为,完全不可能对于黑帽子的行为有任何的防御作用

因此,在防御这个漏洞的过程中,保证几件事情:

  • 在所有可能的地方,都使用===来代替==

  • 对于用户输入做过滤和类型检查

  • 尽量使用新版本的php,apache

基本上就可以完美的防御这一类的漏洞。

而对于渗透测试人员,在代码审计的过程中,对于有==,strcmp的比较也应极为敏感 。在黑盒渗透的时候也可以对于代码进行猜测,结合信息搜集过程中的一些版本特性,利用这些漏洞来绕过验证。


推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • 浅解XXE与Portswigger Web Sec
    XXE与PortswiggerWebSec​相关链接:​博客园​安全脉搏​FreeBuf​XML的全称为XML外部实体注入,在学习的过程中发现有回显的XXE并不多,而 ... [详细]
  • 弹性云服务器ECS弹性云服务器(ElasticCloudServer)是一种可随时自助获取、可弹性伸缩的云服务器,帮助用户打造可靠、安全、灵活、高效的应用环境 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 本文介绍了互联网思维中的三个段子,涵盖了餐饮行业、淘品牌和创业企业的案例。通过这些案例,探讨了互联网思维的九大分类和十九条法则。其中包括雕爷牛腩餐厅的成功经验,三只松鼠淘品牌的包装策略以及一家创业企业的销售额增长情况。这些案例展示了互联网思维在不同领域的应用和成功之道。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • zuul 路由不生效_Zuul网关到底有何牛逼之处?竟然这么多人在用~
    作者:kosamino来源:cnblogs.comjing99p11696192.html哈喽,各位新来的小伙伴们,大家好& ... [详细]
author-avatar
幻灵风
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有