XYCTF 2024 部分web wp

本文详细描述了一系列Web安全挑战中的技术环节,包括ezhttp、ezMake、ez?Make等工具的使用,PHP中字符串处理、md5哈希、RCE(RemoteCodeExecution)技巧以及如何通过八进制和phar包绕过限制获取flag。作者展示了在实战中解决这些问题的方法和思考过程。
摘要由CSDN通过智能技术生成

一、WEB

1、ezhttp

打开靶机
在这里插入图片描述

使用御剑扫描得到
在这里插入图片描述

跟进之后,发现了账号密码,登录又得到提示
在这里插入图片描述

在这里插入图片描述
登录得到提示
在这里插入图片描述

那我们使用bp抓包添加Referer即可得到下一步提示。

在这里插入图片描述

在这里插入图片描述

发现还不是XYCTF的浏览器那我们改改浏览器User-Agent:XYCTF

在这里插入图片描述

还需要本地用户,那我们在修改一个client-IP:127.0.0.1添加上去即可

在这里插入图片描述

还需要一个代理,网上查找了一下伪造代理就发现使用via即可。

在这里插入图片描述

那我们就传cookie即可

在这里插入图片描述

2、ezMake

打开靶机

在这里插入图片描述

随便输入一个ls试试看

在这里插入图片描述

这里的SHELL := /bin/bash:这行设置了 Makefile 里命令执行的 shell 环境为 /bin/bash。
ifndef PATH 和 override PATH :=:这两行检查环境变量 PATH 是否被定义,如果没有定义或者已经被定义,它们都会将 PATH 环境变量置空。这可能会导致问题,因为 PATH 是一个重要的环境变量,它定义了 shell 查找可执行文件的位置。

所以我们可以尝试一下echo $(< flag)试试看

在这里插入图片描述

返回一个echo,$被过滤了,那我们双写试试看。

在这里插入图片描述

3、ez?Make

打开靶机,跟1一样,随便输一个试试看。

在这里插入图片描述

被过滤了,那就换一个查。

在这里插入图片描述

既然可以pwd,那就试试能不能cd。

在这里插入图片描述

开始构造payload

cd ..&&cd ..&&cd ..&&cat /flag

在这里插入图片描述

检查发现cat /flag被过滤了,那我们换more,至于flag我们可以使用区间取值。

cd ..&&cd ..&&cd ..&&more [d-h][k-m][9-z][e-h]

在这里插入图片描述

4、εZ?¿м@Kε¿?

打开靶机
在这里插入图片描述

解析

这个命令看起来是在尝试使用两个输入重定向符号来传递输入给一个空的文件描述符。通常,<符号用于

输入重定向,而 < 是一种 s h e l l 变量,表示从标准输入中读取。但是在这个命令中, <是一种shell变量,表示从标准输入中读取。但是在这个命令中, <是一种shell变量,表示从标准输入中读取。但是在这个命令中,$表示当前shell的进

程ID,而<后面跟着的<又被理解为输入重定向符号。所以整个命令看起来有些混乱。

在这里插入图片描述

首先, $$ 是一个特殊的shell变量,代表当前Shell进程的ID(PID)。在Unix和类Unix系统中,这个变量通常用于引用当前Shell进程的ID。

然后, < 符号通常用于输入重定向,表示将一个文件的内容作为命令的输入,或者从文件中读取内容。

接着, $< 看起来像是一个尝试使用 < 符号来读取 $ 字符后面的内容,但这在常规的shell语法中是不被接受的。

