题解web

1.[LitCTF 2023]Follow me and hack me

1)进入题目环境,提示get传参,post传参

2)看看源码,也没啥

3)直接用hackbar,传入对应参数即可得到FLAG

3)但是扫描出来它后端还有东西,

4)打开原来是彩蛋

2.[BJDCTF 2020]easy_md5

1)进入环境后不管输入什么

他只会修改passward 页面没有回显 没反应

2)一顿输入操作后无果 只能通过url看到是get传参 用burp抓包看看

这里学一下关于md5($pass,true)的注入

关于这题

发现了这里它提示 select * from `admin` where password=md5($pass,true)

也就是通过注入来进行绕过 这里先看下php MD5函数的用法

32位16进制字符串的意思是:将MD5加密得到的128 位长度的"指纹信息",以每4位为一组,分为32组,每组以转换为16进制,进行转换得到一个32位的字符串。

总的来说就是我们平时看到的MD5加密的结果

16位原始二进制格式的字符串的意思是:将128 位长度的"指纹信息"分组转化为16位的一个字符串,然后两个字符为一组,依照ACILL码转化为字符串。

也就是说,就是当md5函数的第二个参数为true时,该函数的输出是原始二进制格式,会被作为字符串处理。

这里进行绕过就是需要构造一个语句使得sql语句永恒为真

像这样的话 select * from `admin` where password=''or'xxx 当or后面的值为true时即可完成注入

如此:要达到注入。首先要有一个字符串,这个字符串经过md5得到的16位原始二进制的字符串能帮我们实现sql注入。首先or这个字符串是必要的,因为需要构造永恒为真的语句。同时为了配对原先sql语句里面有的单引号进行闭合

这里再看下ffifdyop的效果

<?php
$str = "ffifdyop";
echo "The string: ".$str."<br>";
echo "TRUE - Raw 16 character binary format:如下所示: ".md5($str, TRUE)."<br>";
echo "FALSE - 32 character hex number: ".md5($str)."<br>";
?>

运行后如下

使用ASCII码在线转换器看效果

3)然后查看页面源代码发现需要传入两个参数

满足a与b的参数不同且两者的MD5相同就会返回正确的值

注意这里是弱比较==

这里有两种方法 第一种采用数组传参 数组传参方式格式为num[]=w num为参数(例如本题的a) w为传入的值 最终传入的值如下

?a[]=1&b[]=2 因为md5不能处理数组,md5 函数哈希数组会返回 NULL。从而达到两者相等进行绕过。

4)这里只能使用数组传参了 之前的那个页面由于是弱比较 所以有两种方法可以进行MD5绕过

这里是强比较所以只能使用数组 不过这道题 数组可以通杀绕过这两层的MD5

Payload如下 post传参

param1[]=2¶m2[]=3

3.[ZJCTF 2019]NiZhuanSiWei

1)

file_get_contents()函数用于读取文件中的内容,并将其作为字符串返回。它通常用于读取文本文件或从远程URL获取内容。在本文中,我们将介绍使用file_get_contents()函数来读取文件的基本方法。

语法

file_get_contents(filename, include_path, context, start, max_length)

参数

filename:必需,指定要读取的文件名称,也可以是一个URL,支持绝对路径和相对路径。

include_path:可选,如果设置了这个参数,PHP将在include_path(设置在php.ini中)中查找文件。如果没有设置,PHP将在当前脚本目录中查找文件。

context:可选,是一个HTTP请求的上下文选项数组,通常在与文件读取和远程URL访问相关的情况下使用。

start:可选,规定从文件中的哪个位置开始读取,以字节数表示。

max_length:可选,规定从文件中读取的最大字节数。

preg_match()函数、

语法

  • $pattern:要搜索的模式,字符串类型。

  • $subject:输入字符串。

  • $matches:如果提供了参数matches,它将被填充为搜索结果。 $matches[0]将包含完整模式匹配到的文本, $matches[1] 将包含第一个捕获子组匹配到的文本,以此类推。

  • $flags:可以被设置为以下标记值的组合:PREG_UNMATCHED_AS_NULL、PREG_OFFSET_CAPTURE

  • $offset:可选参数 offset 用于 指定从目标字符串的某个位置开始搜索(单位是字节)。

  • 返回值:匹配次数。 它的值将是0次(不匹配)或1次,因为preg_match()在第一次匹配后 将会停止匹配。发生错误preg_match()返回 FALSE。

2)

$text是一个变量,file_get_contents不能读取一个变量

3)分析一下:

有三个传入的变量名,猜测最后进入else可以出flag;

首先我们输入的t要满足t=welcome to the zjctf

尝试使用data伪协议去给他赋值,在一个文件里面。payload:/?text=data://text/plain,welcome to the zjctf

成功进入

4)然后需要用url语句读取文件内容

5)里面是一串basse64编码,读取之后是一篇新的php文本

得到如下代码

<?php  

class Flag{  //flag.php  
    public $file;  
    public function __tostring(){  
        if(isset($this->file)){  
            echo file_get_contents($this->file); 
            echo "<br>";
        return ("U R SO CLOSE !///COME ON PLZ");
        }  
    }  
}  
?>  

6)useless.php里写的file_get_contents直接去读flag.php,构造反序列化,poc:

<?php
class Flag
{  //flag.php
    public $file = 'flag.php';
}
$a = new Flag();
echo urlencode(serialize($a));

7)然后将得到的序列化语句传入,查看源码即可得到flag

4.[LitCTF 2023]Ping

1)进入环境,就是一个只能ping ip地址的文本框,这里也是直接ping一下127.0.0.1这个地址

2)ping出来一堆东西,没太看懂,还是选择抓包试试

3)直接修改command=|cat /flag,然后发包即可得到flag

4)其他解法

源码里有一个用于过滤的函数,这是一段插在 html 中的 js 代码。

函数的大致作用是严格匹配 ipv4 地址,比如 127.0.0.1 这种格式,所以域名都不可以。被禁了

对于这种写在前端的验证函数,不需要去研究如何绕过,直接禁掉 js 代码的调用就好了,浏览器应该都有这个功能。我是用火狐上的一个插件来禁用 js 代码:

打开后,此时再去输入命令,发现没有任何过滤。

flag 在根目录下,用 ls 不断查找每一级目录下的文件,最后发现 flag 在根目录下。

直接查看根目录下的 flag :

|cat /flag

就能得到flag

5.[NSSCTF 2022 Spring Recruit]ezgame

1)打开环境后是一个游戏界面

2)看看源码,没多大用,扫出来几个网页,也没多大用

3)f12查看源码,到js出进行操作

4)打开覆盖新建一个空文件放进去,然后点击目标文件,点击覆盖,右下角变紫色就成功,然后修改分数

5)改好后随便玩一下,救出flag了

相关推荐
公贵买其鹿21 分钟前
List深拷贝后,数据还是被串改
java
PieroPc23 分钟前
Python 写的 智慧记 进销存 辅助 程序 导入导出 excel 可打印
开发语言·python·excel
2401_857439693 小时前
SSM 架构下 Vue 电脑测评系统:为电脑性能评估赋能
开发语言·php
SoraLuna3 小时前
「Mac畅玩鸿蒙与硬件47」UI互动应用篇24 - 虚拟音乐控制台
开发语言·macos·ui·华为·harmonyos
xlsw_3 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
神仙别闹4 小时前
基于java的改良版超级玛丽小游戏
java
Dream_Snowar4 小时前
速通Python 第三节
开发语言·python
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭5 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫5 小时前
泛型(2)
java
超爱吃士力架5 小时前
邀请逻辑
java·linux·后端