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了