因此,整个命令 $ ( < (< (<<) 似乎尝试将当前Shell进程的ID作为文件名,然后使用 < 符号将其作为输入重定向,但这在大多数情况下并不合法,因为Shell通常不会允许使用PID来打开文件。

5、ezmd5

打开靶机

在这里插入图片描述

上图片进行比较,那我们随便上传两个试试看

在这里插入图片描述

返回说只有jpg格式,那我们就把png换一个jpg的试试看

在这里插入图片描述
返回

在这里插入图片描述

分析一下

这段文本告诉我们两个对象在不考虑它们的MD5哈希时是相等的,但是它们的MD5哈希值是不同的。这可能意味着虽然两个对象在某种意义上是"相等"的(例如,它们可能有相同的内容或值),但它们在某些细节上有所不同,导致它们的MD5哈希值不匹配。

那我们百度两张MD5值相同的图片比较一下试试看

在这里插入图片描述

在这里插入图片描述

最后返回flag

在这里插入图片描述

6、ezPOP

打开靶机

在这里插入图片描述

一开始以为pop链条的构造很简单,就是cab触发,关键是calluserfunc怎么利用

测试一下发现不是这样

Payload

var_dump(call_user_func(current,hex2bin)(73797374656d)('dir'));

我们把对应参数赋值,c和d分别在pop链条里面进行赋值,a和b在外部

GET传参

xy=a:2:{i:0;O:3:“CCC”:1:{s:1:“c”;O:3:“AAA”:2:{s:1:“s”;O:3:“BBB”:2:
{s:1:“c”;s:12:“73797374656d”;s:1:“d”;s:9:“cat /flag”;}s:1:“a”;s:1:“g”;}}i:0;N;}

POST传参

a=current&c=hex2bin

最后得出flag

在这里插入图片描述

7、ezRCE

打开靶机

在这里插入图片描述

解析

这是一个白名单绕过,从KaTeX parse error: Expected group as argument to '\'' at position 63: …8','9','\\','\''̲,'‘,’<'];这里可以看出能给我们输入的并不对
而且system($cmd);是直接执行系统命令
那好,现在我们来尝试构造payload
首先系统命令?cmd=肯定是要的
那我们这里就在想了,既然限制我们只能输入这些
那我们普通的ls cat这些命令不就用不了了嘛
那怎么办呢??
一开始我也懵啊
然后我就查资料呗
发现其实liunx命令使用八进制也能运行
就比如ls的八进制是\154\163
那我们直接这样就可以被系统读取嘛???
那当然不行,如果这样的话,系统会直接默认为普通数字并不会有任何操作
那我怎么办呢?
这里问了一下GPT,我们可以利用bash的 ′ s t r i n g ′ 语法,它允许字符串中的转义序列被解释。那这里我们就可以直接写成 'string' 语法,它允许字符串中的转义序列被解释。 那这里我们就可以直接写成 string语法,它允许字符串中的转义序列被解释。那这里我们就可以直接写成’ \154\163’,就这样,我们尝试一下能不能在liunx里面运行

在这里插入图片描述

可以看见成功运行,那我们这里的payload就可以写成

?cmd=$’\154\163’

返回

在这里插入图片描述

虽然flag不在当前目录有点可惜,但是我们知道了使用八进制构造payload是可行的
那我们怎么办呢?
直接cat /flag嘛?
那显然是不可能的,因为flag都不在当前页面你怎么cat啊
那这里去请教了一下师傅,我们虽然不能直接cat的
但是我们看见白名单里面有个<小于号
哎,是不是想起来了?
没错,我们可以使用<重定向flag
通俗易懂一点就是说
如果把它想象成一种“流动”,可以这样理解:文件 “/flag” 的内容像水一样流入了 “cat” 命令,然后 “cat” 命令将它输出到了屏幕上。
那cat转换八进制就是\143\141\164
/flag八进制就是\057\146\154\141\147
<不变
所以我们可以这样构造payload

?cmd=$'\143\141\164'<$'\057\146\154\141\147'

仔细看清楚了没有空格跟括号!!!!
所以最后得出

在这里插入图片描述

8、warm up

打开靶机

在这里插入图片描述

简单分析一下
第一个条件:‘val1’ 和 ‘val2’ 必须存在,且它们的值不能相等,但他们的 md5 值必须相等。这种情况在 PHP 中是可能的,因为 PHP 的 md5 函数对于某些特殊的字符串存在哈希碰撞。一个常见的例子是 ‘val1’ 设置为 ’ QNKCDZO’,‘val2’ 设置为 ‘240610708’,这两个字符串的 md5 值都是 ‘0e830400451993494058024219903391’。

payload

http://xyctf.top:42998/?val1=QNKCDZO&val2=240610708

即可得到

在这里插入图片描述

第二个条件
$md5 必须存在,且 $md5 的 md5 值必须等于 $md5。这个条件只有当 $md5 为一个特定的值时才能满足。
在 PHP 中,当进行字符串比较时,任何以 ‘0e’ 开头的字符串都会被视为 0,因为这种形式的字符串被解析为浮点数(科学计数法)。
所以这个”0e215962017”就是一个满足条件的字符串。它的md5 值是 ‘0e291242834679215926201711822669466’。当 $md5 设置为 ‘0e215962017’ 时,这个字符串的 md5 值和它自身进行比较时,都会被视为 0,因此满足了 m d 5 = = m d 5 ( md5 == md5( md5==md5(md5) 的条件。

在这里插入图片描述

最后还有第三个条就能解出,那我们来分析一下
在这个条件中,$XY 必须等于 X Y C T F , XYCTF, XYCTFXY 不能等于 “XYCTF_550102591”,但是 X Y 的 m d 5 值必须等于 " X Y C T F 5 50102591 " 的 m d 5 值。然而, " X Y C T F 5 50102591 " 的 m d 5 值是 " 0 e 77033489083562900000837272529 " 。这个 m d 5 值在 P H P 中会被解析为 0 ,因为它以 " 0 e " 开头。在 " 314282422 " 中, XY 的 md5 值必须等于 "XYCTF_550102591" 的 md5 值。 然而,"XYCTF_550102591" 的 md5 值是 "0e77033489083562900000837272529"。这个 md5 值在 PHP 中会被解析为 0,因为它以 "0e" 开头。 在 "314282422" 中, XYmd5值必须等于"XYCTF550102591"md5值。然而,"XYCTF550102591"md5值是"0e77033489083562900000837272529"。这个md5值在PHP中会被解析为0,因为它以"0e"开头。在"314282422"中,XY 和 X Y C T F 的值都是 " 314282422 " ,所以它们是相等的。另外, " 314282422 " 的 m d 5 值是 " 0 e 830400451993494058024219903391 " , 它以 " 0 e " 开头,所以在 P H P 中会被解析为 0 。这样, m d 5 ( XYCTF 的值都是 "314282422",所以它们是相等的。另外,"314282422" 的 md5 值是 "0e830400451993494058024219903391", 它以 "0e" 开头,所以在 PHP 中会被解析为 0。这样,md5( XYCTF的值都是"314282422",所以它们是相等的。另外,"314282422"md5值是"0e830400451993494058024219903391",它以"0e"开头,所以在PHP中会被解析为0。这样,md5(XY) 就等于 md5(“XYCTF_550102591”)。

在这里插入图片描述

访问,URL+LLeeevvveeelll222.php即可

在这里插入图片描述

使用bp抓包修改

在这里插入图片描述

直接发送到repeater修改尝试

首先,我们要满足条件 isset($_POST[‘a’]) && !preg_match(‘/[0-9]/’, KaTeX parse error: Expected 'EOF', got '&' at position 13: _POST['a']) &̲& intval(_POST[‘a’])。我们可以通过发送一个 POST 请求,并设置 a 为一个空数组来实现。

这样 $_POST[‘a’] 就存在了,且 P O S T [ ′ a ′ ] 中不包含数字,但是 i n t v a l ( _POST['a'] 中不包含数字,但是 intval( POST[a]中不包含数字,但是intval(_POST[‘a’]) 的结果为 0,因此这个条件判断为假,进入 else 分支,打印出 “有点汗流浃背”。

接下来,我们需要执行 preg_replace( G E T [ ′ a ′ ] , _GET['a'], GET[a],_GET[‘b’],$_GET[‘c’]),并让它执行我们想要的系统命令。我们可以通过在 URL 中添加查询字符串 ?a=/abc/e&b=system(‘/ls’)&c=abc 来实现。这样 G E T [ ′ a ′ ] 的值就是 / a b c / e , _GET['a'] 的值就是 /abc/e, GET[a]的值就是/abc/e_GET[‘b’] 的值就是 system(‘/ls’),$_GET[‘c’] 的值就是 abc。

preg_replace() 函数会在 $_GET[‘c’] 的值 “abc” 中查找与 $_GET[‘a’] 的值 “/abc/e” 匹配的内容,然后使用 $_GET[‘b’] 的值 system(‘/ls’) 替换匹配到的内容。因为 $_GET[‘a’] 的值是一个正则表达式,所以它会匹配到 $_GET[‘c’] 的值 “abc”,并执行 system(‘/ls’) 命令,最后将命令的输出替换到 “abc” 中。

综上,我们可以通过以下 HTTP 请求来满足这个 PHP 代码的条件,并执行我们想要的系统命令:

在这里插入图片描述

这里为什么要补上一个Content-Type: application/x-www-form-urlencoded

因为

在 HTTP 协议中,当你发送一个 POST 请求时,Content-Type 头部字段用于告诉服务器你发送的数据的类型。application/x-www-form-urlencoded 是一种常见的数据类型,它表示发送的数据是一个 URL 编码的表单。

在这里插入图片描述

为什么说那么详细,总的来说这是我第一次做md5的web还是有很多地方值得我反复观看且学习,不是很复杂,但是需要耐心,慢慢寻找资料,理解其中的意思。

9、牢牢记住,逝者为大

打开靶机

在这里插入图片描述

名单绕过

构造payload

?cmd=%0dprint`dir`;%23

在这里插入图片描述

发现可以使用GET[‘cmd’]躲避长度限制

那我们就可以构造payload为(模仿CTFshow的)

?cmd=%0d`$_GET[c]`;%23&c=cp /flag nn

简单来说就是把flag复制到根目录nn里面,如果我们复制成功的话,待会就可以直接访问nn来获取flag了

在这里插入图片描述

想法固然不错,但我们还缺一个关键点,名称就是转换成为八进制然后在运行

?cmd=%0d`$_GET[c]`;%23&c=cp /flag nn转八进制

?cmd=%0d`$_GET[c]`;%23&c=$'\143\160'+$'\57\146\154\141\147'+$'\156\156’

然后我们在运行试试看(注意这里前后之间我们使用+链接,要不然系统读取不到)

在这里插入图片描述

可以看见,大差不差应该是成功了,并没有返回什么错误值

那我们就可以直接访问nn来获取文件

在这里插入图片描述

10、pharme

生成 phar 包

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

成功上传,给出了文件路径,这里的文件名,应该是对原文件名取得哈希值。

/tmp/f3ccdd27d2000e3f9255a7e3e2c48800.jpg

进入 class.php

在这里插入图片描述

命令成功执行

如有写的不好地方,请师傅们多多包涵,刚学没多久。

制作不易,点个赞吧~

  • 44
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 25
    评论
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值