首先进入界面,发现了url中毕竟吸引人的地方:img参数,很敏感,不禁让我想到SSRF。而且他是BASE编码

    md5强类型碰linux命令执行绕过([安洵杯 2019]easy_web) - 图1

    这里有个点就是BASE64解码的时候可以尝试在后面加==

    比如,如下就无法解码

    md5强类型碰linux命令执行绕过([安洵杯 2019]easy_web) - 图2

    如下就成功解码

    md5强类型碰linux命令执行绕过([安洵杯 2019]easy_web) - 图3

    再尝试解码

    md5强类型碰linux命令执行绕过([安洵杯 2019]easy_web) - 图4

    得到类似16进制的样式,解码

    md5强类型碰linux命令执行绕过([安洵杯 2019]easy_web) - 图5

    这样的话我们尝试试一试index.php逆着尝试

    TmprMlpUWTBOalUzT0RKbE56QTJPRGN3

    md5强类型碰linux命令执行绕过([安洵杯 2019]easy_web) - 图6

    放在img解码后:

    md5强类型碰linux命令执行绕过([安洵杯 2019]easy_web) - 图7

    因为这里是任意文件读,所以我们课认为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

    %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

    传入ca\t时,\, \\, \t,前面看到是匹配不上的,\t, \\t竟然也匹配不上,interesting

    直到用了\\t才匹配上,既然\\t能匹配上,\\为什么匹配不上啊,求有知道的前辈明示。个人猜测,ca\t传进php脚本之后,以cat\t存储,想要表示它,就得用\\,但显然\\并没有匹配上,不知真实原因。

    克服了这一点,就可以get flag,

    md5强类型碰linux命令执行绕过([安洵杯 2019]easy_web) - 图10

    md5强类型碰linux命令执行绕过([安洵杯 2019]easy_web) - 图11