首先进入界面,发现了url中毕竟吸引人的地方:img参数,很敏感,不禁让我想到SSRF。而且他是BASE编码
![md5强类型碰linux命令执行绕过([安洵杯 2019]easy_web) - 图1](/uploads/projects/u390550@fftlfh/425edd12fc93b0d2720a979771bc4aae.png)
这里有个点就是BASE64解码的时候可以尝试在后面加==
比如,如下就无法解码
![md5强类型碰linux命令执行绕过([安洵杯 2019]easy_web) - 图2](/uploads/projects/u390550@fftlfh/6a0c12a6a276cb3ac5c08fe28bb34398.png)
如下就成功解码
![md5强类型碰linux命令执行绕过([安洵杯 2019]easy_web) - 图3](/uploads/projects/u390550@fftlfh/50b68d331ea5aae41d81e8ce40fafdce.png)
再尝试解码
![md5强类型碰linux命令执行绕过([安洵杯 2019]easy_web) - 图4](/uploads/projects/u390550@fftlfh/ae92a69ee169df23b8dafa74e1a34e86.png)
得到类似16进制的样式,解码
![md5强类型碰linux命令执行绕过([安洵杯 2019]easy_web) - 图5](/uploads/projects/u390550@fftlfh/d4d69569511fa927459bd3594cb477fd.png)
这样的话我们尝试试一试index.php逆着尝试
TmprMlpUWTBOalUzT0RKbE56QTJPRGN3
![md5强类型碰linux命令执行绕过([安洵杯 2019]easy_web) - 图6](/uploads/projects/u390550@fftlfh/dc9363a0e0450af75334db78128ad4bd.png)
放在img解码后:
![md5强类型碰linux命令执行绕过([安洵杯 2019]easy_web) - 图7](/uploads/projects/u390550@fftlfh/3e34d9cda3c6c5846a812b07dad9ab7c.png)
因为这里是任意文件读,所以我们课认为preg_match(‘/flag’)处给了提示,flag在文件里,路径无非就是./或/,文件名可能是flag,flag.txt,flag.php,大概也就五六种。不是重点。重点是后面的echo ‘$cmd’这个命令执行时我们的突破口
稍微总结一下,简单的命令执行哈数中
exec(),返回值为输出的最后一行
system(),返回值为输出值的最后一行,打印输出值
passthru(),没有返回值,打印全部输出值
shell_exec(),将输出值作为返回值,不打印任何信息,同’’。
$cmd直接接触的这一层的md5判断已经不管用了,现在已经有了真正意义上的md5碰撞,网上也可以找到相关的字符串甚至是直接下载程序,我把一个txt拖进去,生成了一个新的txt,两个文件的md5真的相同,查看内容发现里面只有几位不一样。这里直接用之前记下的:
![md5强类型碰linux命令执行绕过([安洵杯 2019]easy_web) - 图8](/uploads/projects/u390550@fftlfh/9c7d2eed2a17ba8043d6603e6dd8884f.png)
%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的,根本匹配不到,又想到可能得用\\来匹配,发现正则式里也有。事情不简单,在本地试了一下。
![md5强类型碰linux命令执行绕过([安洵杯 2019]easy_web) - 图9](/uploads/projects/u390550@fftlfh/03789159b1219c9d91cfb456a37172bf.png)
传入ca\t时,\, \\, \t,前面看到是匹配不上的,\t, \\t竟然也匹配不上,interesting
直到用了\\t才匹配上,既然\\t能匹配上,\\为什么匹配不上啊,求有知道的前辈明示。个人猜测,ca\t传进php脚本之后,以cat\t存储,想要表示它,就得用\\,但显然\\并没有匹配上,不知真实原因。
克服了这一点,就可以get flag,
![md5强类型碰linux命令执行绕过([安洵杯 2019]easy_web) - 图10](/uploads/projects/u390550@fftlfh/2f6ab330bd86af9a830db15ee19e3a18.png)
![md5强类型碰linux命令执行绕过([安洵杯 2019]easy_web) - 图11](/uploads/projects/u390550@fftlfh/36d7e2e1167897b2bd2bf4d1c1135f44.png)
