题解web

打印 上一主题 下一主题

主题 1047|帖子 1047|积分 3141

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的效果
  1. <?php
  2. $str = "ffifdyop";
  3. echo "The string: ".$str."<br>";
  4. echo "TRUE - Raw 16 character binary format:如下所示: ".md5($str, TRUE)."<br>";
  5. echo "FALSE - 32 character hex number: ".md5($str)."<br>";
  6. ?>
复制代码
运行后如下

利用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文本

得到如下代码
  1. <?php  
  2. class Flag{  //flag.php  
  3.     public $file;  
  4.     public function __tostring(){  
  5.         if(isset($this->file)){  
  6.             echo file_get_contents($this->file);
  7.             echo "<br>";
  8.         return ("U R SO CLOSE !///COME ON PLZ");
  9.         }  
  10.     }  
  11. }  
  12. ?>  
复制代码
6)useless.php里写的file_get_contents直接去读flag.php,构造反序列化,poc:
  1. <?php
  2. class Flag
  3. {  //flag.php
  4.     public $file = 'flag.php';
  5. }
  6. $a = new Flag();
  7. 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 :
  1. |cat /flag
复制代码
就能得到flag
5.[NSSCTF 2022 Spring Recruit]ezgame

1)打开情况后是一个游戏界面

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


3)f12查看源码,到js出进行利用

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

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


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

西河刘卡车医

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表