您当前的位置:首页 > 电脑百科 > 安全防护 > 漏洞

PHP花式绕过大全

时间:2023-03-09 11:42:30  来源:  作者:fly夏天summer

做了这么长的时间的ctf,现在总结一下自己做过的题,记录一下各种可能会存在绕过的php函数,持续更新。

 

 

1.preg_replace ($pattern , $replacement , $subject )

其中 $pattern为正则表达式

$replacement为替换字符串

$subject 为要搜索替换的目标字符串或字符串数组

这个函数存在一些奇异的地方,正则表达式$pattern以/e结尾时$replacement的值会被作为php函数执行。

例如执行 preg_replace (‘/test/e’ , "phpinfo();" , "test" )

“test”会被替换为phpinfo();并执行。

 

2.MD5加密绕过

 

2.1 MD5弱比较绕过

 

php中有一个提供MD5加密的函数md5()通常被用来进行密码验证之类的功能。

 

在ctf中常见如下的验证方式:

 

if( a == b && md5(a) == md5(b) )

 

方法一:

 

这儿md5(a)/md5(b)两数如果满足科学计数法的形式的话,php会将其当作科学计数法所得的数字来进行比较。例如:

 

md5(QNKCDZO)
0e830400451993494058024219903391

 

可以看见QNKCDZO的md5值是0e开头满足科学计数法的表示形式,而0e的值始终为0

 

因此,只要字符串经md5后满足科学计数法的0e开头,他们在==比较时就会被认定为相等。(只对==比较有效,不适用于===)

 

以下给出一些满足该要求的md5数

 

QNKCDZO
0e830400451993494058024219903391
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675

方法二 :

md5()函数无法处理数组,如果传入的为数组,会返回NULL,所以两个数组经过加密后得到的都是NULL,也就是相等的。

也就是说a[]=1,2 b[]=2,3 该验证依然可以绕过。

2.2 MD5强碰撞

 

