CTFshow web93-104关

这周要学习的是php代码审计 根据师兄的作业 来做web入门的93-104关

93关

看代码 进行分析

他的主函数


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

 解析:

输入一个变量 num 进行get传参 如果num=4476 返回错误 

传入num 用函数preg_match进行匹配,如果匹配到则返回错误

再根据intval函数的取整的特性,传入payload:?num=4476.1/?num=010574(加0是因为intval 函数检测时字符串以 "0" 开始,使用 8 进制)

知识点:

php中使用两个等号“==” 比较,只比较值,不比较类型(两个等号是弱类型比较,他会将两边自动转换为同一种类型后再进行比较。所以他比较的就只是值 ,不比较类型。)

intval 函数用于获取变量的整数值,intval() 函数通过使用指定的进制 base 转换(默认是十进制),返回变量 var 的 integer 数值。

如果 base 是 0,通过检测 var 的格式来决定使用的进制:

  • 如果字符串包括了 "0x" (或 "0X") 的前缀,使用 16 进制 (hex);否则,
  • 如果字符串以 "0" 开始,使用 8 进制(octal);否则,
  • 将使用 10 进制 (decimal)。

实例:

<?php
echo intval(42);                      // 42
echo intval(4.2);                     // 4
echo intval('42');                    // 42
echo intval('+42');                   // 42
echo intval('-42');                   // -42
echo intval(042);                     // 34
echo intval('042');                   // 42
echo intval(1e10);                    // 1410065408
echo intval('1e10');                  // 1
echo intval(0x1A);                    // 26
echo intval(42000000);                // 42000000
echo intval(420000000000000000000);   // 0
echo intval('420000000000000000000'); // 2147483647
echo intval(42, 8);                   // 42
echo intval('42', 8);                 // 34
echo intval(array());                 // 0
echo intval(array('foo', 'bar'));     // 1
?>

94关

 只比93关多了一个  !strpos($num, "0")

知识点:

strpos() 函数查找字符串在另一字符串中第一次出现的位置(区分大小写)。

解析:

我们还是可以利用8进制进行绕过或者小数绕过,但是因为strpos函数特性 要在8进制前加+或者加空格 ,小数应该是0 payload:?num=4476.0/?num=+010574

95关

