赞
踩
打开靶机
使用御剑扫描得到
跟进之后,发现了账号密码,登录又得到提示
登录得到提示
那我们使用bp抓包添加Referer即可得到下一步提示。
发现还不是XYCTF的浏览器那我们改改浏览器User-Agent:XYCTF
还需要本地用户,那我们在修改一个client-IP:127.0.0.1添加上去即可
还需要一个代理,网上查找了一下伪造代理就发现使用via即可。
那我们就传cookie即可
打开靶机
随便输入一个ls试试看
这里的SHELL := /bin/bash:这行设置了 Makefile 里命令执行的 shell 环境为 /bin/bash。
ifndef PATH 和 override PATH :=:这两行检查环境变量 PATH 是否被定义,如果没有定义或者已经被定义,它们都会将 PATH 环境变量置空。这可能会导致问题,因为 PATH 是一个重要的环境变量,它定义了 shell 查找可执行文件的位置。
所以我们可以尝试一下echo $(< flag)试试看
返回一个echo,$被过滤了,那我们双写试试看。
打开靶机,跟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]
打开靶机
解析
这个命令看起来是在尝试使用两个输入重定向符号来传递输入给一个空的文件描述符。通常,<符号用于
输入重定向,而 < 是一种 s h e l l 变量,表示从标准输入中读取。但是在这个命令中, <是一种shell变量,表示从标准输入中读取。但是在这个命令中, <是一种shell变量,表示从标准输入中读取。但是在这个命令中,$表示当前shell的进
程ID,而<后面跟着的<又被理解为输入重定向符号。所以整个命令看起来有些混乱。
首先, $$ 是一个特殊的shell变量,代表当前Shell进程的ID(PID)。在Unix和类Unix系统中,这个变量通常用于引用当前Shell进程的ID。
然后, < 符号通常用于输入重定向,表示将一个文件的内容作为命令的输入,或者从文件中读取内容。
接着, $< 看起来像是一个尝试使用 < 符号来读取 $ 字符后面的内容,但这在常规的shell语法中是不被接受的。
因此,整个命令 $ ( < (< (<<) 似乎尝试将当前Shell进程的ID作为文件名,然后使用 < 符号将其作为输入重定向,但这在大多数情况下并不合法,因为Shell通常不会允许使用PID来打开文件。
打开靶机
上图片进行比较,那我们随便上传两个试试看
返回说只有jpg格式,那我们就把png换一个jpg的试试看
返回
分析一下
这段文本告诉我们两个对象在不考虑它们的MD5哈希时是相等的,但是它们的MD5哈希值是不同的。这可能意味着虽然两个对象在某种意义上是"相等"的(例如,它们可能有相同的内容或值),但它们在某些细节上有所不同,导致它们的MD5哈希值不匹配。
那我们百度两张MD5值相同的图片比较一下试试看
最后返回flag
打开靶机
一开始以为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
打开靶机
解析
这是一个白名单绕过,从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'
仔细看清楚了没有空格跟括号!!!!
所以最后得出
打开靶机
简单分析一下
第一个条件:‘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,
XYCTF,XY 不能等于 “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" 中,
XY的md5值必须等于"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还是有很多地方值得我反复观看且学习,不是很复杂,但是需要耐心,慢慢寻找资料,理解其中的意思。
打开靶机
名单绕过
构造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来获取文件
生成 phar 包
成功上传,给出了文件路径,这里的文件名,应该是对原文件名取得哈希值。
/tmp/f3ccdd27d2000e3f9255a7e3e2c48800.jpg
进入 class.php
命令成功执行
如有写的不好地方,请师傅们多多包涵,刚学没多久。
制作不易,点个赞吧~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。