if((string)$_POST['param1']!==(string)$_POST['param2'] && md5($_POST['param1'])===md5($_POST['param2'])){
        die("success!);
}

 

 

Param1=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
Param2=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2

 

2.3 双MD5碰撞绕过

 

$a != $b && md5($a) == md5(md5($b)

 

一些例子

 

MD5大全:

CbDLytmyGm2xQyaLNhWn

md5(CbDLytmyGm2xQyaLNhWn) => 0ec20b7c66cafbcc7d8e8481f0653d18

md5(md5(CbDLytmyGm2xQyaLNhWn)) => 0e3a5f2a80db371d4610b8f940d296af

770hQgrBOjrcqftrlaZk

md5(770hQgrBOjrcqftrlaZk) => 0e689b4f703bdc753be7e27b45cb3625

md5(md5(770hQgrBOjrcqftrlaZk)) => 0e2756da68ef740fd8f5a5c26cc45064

7r4lGXCH2Ksu2JNT3BYM

md5(7r4lGXCH2Ksu2JNT3BYM) => 0e269ab12da27d79a6626d91f34ae849

md5(md5(7r4lGXCH2Ksu2JNT3BYM)) => 0e48d320b2a97ab295f5c4694759889f

 

碰撞脚本

 

# -*- coding: utf-8 -*-
import multiprocessing
import hashlib
import random
import string
import sys
CHARS = string.letters + string.digits
def cmp_md5(substr, stop_event, str_len,. start=0, size=20):
    global CHARS
    while not stop_event.is_set():
        rnds = ''.join(random.choice(CHARS) for _ in range(size))
        md5 = hashlib.md5(rnds)
        value = md5.hexdigest()
        if value[start: start+str_len] == substr:
            print rnds
            stop_event.set()
            '''
            #碰撞双md5
            md5 = hashlib.md5(value)
            if md5.hexdigest()[start: start+str_len] == substr:
            	print rnds+ "=>" + value+"=>"+ md5.hexdigest()  + "n"
                stop_event.set()
            '''

if __name__ == '__mAIn__':
    substr = sys.argv[1].strip()
    start_pos = int(sys.argv[2]) if len(sys.argv) > 1 else 0
    str_len = len(substr)
    cpus = multiprocessing.cpu_count()
    stop_event = multiprocessing.Event()
    processes = [multiprocessing.Process(target=cmp_md5, args=(substr,
                                         stop_event, str_len, start_pos))
                 for i in range(cpus)]
    for p in processes:
        p.start()
    for p in processes:
        p.join()

 

上面脚本注释部分是双MD5碰撞,取消注释然后注释掉16行即可。

 

使用方法:Python/ target=_blank class=infotextkey>Python md5Crack.py "你要碰撞的字符串" 字符串的起始位置

 

例如:python md5Crack.py “0e" 0

 

将产生MD5值为0e开头的字符串。

 

注:这个脚本我本地尝试好像有问题,具体问题有时间研究一下再补上。

 

3.MD4 绕过(来自强网杯2020)

 

$_GET["hash1"] != hash("md4", $_GET["hash1"])

 

例子 0e251288019

 

md4计算后为

0e874956163641961271069404332409

 

参考网上的例子改了一个简易的python爆破脚本,就是效率真的低到离谱

 

y1ng神还有高级脚本,感兴趣的可以自己去看看2020第四届“强网杯”全国网络安全挑战赛初赛Writeup – 颖奇L'Amore

https://www.gem-love.com/ctf/2576.html#Funhash

 

没研究透的我就不贴了。

 

import hashlib
for i in range(0,10**40):
    i='0e'+str(i)
    md4=hashlib.new('md4', i.encode()).hexdigest()
    if md4[:2]=='0e' and md4[2:].isdigit():
        print('num:{},md4:{} '.format(i,md4))
        break
#需要在python3环境下运行,不然无法执行 

 

4.strip_tags()

 

这个函数用于去除字符串中的 HTML 标签,正常来说确实没啥问题。

 

但是却在ctf中一些绕过中存在。(出自roarctf2019 simple_upload)

 

thinkphp原生代码中的upload()上传功能,会对上传的文件名执行该函数。

 

利用该方法可以进行前端绕过。

 

当php进行上传文件后缀验证,过滤.php时。

 

一般情况下诸如 1.php是无法上传上去的,但是此处可以通过 构造文件名为 1.<a>php绕过该验证。

 

文件上传后不满足.php绕过过滤,但是在tp的原生上传函数被调用是<a>被去除,文件就会被以php格式上传。

 

注:此处的html可以为任意html标签

 

5.assert()

 

这个函数是php的断言函数,用来判断一个表达式是否成立。返回true or false。

 

注:assert执行的字符串包含的php语句如果有多条,只会执行第一条。

 

该表达式会被当做php函数来执行,相当于eval()

 

在ctf中该函数也有一定的可利用性,如xctf中的一题

 

assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");

 

 

$file为用户传入的字符串,这里构造file=').phpinfo();//

 

此时语句变成了assert("strpos('').phpinfo();// ===false" ) or die (" ")

 

相当于 assert("strpos('').phpinfo();" )

 

phpinfo()就被注入进去并执行了。

 

注:这里用到了php的一个特性,那就是 .连接符 ,

 

读者可以自行尝试assert("ehco(123);phpinfo();")和assert("ehco(123).phpinfo();")运行起来的区别。

 

6.反序列化相关知识点

 

1.__toString()

 

触发条件时对象被当作字符串调用时就会执行。

 

需要指出的是在 PHP 5.2.0 之前,__toString() 方法只有在直接使用于 echo 或 print 时才能生效。PHP 5.2.0 之后,则可以在任何字符串环境生效(例如通过 printf(),使用 %s 修饰符),但不能用于非字符串环境(如使用 %d 修饰符)。自 PHP 5.2.0 起,如果将一个未定义 __toString() 方法的对象转换为字符串,会产生 E_RECOVERABLE_ERROR 级别的错误。

 

比如stristr函数。(来自强网杯的怨念)

 

2.__wakeup绕过

 

该函数会在反序列化时执行。当成员属性数目大于实际数目时可绕过wakeup方法(CVE-2016-7124)

 

例如:一个对象序列化结果如下

 

O:6:"jungle":1:{s:4:"name";s:1:"1";}

 

如果想要绕过类中的__wakeup函数,只需要将jungle数量对应的1改成2既可。

 

注:这里的字符串数字比如O:6,写成O:+6也是可以,利用这个可以绕过一些过滤。

 

3.S和s的区别

 

依然已上文的序列化字符串举例

 

O:6:"jungle":1:{s:4:"name";s:1:"1";}

 

这里的s表示的是属性的内容是字符串,因为这里的变量属性是public,如果是protected,则需要在属性名前加chr(0)*chr(0)

 

也就是s:7:"chr(0)*chr(0)name",这个是无法打出来的。

 

通常情况下我们可以这样表示:s:7:"%00*%00name",用%00来代替这个chr(0)字符

 

如果用S的话,就可以这样写:S:7:"0*0name" ,简单来说就是在S的模式下,+字符的ascii码的16进制表示就可以被识别为字符,这里的s:7:"%00*%00name" 甚至可以直接表示成 S:7:"0*06e616d65" ,通过这种方法可以绕过很多过滤(来自强网杯的怨念),具体原理可以参考

https://www.neatstudio.com/show-161-1.shtml

 

4.反序列化逃逸

 

这个好复杂啊,不想写懒狗选择放弃,大家可以百度安恒月赛反序列化逃逸来找例子参考。

 

https://www.cnblogs.com/BOHB-yunying/p/12774297.html

 

这个师傅就写的很好,可以参考一下。

 

7.弱比较问题

 

7.1 数字与字符串的比较

 

字符串与数字比较的时候,会自动提取字符串中的数字。

 

例如

 

1=="1" 可以通过

 

1=="1a" 可以通过

 

注:这里从字符串中提取数字的操作是从首位开始,如果首位不是数字就不会提取数字,1=="aa1" 不可以通过。

 

8.PHP标签的几种写法

 

1. <?php ?>
常规写法
2. <? ?>

 

注:

 

  • 利用短标签写法可以绕过一些对php字符的过滤
  • windows环境中短标签默认是打开的,linux下 默认是关闭的。
  • 控制参数: php支持短标签,需要我们把short_open_tag 设置为On.

 

3. <% %>

 

注:需要配置php.ini文件。在配置文件中找到asp_tags=off ,将off改为on。改动配置文件后需要重启Apache
4. <script language=”php”> </script>

 

9.php中的命令执行函数总结

 

10.disabled_function绕过

 

11.PHP下的模板注入TWIG

 

如果目标网站没有对模板进行过滤,即可通过一下方法执行命令。

 

{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("shellcode")}};

 

12.PHP伪协议

 

1.filter协议 ,利用该协议可以读取文件

 

php://filter/resource=1.php  //该情况下php代码会被执行
php://filter/read=convert.base64-encode/resource=1.php //通过转义可以避免被执行,直接读取源码
php://filter/read=string.rot13/resource=1.php

 

有几种常见的编码转换参数

 

  1. string.rot13
  2. string.toupper
  3. string.tolower
  4. string.strip_tags //去除 HTML 、 PHP 标记 、空字符,php标签里所有东西都会被去除,html只有标签会被去除,里面的文字不会删除。
  5. convert.base64-encode
  6. convert.base64-decode
  7. zlib.deflate //压缩
  8. zlib.inflate //解压

注:该协议可以嵌套使用,php://filter/resource=test/../1.php或者php://filter/resource=test/1.php,test文件夹不存在的情况下这两种写法下仍然可以读取1.php文件内容。

 

2.file协议,该文件也是利用来直接读取文件

file:/etc/passwd

 

13.PHP变量覆盖漏洞

PHP<5.4.0版本下,可能存在该漏洞。

参见大佬的文章,写的很好

PHP变量覆盖漏洞小结 [ Mi1k7ea ]

https://www.mi1k7ea.com/2019/06/20/PHP%E5%8F%98%E9%87%8F%E8%A6%86%E7%9B%96%E6%BC%8F%E6%B4%9E/

 

暂时就写到这儿如果后续还有其他说话,会继续更下来,以后如果有时间会写一个php一些伪协议的总结。



Tags:PHP   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
PHP 8.3 新特性解读
作者 | Deepak Vohra译者 | 明知山策划 | 丁晓昀本文是 PHP 8.x 系列文章的一部分。你可以通过订阅 RSS 来接收有关本系列文章的更新通知。PHP 仍然是互联网上使用最广泛的...【详细内容】
2024-03-12  Search: PHP  点击:(17)  评论:(0)  加入收藏
如何使用PHP SSH2模块执行远程Linux命令
PHP SSH2扩展是用于在PHP程序中使用SSH(安全壳协议)的一种扩展。它允许建立加密连接和执行远程命令、上传和下载文件等操作,十分方便实用。下面我将为大家详细介绍一下该扩展的...【详细内容】
2024-01-26  Search: PHP  点击:(102)  评论:(0)  加入收藏
PHP+Go 开发仿简书,实战高并发高可用微服务架构
来百度APP畅享高清图片//下栽のke:chaoxingit.com/2105/PHP和Go语言结合,可以开发出高效且稳定的仿简书应用。在实现高并发和高可用微服务架构时,我们可以采用一些关键技术。首...【详细内容】
2024-01-14  Search: PHP  点击:(115)  评论:(0)  加入收藏
如何使用PHP抓取百度首页排名?方法与步骤详解
PHP是一种广泛应用于网站开发的脚本语言,具备简单、灵活、高效的特点,因此在SEO优化中也得到了广泛的应用。本文将深入解析如何使用PHP抓取百度首页排名,并介绍一些相关的内容...【详细内容】
2024-01-12  Search: PHP  点击:(82)  评论:(0)  加入收藏
2023 年,PHP 停滞不前
热心开发者分析了一波 GitHub 的数据后发现,编程语言为 PHP 的 PR 数量逐年下降。GitHut 是通过 GitHub 数据专门分析编程语言的项目。它基于各种编程语言在 GitHub 中的使用...【详细内容】
2023-12-17  Search: PHP  点击:(16)  评论:(0)  加入收藏
全方位深度剖析PHP7底层源码
PHP7是一门流行的Web编程语言,以其易学易用和广泛的应用场景而备受欢迎。本文将为您深入讲解PHP7的特性和优势,包括性能提升、语法改进和新特性等方面,帮助您了解和掌握这门灵...【详细内容】
2023-12-06  Search: PHP  点击:(184)  评论:(0)  加入收藏
PHP 8.3 正式发布!
作者 | Tim Anderson编译 | 如烟出品 | 51CTO技术栈(微信号:blog51cto)PHP 8.3 正式发布,最主要的变化是添加“类常量显式类型”、“只读属性深拷贝”,“以及对随机性功能的补充...【详细内容】
2023-11-27  Search: PHP  点击:(169)  评论:(0)  加入收藏
原来真的可以在 Next.js 中写 PHP 代码?
Next.js 14 近期发布,其中一个重大的功能点是 Server Actions 成为稳定版,因其超前和熟悉的开发方式,在社交网络上引起了一阵讨论,应该是下面这张图的内容了。图片有人说这是又...【详细内容】
2023-11-07  Search: PHP  点击:(297)  评论:(0)  加入收藏
PHP编程语言,这个老古董,还有人用吗?
近年来,随着大数据、云计算和人工智能等新兴技术的崛起,许多传统的编程语言悄然退出了舞台。而PHP(PHP Hypertext Preprocessor)作为最古老的编程语言之一,是否也在逐渐沦为过去...【详细内容】
2023-11-02  Search: PHP  点击:(233)  评论:(0)  加入收藏
通过这个技术,浏览器可以运行Node.js、Rust、Python、PHP、C++、Java代码了!
近日,WebContainers 发布重要更新,WASI(WebAssembly 系统接口)已全面集成到 WebContainers 中。这是一个重要里程碑,它扩大了可以使用浏览器执行的操作,是 Web 开发的全新范例,允许...【详细内容】
2023-10-13  Search: PHP  点击:(276)  评论:(0)  加入收藏
▌简易百科推荐
 Opera 漏洞可能让黑客在 Mac 或 Windows 上运行任何文件
网络安全研究人员披露了 Microsoft Windows 和 Apple macOS Opera 网络浏览器中的一个现已修补的安全漏洞,该漏洞可被利用来执行底层操作系统上的任何文件。Guardio Labs研究...【详细内容】
2024-01-19  科技大人物    Tags:漏洞   点击:(76)  评论:(0)  加入收藏
俄黑客组织利用WinRAR漏洞攻击乌克兰
据Securityaffairs网站消息,具有俄罗斯背景的黑客组织UAC-0099正在利用WinRAR中的一个零日漏洞(已修复,编号CVE-2023-38831)对乌克兰传播LONEPAGE恶意软件。实际上,自2022年中旬...【详细内容】
2023-12-27  区块软件开发  今日头条  Tags:漏洞   点击:(149)  评论:(0)  加入收藏
一文带你了解数据库层的安全漏洞及其危害性
数据库层的安全漏洞是Web应用程序中最常见且最简单的漏洞之一。这种漏洞的主要原因是程序没有对用户输入的数据进行合法性判断和处理,从而导致攻击者能够在Web应用程序中注入...【详细内容】
2023-12-19  科技界脑洞    Tags:漏洞   点击:(148)  评论:(0)  加入收藏
七个优秀开源免费Web安全漏洞扫描工具
Web安全漏洞扫描技术是一种用于检测Web应用中潜在的漏洞或者安全风险的自动化测试技术。Web安全扫描工具可以模拟黑客行为,检测常见的漏洞,例如:Sql注入、XSS、文件上传、目录...【详细内容】
2023-11-17  andflow  微信公众号  Tags:安全漏洞   点击:(226)  评论:(0)  加入收藏
2023年TOP 5 Kubernetes漏洞
译者 | 晶颜审校 | 重楼Kubernetes是一个流行的开源平台,用于管理容器化的工作负载和服务。它是一个简化了大量部署、扩展和操作任务的系统,但它并非没有风险。就像任何其他软...【详细内容】
2023-11-15    51CTO  Tags:漏洞   点击:(311)  评论:(0)  加入收藏
SysAid IT 曝出零日漏洞,需尽快安装补丁
根据微软的最新发现,以传播 Clop 勒索软件而闻名的 Lace Tempest 黑客组织,近日利用 SysAid IT 支持软件的零日漏洞实施了攻击。该黑客组织曾经还利用 MOVEit Transfer 和 Pap...【详细内容】
2023-11-10  沐雨花飞蝶  微信公众号  Tags:SysAid   点击:(247)  评论:(0)  加入收藏
常见Windows远程漏洞信息整理
通过漏洞扫描,发现漏洞,更新补丁,增强内网安全防御能力。1.常见windows提权漏洞(1)MS08-067 Windows服务漏洞漏洞描述:该漏洞影响Windows Server 2000、Windows XP和Windows 2003...【详细内容】
2023-11-07  小兵搞安全  微信公众号  Tags:漏洞   点击:(274)  评论:(0)  加入收藏
报告称微软 Skype 移动应用存在严重漏洞,可轻易泄露用户 IP 地址
IT之家 8 月 29 日消息,据 404Media.co 报道,微软的 Skype 移动应用存在一个严重的漏洞,可能导致黑客通过发送一个链接就能检测到用户的 IP 地址。该漏洞只需利用 Skype 的文本...【详细内容】
2023-08-29    IT之家  Tags:漏洞   点击:(150)  评论:(0)  加入收藏
可绕过苹果三重防护机制,专家发现 macOS 新漏洞
IT之家 8 月 15 日消息,近期在拉斯维加斯举行的 Defcon 黑客大会上,安全研究员帕特里克・沃德尔(Patrick Wardle)展示了 macOS 新漏洞,可以绕过苹果设置的三重防护机制,窃取设备敏...【详细内容】
2023-08-15    IT之家  Tags:漏洞   点击:(211)  评论:(0)  加入收藏
两个新漏洞可能影响 40% 的 Ubuntu 云工作负载
云安全公司 Wiz 的研究人员在 Ubuntu 的 OverlayFS 模块中发现了两个易于利用的权限提升漏洞,影响了 40% 的 Ubuntu 云工作负载。OverlayFS 是一种联合文件系统,允许一个文件...【详细内容】
2023-07-28    云安全公司 Wiz 的研究人员在 Ubuntu 的 OverlayFS 模块中发现了两个易于利用的权限提升漏洞,影响了   Tags:漏洞   点击:(226)  评论:(0)  加入收藏
站内最新
站内热门
站内头条