首先进入界面,发现了url中毕竟吸引人的地方:img参数,很敏感,不禁让我想到SSRF。而且他是BASE编码
这里有个点就是BASE64解码的时候可以尝试在后面加==
比如,如下就无法解码
如下就成功解码
再尝试解码
得到类似16进制的样式,解码
这样的话我们尝试试一试index.php逆着尝试
TmprMlpUWTBOalUzT0RKbE56QTJPRGN3
放在img解码后:
因为这里是任意文件读,所以我们课认为preg_match(‘/flag’)处给了提示,flag在文件里,路径无非就是./或/,文件名可能是flag,flag.txt,flag.php,大概也就五六种。不是重点。重点是后面的echo ‘$cmd’这个命令执行时我们的突破口
稍微总结一下,简单的命令执行哈数中
exec(),返回值为输出的最后一行
system(),返回值为输出值的最后一行,打印输出值
passthru(),没有返回值,打印全部输出值
shell_exec(),将输出值作为返回值,不打印任何信息,同’’。
$cmd
直接接触的这一层的md5判断已经不管用了,现在已经有了真正意义上的md5碰撞,网上也可以找到相关的字符串甚至是直接下载程序,我把一个txt拖进去,生成了一个新的txt,两个文件的md5真的相同,查看内容发现里面只有几位不一样。这里直接用之前记下的:
%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2
而$cmd
前面这个超长的preg_match(“/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\’|\”|`|;|,|*|\?|\|\\|\n|\t|\r|\xA0|{|}|(|)|\&[^\d]|@|||\$|[|]|{|}|(|)|-|<|>/i”,
$cmd))
,几乎把我们常用的文件读命令或者nc拿shell命令的道路都堵死了,想了想也没有想出什么法子(太菜了)。过滤了ls,还有dir指令
网上有的大佬说,可以用sort命令:sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。
在看了wp后,我也意识到自己思路受限了,或者说自己心急了,再或者说自己基础不够好。这里不是说有正则就能匹配一切,比如这里想要匹配反斜杠的|\|写的不太好,可以绕过,我们传ca\t flag,竟然就可以绕过。一开始我以为ca\t中的\t会成为tab而绕过,但发现这个正则式里面是有\t的,根本匹配不到,又想到可能得用\\来匹配,发现正则式里也有。事情不简单,在本地试了一下。
传入ca\t时,\, \\, \t,前面看到是匹配不上的,\t, \\t竟然也匹配不上,interesting
直到用了\\t才匹配上,既然\\t能匹配上,\\为什么匹配不上啊,求有知道的前辈明示。个人猜测,ca\t传进php脚本之后,以cat\t存储,想要表示它,就得用\\,但显然\\并没有匹配上,不知真实原因。
克服了这一点,就可以get flag,