PHP一些函数绕过总结

is_numeric函数

函数对空白字符的特性 is_numeric函数在开始判断前,会先跳过所有空白字符。这是一个特性。

也就是说,is_numeirc(” \r\n \t 1.2″)是会返回true的。同理,intval(” \r\n \t 12″),也会正常返回12。

可以引入\f(也就是%0c)在数字前面,来绕过最后那个is_palindrome_number函数,而对于前面的数字判断,因为intval和is_numeric都会忽略这个字符,所以不会影响。

ereg函数
.Eregi匹配可以用%00截断
2.eregi匹配可用数组绕过

ereg是处理字符串,传入数组之后,ereg是返回NULL

所以这里有两个绕过方法:

方法一:

就是用%00去截断:

Copypayload:?password=1e7%00*-*

方法二:

就是把password通过数组的形式去传参:

Copypayload:?password[]=1e7&password[]=*-*
strcmp()函数

这里用的是strcmp()函数,这个函数是用于比较字符串的函数,但是倘若他收到一个数组形式的数据时,这个函数将发生错误。

但是在5.3之前的php中,显示了报错的警告信息后,将return 0 !!! 也就是虽然报了错,但却判定其相等了。这对于使用这个函数来做选择语句中的判断的代码来说简直是一个致命的漏洞。

当然,php官方在后面的版本中修复了这个漏洞,使得报错的时候函数不返回任何值。

strcmp只会处理字符串参数,如果给个数组的话呢,就会返回NULL,而判断使用的是,NULL0是 bool(true)

sha1()函数

sha1()函数默认的传入参数类型是字符串型,那要是给它传入数组呢会出现错误,使sha1()函数返回错误,也就是返回false,这样一来===运算符就可以发挥作用了

密码md5比较绕过

数组绕过===

MD5值:

md5("s1885207154a") => 0e509367213418206700842008763514

md5("s1836677006a") => 0e481036490867661113260034900752

(1)双md5该如何绕过,绕过md5(md5( G E T [ ′ a ′ ] ) = = m d 5 ( _GET['a']) == md5( GET[a])==md5(_GET[‘b’])。

MD5值:

md5("V5VDSHva7fjyJoJ33IQl") => 0e18bb6e1d5c2e19b63898aeed6b37ea

md5("0e18bb6e1************") => 0e0a710a092113dd5ec9dd47d4d7b86f

所以此题答案便出来了。a=s1885207154a,b=V5VDSHva7fjyJoJ33IQl即可绕过if判断。

双md5结果仍为0e开头字符串大全

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

[CTF]CTF中if (md5(md5( G E T [ ‘ a ’ ] ) ) = = m d 5 ( _GET[‘a’])) == md5( GET[a]))==md5(_GET[‘b’])) 的绕过 - 肖洋肖恩、 - 博客园 (cnblogs.com)

碰撞脚本:

# -*- 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()
intval函数

intval函数四舍五入
使用小数绕过

浮点数精度忽略,在小数小于某个值(10^-16)以后,再比较的时候就分不清大小了。 输入number = 1.00000000000000010, 右边变成1.0, 而左与右比较会相等

iconv 异常字符截断
iconv 是一个格式转换的内置函数 ,通常我们在输出的浏览器上的文字 会出现乱码

这样我们就要用到iconv来转换一下我们的格式来实现正常展示的效果。

$str = ‘gbk编码的文字’

$str = iconv(“GBK”, “UTF-8//IGNORE”, $str)
iconv有三个参数 第一个是字符串本身的格式 例如上 s t r 是一个 g b k 的文字这样输出会出现乱码情况第一个参数是你文本的编码第二个参数是你要转换的文本格式第三个是你要转换的文本使用之后把返回结果赋值给 str是一个gbk的文字 这样输出会出现乱码情况 第一个参数是你文本的编码 第二个参数是你要转换的文本格式 第三个是你要转换的文本 使用之后把返回结果赋值给 str是一个gbk的文字这样输出会出现乱码情况第一个参数是你文本的编码第二个参数是你要转换的文本格式第三个是你要转换的文本使用之后把返回结果赋值给str
就会得到一个utf-8编码的文本 这样输出就会展示出中文 而非乱码 …

preg_match绕过

1、数组绕过

preg_match只能处理字符串,当传入的subject是数组时会返回false

2、PCRE回溯次数限制

PHP利用PCRE回溯次数限制绕过某些安全限制

3、换行符

.不会匹配换行符,如

if (preg_match('/^.*(flag).*$/', $json)) {    echo 'Hacking attempt detected<br/><br/>'; }

只需要

$json="\nflag"

而在非多行模式下,$似乎会忽略在句尾的%0a

if (preg_match('/^flag$/', $_GET['a']) && $_GET['a'] !== 'flag') {
    echo $flag;
}

只需要传入

?a=flag%0a
[红明谷CTF 2021]write_shell
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值