[CISCN 2019华东南]Web11
[CISCN 2019华东南]Web11
题目来源:nssctf
题目类型:web
涉及考点:SSTI、RCE
1. 先简单介绍一下SSTI
模板引擎:(这里特指用于Web开发的模板引擎)
是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,利用模板引擎来生成前端的html代码,模板引擎会提供一套生成html代码的程序,然后只需要获取用户的数据,然后放到渲染函数里,然后生成模板+用户数据的前端html页面,然后反馈给浏览器,呈现在用户面前
SSTI(Server-Side Template Injection):服务器端模板注入
漏洞成因就是服务端接收了用户的恶意输入以后,未经任何处理就将其作为 Web 应用模板内容的一部分,模板引擎在进行目标编译渲染的过程中,执行了用户插入的可以破坏模板的语句,因而可能导致了敏感信息泄露、代码执行、GetShell 等问题
Smarty
是最流行的PHP模板语言之一,为不受信任的模板执行提供了安全模式。这会强制执行在 php 安全函数白名单中的函数,因此我们在模板中无法直接调用 php 中直接执行命令的函数(相当于存在了一个disable_function)
了解了上述知识之后我们来看题目
2. 题目给了一个网络请求API
![](https://images.cnblogs.com/cnblogs_com/blogs/729425/galleries/2331778/o_230825091636_image-20230825164732208.png)
可以看到页面使用了Smarty模板,同时显示了IP
在这里有两个知识点:
- Smarty支持使用{php}{/php}标签来执行被包裹其中的php指令
- XFF头代表了HTTP的请求端真实的IP,通过修改XXF头可以实现伪造IP
题目给的两个url进不去,也不知道有啥用。但我们目前确定的思路就是通过伪造XFF,利用SSTI构造payload,实现命令执行
3. 构造payload
- 先尝试构造
X-Forwarded-For:{6*6}
:
![](https://images.cnblogs.com/cnblogs_com/blogs/729425/galleries/2331778/o_230825091636_image-20230825171111282.png)
注意:Request Header最底下一定要两个空行,第一个空行前表示请求头,第二个空行表示请求体,若没有这两个空行就传不进去(又被这个卡了好一会)
可以证明这里存在SSTI
- 再构造
X-Forwarded-For:{system('cat /flag')}
![](https://images.cnblogs.com/cnblogs_com/blogs/729425/galleries/2331778/o_230825091636_image-20230825171456183.png)
得到flag:
NSSCTF{06b9b70f-a189-4408-9e3e-b469e16ce523}
日期:2023.8.25
作者:y0Zero