解析:

  if(preg_match("/[a-z]/i", $num)){

 if(preg_match("/[a-z]|\./i", $num)){  95关

与之前不同的地方在正则匹配这里,多了一个. 其他的没变

还是用之前的payload:?num=+010574

96关

 

知识点:

这题看到了flag.php 应该是让我们找文件路径的题,找文件路径可以用

php伪协议filter

/var/www/html/flag.php(/var/www/html 只是Web服务器的默认根文件夹)

./flag.php(在linux下面表示当前目录是 "./" " . ./"代表上一层目录 “/”:代表根目录.)

解析:

payload:/var/www/html/flag.php    ./flag.php    php://filter/resource=flag.php

php://filter/read=convert.base64-encode/resource=flag.php (base64编码的伪协议使用)

97关

 知识点:

属于php md5强比较绕过

在 php 中,=== 代表着强比较,不仅仅会比较值,还会比较类型。因此这里不能在使用上面的方式进行绕过了。

要绕过此处的比较,需要向 md5() 函数中传入数组,md5() 函数中如果传入的不是字符串而是数组,不但md5()函数不会报错,结果还会返回null,在强比较里面null=null为 True 绕过。

解析:

因此这里可以使用数组绕过

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

是post传参而不是get传参

98关

知识点:

php三元换算符

解析:

 $_GET?$_GET=&$_POST:'flag' 如果存在GET请求,则用POST请求传入的值将其覆盖掉.

$_GET['HTTP_FLAG']=='flag'?$flag:__FILE__ GET传入的HTTP_FLAG的值为flag,则输出flag.

所以POST:HTTP_FLAG=flag;GET随便传什么都行.

 

99关

 知识点:

array函数

array_push函数

 in_array函数

file_put_contents() 函数把一个字符串写入文件中。

该函数访问文件时,遵循以下规则:

  1. 如果设置了 FILE_USE_INCLUDE_PATH,那么将检查 *filename* 副本的内置路径
  2. 如果文件不存在,将创建一个文件
  3. 打开文件
  4. 如果设置了 LOCK_EX,那么将锁定文件
  5. 如果设置了 FILE_APPEND,那么将移至文件末尾。否则,将会清除文件的内容
  6. 向文件中写入数据
  7. 关闭文件并对所有文件解锁

如果成功,该函数将返回写入文件中的字符数。如果失败,则返回 False。

解析:

通过看这三个函数,知道了$allow = array()是设置了数组

0x36d是877的十六进制。for语句是一个循环结构,$i从36开始,每次与877作比较,只要小于877,则让$i加1。每次for语句执行成功,也就是加1都会执行下面的array_push函数。

array_push($allow, rand(1,$i))在1-$i之间随机生成一个整数,添加到数组$allow尾部

if(isset($_GET['n']) && in_array($_GET['n'], $allow)) 从这里可以看出in_array函数使用的是弱比较 因为他没有设置第三个参数为true 所以我们传入1.php就相当于传入了1 这里也是这题的主要考点

file_put_contents($_GET['n'], $_POST['content']); 这句话就是get传参并用post传入内容

所以post就可以传入命令执行语句,get传入1.php就可以绕过,因为数字1正好在 range(1,24)数组中,当随机生成的数字正好是1时就可以绕过 in_array()函数判断

解析:

payload: get: ?n=1.php   post:  content=<?php system('ls');?>

传入以后就可以找到1.php的页面执行命令找到了存放flag的文件

再用2.php读取flag文件

 

100关

 知识点:

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

运算符优先级的划分如下:

()小括号优先级最高

! 优先级高于 算术运算符

算术运算符 优先级高于 关系运算符

关系运算符优先级高于 "&&"和"||"

"&&"和"||"优先级高于 "="

运算符的种类还有很多,在往后的学习中我们就会慢慢地接触到,所以,在同一行代码中,

如果出现多种不同优先级的运算符时,最好还是加上小括号,这样才会比较直观。

(3)同等优先级的运算符,执行顺序的划分:

算术运算符 —— 乘法、除法、取余运算 优先级高于 加法、减法。

算术运算符 —— 乘法、除法、取余运算 出现在同一行代码中,则按从左到右的顺序执行。

算术运算符 —— 加法、减法, 出现在同一行代码中,则按从左到右的顺序执行。

关系运算术——出现在同一行代码中,按从左往右顺序执行。

 

​ 

 解析:

is_numeric函数 用于检测变量是否为数字或数字字符串

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

因为=比and优先 所以v0的值是v1赋的 所以v0=is_numeric($v1) 看到代码后面有eval函数

想到命令执行

这需要$v2传入命令,$v3需要;结尾,但这么一来is_numeric一处理就变成了

$vo = $v1 and FALSE and FAlse

if(!preg_match("/\;/", $v2)){
        if(preg_match("/\;/", $v3))

再根据这两句,v2必须没有;v3必须

payload: /?v1=1&v2=system('ls')&v3=;

找到了包含flag的文件 但是点开什么都没有 打开ctfshow.php看看

/?v1=1&v2=system('tac ctfshow.php')&v3=;     (这里用tac的原因是发现cat不行然后换了一下)

发现了flag 0x2d是16进制的- 转换一下就好了

101关

 

不一样的地方在于把v2 v3的条件给改了

if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\)|\-|\_|\+|\=|\{|\[|\"|\'|\,|\.|\;|\?|[0-9]/", $v2)){
if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\(|\-|\_|\+|\=|\{|\[|\"|\'|\,|\.|\?|[0-9]/", $v3)){

知识点

新学习到了反射

反射,通俗来讲就是可以通过一个对象来获取所属类的具体内容,php中内置了强大的反射API:

    ReflectionClass:一个反射类,功能十分强大,内置了各种获取类信息的方法,创建方式为new ReflectionClass(str 类名),可以用echo new ReflectionClass(‘className’)打印类的信息。

    ReflectionObject:另一个反射类,创建方式为new ReflectionObject(对象名)。

 

API:API 就是应用程序编程接口。它是能用来操作组件、应用程序或者操作系统的一组函数

php反射类_php 反射类_raoxiaoya的博客-CSDN博客具体的可以看这个大佬的博客 就不做具体说明了

所以我们在这里可以直接用反射类的方法来做这道题

解析:

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

这里的flag是少了一位的 可以用bp抓包爆破 也可以一个一个字符尝试

102关

 

 知识点:

substr() 函数返回字符串的一部分。

注释:如果 start 参数是负数且 length 小于或等于 start,则 length 为 0。

 call_user_func():调用一个回调函数处理字符串,
可以用匿名函数,可以用有名函数,可以传递类的方法,
用有名函数时,只需传函数的名称
用类的方法时,要传类的名称和方法名
传递的第一个参数必须为函数名,或者匿名函数,或者方法
其他参数,可传一个参数,或者多个参数,这些参数会自动传递到回调函数中
而回调函数,可以通过传参,获取这些参数
返回回调函数处理后的结果

【php】php中call_user_func函数的用法_call_user_func用在什么时候_yanhui_wei的博客-CSDN博客

解析:

<?phphighlight_file(__FILE__);$v1 = $_POST['v1'];$v2 = $_GET['v2'];$v3 = $_GET['v3'];$v4 = is_numeric($v2) and is_numeric($v3); 通过将变量v2执行的命令base64加密后转换成16进制字符串来使得变量v4为ture 
if($v4){    $s = substr($v2,2);   $str = call_user_func($v1,$s);
通过变量v1调用hex2bin函数将变量v2的16进制字符串转换成原来的base64编码形式(因为这里v2只使用数字 并且是在第二位之后即第三位开始读取suo'y)
echo $str;    file_put_contents($v3,$str);
通过使用php://filter伪协议写入webshell

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

payload:

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

post: v1=hex2bin

(<?=`cat *`;——base64:PD89YGNhdCAqYDs=——16进制:5044383959474e6864434171594473) (v3为伪协议)

 

在访问1.php 得到flag

 103关

看代码发现和102关没什么区别 该绕过的都用base64以及16进制绕过了 可以沿用102关的payload

都是在页面的源代码里找到的flag

104关

 知识点:

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

解析:

get传入v2 post传入v1 让两个变量的sha1值相等 用的是弱比较

payload: get: v2[]=1  post: v1[]=1

得到flag

php代码审计作业题到此结束 通过这些题也找到了代码审计方面的做题思路,一些不认识的函数也认识了不少 但是不足也很明显,好多函数的特性并没有了解过,看到简单的代码还行 如果有复杂的代码还是头大 欠缺的地方很多 到实际的时候也没有那么多时间让你去查函数  还是要花功夫去记函数的

 

 

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

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

相关文章

认识http的方法、Header、状态码以及简单实现一个http的业务逻辑

文章目录 http的方法http状态码http重定向http常见Header实现简单业务逻辑Protocol.hppUtil.hppServer.hppServer.cc 效果 http的方法 方法说明支持的HTTP版本GET获取资源1.0/1.1POST传输实体主体1.0/1.1PUT传输文件1.0/1.1HEAD获得报文首部1.0/1.1DELETE删除文件1.0/1.1OPTIO…

【ts】【cocos creator】excel表格转JSON

需要将表格导出为text格式放到项目resources/text文件夹下 新建场景&#xff0c;挂载到Canvas上运行 表格文件格式&#xff1a; 保存格式选text tableToJson : import CryptoJS require(./FileSaver);const { ccclass, property } cc._decorator;ccclass export default c…

SpringBoot案例-部门管理-新增

根据页面原型&#xff0c;明确需求 页面原型 需求 阅读接口文档 接口文档链接如下&#xff1a; 【腾讯文档】SpringBoot案例所需文档 https://docs.qq.com/doc/DUkRiTWVaUmFVck9N 思路分析 前端在输入要新增的部门名称后&#xff0c;会以JSON格式将数据传入至后端&#xf…

SpringBoot 3.x整合Fluent Mybatis极简流程

此为基础配置&#xff0c;不包括其他高级配置&#xff0c;需要其他高级配置请查阅官方文档&#xff1a;[fluent mybatis特性总览 - Wiki - Gitee.com](https://gitee.com/fluent-mybatis/fluent-mybatis/wikis/fluent mybatis特性总览) 版本信息 Spring Boot 版本&#xff1a…

C语言创建目录(文件夹)之mkdir

一、mkdir 说明&#xff1a;创建目录。 头文件库&#xff1a; #include <sys/stat.h> #include <sys/types.h>函数原型&#xff1a; int mkdir(const char *pathname, mode_t mode);mode方式&#xff1a;可多个权限相或&#xff0c;如0755表示S_IRWXU | S_IRGRP…

undefined reference to `dlopen‘ ‘SSL_library_init‘ `X509_certificate_type‘

使用Crow的时候需要注意crow依赖asio依赖OpenSSL&#xff0c;asio要求1.22以上版本&#xff0c;我使用的是1.26.0&#xff1b; 这个版本的asio要求OpenSSL是1.0.2&#xff0c;其他版本我得机器上编不过&#xff0c;ubuntu上默认带的OpenSSL是1.1.1; 所以我下载了OPENSSL1.2.0重…

MySQL高阶知识点(一)一条SQL【更新】语句是如何执行的

一条SQL【更新】语句是如何执行的 首先&#xff0c;可以确定的说&#xff0c;【查询】语句的那一套流程&#xff0c;【更新】语句也是同样会走一遍&#xff0c;与查询流程不一样的是&#xff0c; 更新语句涉及到【事务】&#xff0c;就必须保证事务的四大特性&#xff1a;ACID&…

项目介绍:《WeTalk》网页聊天室 — Spring Boot、MyBatis、MySQL和WebSocket的奇妙融合

目录 引言&#xff1a; 前言&#xff1a; 技术栈&#xff1a; 主要功能&#xff1a; 功能详解&#xff1a; 1. 用户注册与登录&#xff1a; 2. 添加好友 3. 实时聊天 4. 消息未读 5. 删除聊天记录 6. 删除好友 未来展望&#xff1a; 项目地址&#xff1a; 结语&am…

【redis 3.2 集群】

目录 一、Redis主从复制 1.概念 2.作用 2.1 数据冗余 2.2 故障恢复 2.3 负载均衡 2.4 高可用 3.缺点 4.流程 4.1 第一步 4.2 第二步 4.3 第三步 4.4 第四步 5.搭建 5.1 主 5.2 从 6.验证 二、Reids哨兵模式 1.概念 2.作用 2.1 监控 2.2 自动故障转移 2.…

分布式应用:Zabbix监控Nginx

目录 一、理论 1.Zabbix监控Nginx 二、实验 1.Zabbix监控Nginx部署 三、问题 1.重启zabbix客户端失败 2.zabbix服务端测试客户端nginx状态失败 3.nginx启动失败 4.权限不够 一、理论 1.Zabbix监控Nginx &#xff08;1&#xff09;环境 zabbix服务端&#xff1a;192.1…

Tomcat线程池原理

1. 一个 SpringBoot 项目能同时处理多少请求&#xff1f;tomcat容器&#xff0c; 200 次。 2. 怎么来的&#xff1f; 而点击这些线程&#xff0c;查看其堆栈消息&#xff0c;可以看到 Tomcat、threads、ThreadPoolExecutor 等关键字 基于“短时间内有 200 个请求被立马处理…

Postman下载教程

目录 下载 安装 注意事项 看到很多小伙伴在问 Postman 下载的相关问题&#xff0c;花时间整理了下&#xff0c;下面教新入门的小伙伴如何去下载 Postman。 开始前我们可以先了解下&#xff1a;Postman 简介 下载 第一步&#xff1a;进入 Postman 官网 首先&#xff0c;我…

二级考python和c语言哪个好,计算机二级python和c

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;二级python和二级c语言哪个更吃香一些&#xff0c;二级python和二级c语言哪个更吃香一点&#xff0c;今天让我们一起来看看吧&#xff01; 计算机二级貌似只是在校园里的自嗨&#xff0c;出来工作后并没有觉得这个证书有…

LeetCode 21.合并两个有序链表

文章目录 &#x1f4a1;题目分析&#x1f4a1;解题思路&#x1f6a9;思路1: 归并排序思想&#xff08;不使用带哨兵卫的头节点&#xff09;&#x1f514;接口源码&#xff1a; &#x1f4a1;解题思路&#x1f6a9;思路2: 归并排序思想&#xff08;使用带哨兵卫的头节点&#xf…

Ubuntu安装JDK与IntelliJ IDEA

目录 前言 Ubuntu 安装 JDK 1、更新软件包列表 2、安装OpenJDK 3、验证安装 Ubuntu安装IntelliJ IDEA 1、下载 IntelliJ IDEA 2、解压缩 IntelliJ IDEA 安装包 3、移动 IntelliJ IDEA 到安装目录 4、启动 IntelliJ IDEA 前言 APT&#xff08;Advanced Package Tool&…

web-xss-dvwa

目录 xss&#xff08;reflected&#xff09; low medium high xss(store) low medium high xss(dom) low medium high xss&#xff08;reflected&#xff09; low 没有什么过滤&#xff0c;直接用最普通的标签就可以了 http://127.0.0.1/DVWA-master/vulnerabili…

C++ STL vector 模拟实现

✅<1>主页&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;C之STL &#x1f525;<3>创作者&#xff1a;我的代码爱吃辣 ☂️<4>开发环境&#xff1a;Visual Studio 2022 &#x1f4ac;<5>前言&#xff1a;上次我们已经数字会用…

unity新输入系统的简单使用(New InputSystem)

1、在包管理器 unity注册表中下载安装InputSystem 2、给玩家添加组件PlayerInput&#xff0c;点击CreatAction,创建一个InputAct InputAct,这是玩家的输入文件&#xff0c;在里面可以设置玩家输入 3、使用 例如玩家控制角色移动 在InputAct中&#xff0c;默认已经设置好了移…

[python]RuntimeError: Can‘t decrement id ref count (unable to close file...

使用spectralspatial模型进行EEG分类时&#xff0c;出现以下错误 RuntimeError: Cant decrement id ref count (unable to close file, errno 5, error message Input/output error) Segmentation fault (core dumped) 猜测是因为存储的model太大了导致的&#xff0c;找到了…

hive 中最常用日期处理函数

hive 常用日期处理函数 在工作中&#xff0c;日期函数是提取数据计算数据必须要用到的环节。哪怕是提取某个时间段下的明细数据也得用到日期函数。今天和大家分享一下常用的日期函数。为什么说常用呢&#xff1f;其实这些函数在数据运营同学手上是几乎每天都在使用的。 技术交…