@shaobaobaoer
2018-03-02T05:33:27.000000Z
字数 23519
阅读 3298
OWASP juice-shop 实战
摘要:OWASP JUICE-SHOP是一个开源的web应用靶场,里面包含了共记47个漏洞挑战任务,囊括了OWASP TOP 10的各个点,是一个很不错的渗透测试练手项目。
关键字:OWASP juice-shop TOP10 javascript python XXE SQL注入 弱加密 社会工程学 黑盒测试 CSRF
Juice Shop是用Node.js,Express和AngularJS编写的。这是OWASP VWA目录中列出的第一个完全用JavaScript编写的应用程序。该应用程序包含大量的用户应该利用底层漏洞的各种难度的黑客挑战。
Juice Shop 整合了2017 OWASP TOP 10 列出的所有安全问题。主要考察的项目在目录中都已经列出。作为开源的靶机训练,黑盒测试。非常具有综合性。并且能和CTFd平台相契合。有趣味性。
本文的顺序是按照challenges的类型从上往下
官方文档(English)
https://www.owasp.org/index.php/Top_10-2017_Top_10
官方文档(Chinese)
http://www.owasp.org.cn/owasp-project/OWASPTop102017v1.02.pdf
在kali linux 虚拟机上 利用 docker 搭建 Juice Shop 和 CTFd 平台
vim /etc/apt/sources.list.d/backports.list
, 加入以下代码
deb http://http.debian.net/debian wheezy-backports main
apt-get install apt-transport-https ca-certificates
apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
vim /etc/apt/sources.list.d/docker.list
, 因为Kali2.0是基于Debian Wheezy版本,所以加入下面代码:并更新系统
deb https://apt.dockerproject.org/repo debian-wheezy main
#On Debian Jessie
#deb https://apt.dockerproject.org/repo debian-jessie main
#On Debian Stretch/Sid
#deb https://apt.dockerproject.org/repo debian-stretch main
apt-cache policy docker-engine
apt-get update
apt-get install docker-engine
# 安装结束,打开docker服务
service docker start
docker pull bkimminich/juice-shop
docker run -d -e "NODE_ENV=ctf" -p 3000:3000 bkimminich/juice-shop
# 显示flag 易于后面交题目
访问localhost:3000
或者 虚拟机ip地址:3000
显示juice shop 首页
安装成功
参考网址:
https://github.com/CTFd/CTFd/wiki/Deployment#docker
https://bkimminich.gitbooks.io/pwning-owasp-juice-shop/content/part1/ctf.html
http://codeqi.top/2018/02/03/搭建OWASP-Juice-Shop测试环境-并搭建CTF环境/
2.3.1 建立CTFd平台
pip install docker-compose
git clone https://github.com/isislab/CTFd.git
cd CTFd
docker-compose up
#访问 localhost:4000 创建管理员账户
2.3.2 利用nodejs创建 juice-shop-ctf-cli 题目包并导入
- 下载 nodejs
- 打开终端 运行命令 npm install -g juice-shop-ctf-cli
- 继续运行 juice-shop-ctf
- 关于题目选项,可以参考上述网址,也可参考下述图片:
-
- 打开CTFd 平台,登录管理员账户,导入生成的题库。
至此环境搭建完成
附截图:
Find the carefully hidden 'Score Board' page.
找到一个精心隐藏的“计分板”页面。
这也是开始做题目的第一步。通过查看源代码 找到
<a href="#/score-board">
找到计分板
Provoke an error that is not very gracefully handled.
引发一个不太优雅处理的错误
(根据社区中的帖子,一共有四处错误)
点击登录框,猜测存在sql注入的情况。尝试一下输入'
报错
同时 也看到了 sql 语句的选取方式。说明了此处存在sql注入。
Log in with the administrator's user account.
登录管理员账户
之前看到 sql语句的选取方式是:
SELECT * FROM Users WHERE email = 'xxx' AND password = 'md5(xxx)'
通过构造 payload=' OR '1'='1' --
第一个引号闭合前面的 ' 第一个条件为假 OR 后面条件为 真,--注释掉后面的东西。成功登录
令人惊奇的是,这里的默认登录账户居然是管理员账户。(有很大隐患)
同时,通过浏览购物车,也发现了管理员ID是admin@juice-sh.op(登录ID 泄露)作为一个合格的网站,显示的时候应该用昵称代替登录ID
此外还有别的方法,泄露了账户信息。
打开burpsuit 对网站进行爬取。通过信息泄露,截获用户账户
由于密文是32位,很容易想到是32位MD5加密
通过在线查询,果不其然。
Order the Christmas special offer of 2014. 订购2014圣诞特供
圣诞特供的话,第一个想到的是搜索框搜索。
当然是搜索不到的。
通过burpsuit抓包。这是一个GET方法。
构造payload='1
发现SQL注入语句信息
"sql": "SELECT * FROM Products WHERE ((name LIKE '%'1%' OR description LIKE '%'1%') AND deletedAt IS NULL) ORDER BY name"
AND deletedAt IS NULL
由于这个语句的存在。所以圣诞特辑因为没有图片没有显示出来
构造payload=')) --
爆出所有信息并查找关键字
同时添加圣诞特供。
Log in with Jim's user account. (Difficulty Level: 3)
登录JIM的账户
看看之前爬虫爬到的信息表。就很简单了。
- 查表知 Jim 的账号是 jim@juice-sh.op
- 通过MD5破解 Jim 的密码为 ncc-1701
打开burpsuit 的 Intruder 。接下来就是看你的社工技巧了。
刚刚admin都能用万能密码绕过 JIM 不是一样的么?
payload=jim@juice-sh.op' and '1'='1' --
不过好像Bender的密码比较困难。利用第三种方法就可以了
Retrieve a list of all user credentials via SQL Injection
通过SQL注入检索所有人的用户的凭证列表
HINT 中写道 用 union select
在登录的列表中,有这样的SQL语句
SELECT * FROM Users WHERE email='xx' and password = 'xx'
在搜索栏列表中,有这样的SQL语句
SELECT * FROM Products WHERE ((name LIKE '%'%' OR description LIKE '%'%') AND deletedAt IS NULL) ORDER BY name
那么,有没有利用搜索框爆出信息表的可能性呢?
构造payload= ')) order by 8 --
8 成功 9 报错。
构造payload=asdf')) union select 1,2,3,4,5,6,7,8 FROM Users --
返回成功:
非常可以。
然后我将 1,2 的位置替换成 email
和 password
返回成功,但是没有跳出提示框。
可能漏了个id? 这里我是用社工的技巧猜的。
将 1,2,3的位置换成 id
,email
和 password
返回成功。得FLAG。
Get rid of all 5-star customer feedback.
删除所有5星评价
刚刚我们已经获得管理员权限了,这里就变得相当的简单。
不过在此之前我们要先找到管理员信息版在哪里。
查看源代码,因为管理员页面一定是一个页面,而页面的相应位置应该是在
<!-- application specific source files -->
<script src="dist/juice-shop.min.js"></script>
这个JS中。打开该JS,搜索admin
找到页面 #/administration
成功
然后就删吧
利用爬虫,也可以找到这个js。然后搜索即可
Access someone else's basket.
进入某人的购物车
修改会话储存中bid的值即可完成操作
Post some feedback in another users name
用别人的名字提交反馈
这道题是不是分数给的有点高啊
burpsuit抓包改post请求即可
$old_post={"UserId":3,"rating":5,"comment":"123"}
$new_post={"UserId":2,"rating":5,"comment":"123"}
Change the href of the link within the O-Saft product description into http://kimminich.de
.
将 O-Saft 产品的描述链接改成 http://kimminich.de
首先我们找到 O-saft 在哪里
根据搜索信息列出 saft产品的 数据信息
看了解析。。。也不会做
{"status":"success","data":[{"id":9,"name":"OWASP SSL Advanced Forensic Tool (O-Saft)"
这题目涉及到nodejs后端的一些知识,主要是关于api接口的。
至于如何发现api接口,以及其中的信息有哪些。一开始用burp的爬虫爬并没有爬到api接口中的信息。又用了nmap,还是没有扫到(可能是参数不对)。最后突发奇想,利用社工字典中文件目录名字,成功扫到了一些信息。包括了Products目录在内的一些目录。
(论程序的重要性)
for i in range(0,len(box)):
s=requests.Session()
string=s.get(url="http://10.10.10.149:3000/api/"+box[i]).content
if "Error: Unexpected path:" in string:
print "[-]failed with string ",box[i]
#print string
else:
print "[+]success with string",box[i]
可能是我的社工字典不够强大,目前扫到的文件有————
在之后的题目中也会有应用。打算换个更加大的社工字典扫描。
目前不知道有没有工具能够查看nodejs对于api调用的过程。
null
Give a devastating zero-star feedback to the store.
在反馈中给一个0星评价
讲道理0星是不能submit的。但是通过改包,即可实现提交
raw_poat={"UserId":1,"comment":"1","rating":1}
new_post={"UserId":1,"comment":"1","rating":0}
Place an order that makes you rich.
You literally need to make the shop owe you any amount of money.
提交一个指令让你变得有钱。
你需要让商店欠你钱。
之前用社工字典爆破了一个basketitems。也许这个就是突破口
其实burpsuit就可以查的呀~~~
利用burpsuit抓包,注意不是get包,是put包。找到api端口。通过改包实现
由此可见,应该对上传的数据进行审查。但是juice shop 并没有这么做。
Upload a file larger than 100 kB
上传一个大于100kb的文件
这个比上面那个简单多了!
burp改包即可
注意文件EOF符号的位置。
Upload a file that has no .pdf extension.
上传一个非.pdf类型的文件
也很简单,利用%2500截断后即可实现其他类型的上传
◇ 一个真实的案例让nosql不再神秘
◇ OWASP —— Testing for NoSQL injection
◇ NOSQL注入的分析与缓和
以前一直玩的mysql。现在遇上了MongoDB有点措不及手。也是自己第一次接触到MongoDB的漏洞。
顺手在自己的kali上装了MongDB。
对于SQL来说,我觉得SQL最失败的地方也是最成功的地方,就是有着information_schema这个库。
那么对于MongoDB来说呢?
在MongoDB的FAQ里面有这样一段话:
"..with MongoDB we are not building queries from string , so traditional SQL injection attacks are not a problem."
因此大多数的开发者以为这样就高枕无忧了。其实他们的说法并无错误。
不是常规的SQL注入
在实际的使用中。find({'var':{'$key':'value'}})
这样的语句是完全可以出现的。
//查询age = 22的记录
db.userInfo.find({"age": 22});
//相当于:select * from userInfo where age = 22;
//查询age > 22的记录
db.userInfo.find({age: {$gt: 22}});
//相当于:select * from userInfo where age > 22;
Let the server sleep for some time.
让系统睡一会儿
稍微了解了一下NOSQL注入后,通过brup抓包了解到,最后的信息是递交到/rest/product/13/reviews
也就是说,mongoDB肯定是通过13这个id查询的。
测试语句后,发现sleep()函数和md5()函数返回成功
将13的位置改为sleep(1000)或者md5(100000000),并将request请求改为GET方法。得FLAG
同时递交多条评论
这里的话,了解了一下patch请求,我将它理解为同时上传多条put请求。
所以的话,构造patch
请求,将id
的值设置为≠-1
构造id为 {“$ne":-1}
,随便写个message。并复制auther信息。如下图所示:
Perform a reflected XSS
进行反射型XSS攻击
在搜索框中输入
<script>alert(/xss/)<script>
Perform a persisted XSS attack with <script>alert(""XSS"")</script>
bypassing a client-side security mechanism.
进行储储存型XSS攻击并绕过客户端安全监测
有储存的地方,一个是评论区,一个是注册窗口
评论区不行。转战注册窗口。抓包改注册用户:shaobaobaoer@126.com<script>alert("xss")</script>
报错,看来要转义一下。
shaobaobaoer@126.com<script>alert(\"xss\")</script>
对引号转义,访问管理员页面,成功
(不知道为啥这题计分板没有弹出来,是我哪里出错了么?)
Perform a persisted XSS attack with <script>alert(""XSS"")</script>
without using the frontend application at all.
构造一个储存型XSS,不使用前端程序。
可能理解上有点问题,这个的意思是说,不在/#/的页面下显示的意思吧?
突然想起来,商品还有评论区。之前试过不行,不过这道题的目标应该就是这里了。
想起来,之前有题目是改商品的链接。是不是有着相同的道理呢。
如果能够改商品的话,增加商品是否有这种可能性呢?
登录管理员账号,查看api接口的Products。
构造数据如下——
上传,返回成功。
想起当时的搜索全部商品,果然存在着
(备注:应该改成json数据并且加上双引号)不然返回不了结果
既然如此,那就创建一个新的商品好了。
随后搜索界面和商品查看界面都XSS了
Perform a persisted XSS attack with <script>alert(""XSS"")</script>
by passing a server-side security mechanism.
传递给服务器安全机制一个储存型XSS
这里就利用到了之前sanitize-html这个版本的漏洞,该漏洞编号为CVE-2016-1000237,国内资料比较少, 有兴趣需用google搜索。根据该版本的特征通过不递归绕过验证。
相关链接:https://nodesecurity.io/advisories/135
这个和SQL注入中的重复关键词绕过差不读多吧。
构造payload:
<<script>123</script>script>alert(“"XSS"″)<</script>/script>
Change Bender's password into slurmCl4ssic without using SQL Injection.
不用SQL注入将Bender的密码改成 slurmCl4ssic
既然存在CSRF漏洞,那么一定是在请求的地方下手。
将原密码的请求改为 current=""
,报错,改为current=
,报错。
直接删除current请求,即可实现CSRF,可见JuiceShop在此处并没有对是否current一项不存在进行判断。
不知道是不是Juice Shop版本的问题,我的更改密码窗口和别的人的不一样。我不需要通过回答安全验证问题就可以更改密码了。而在官方的文档中并不是这样子的。
Reset Jim's password via the Forgot Password mechanism with the original answer to his security question.
通过回答安全验证问题重置Jim的密码
It's hard for celebrities to pick a security question from a hard-coded list where the answer is not publicly exposed.
为啥jim就是James T. Kirk。美国的社工问题么?
google一下————https://en.wikipedia.org/wiki/James_T._Kirk
发现他的哥哥叫做 George Samuel Kirk
一个个试,大写小写,等等。发现输入Samuel成功了。
Reset Bender's password via the Forgot Password mechanism with the original answer to his security question.
通过回答安全验证问题重置Bender的密码
Not as trivial as Jim's but still not too difficult with some ""Futurama"" background knowledge.
维基百科第一个 https://en.wikipedia.org/wiki/Bender_(Futurama)
文中又说到他在一个厂子找到了第一份工作,继续点击链接
https://en.wikipedia.org/wiki/Suicide_booth。找到工厂名字 Stop and Drop
填进去不对。根据第二条提示,输入futurama和suicide_booth
第一次词条是 http://futurama.wikia.com/wiki/Suicide_booth
该百科中说是Stop'n'Drop
(蜿蜒曲折的社工题)
直接输入,成功。
Reset Bjoern's password via the Forgot Password mechanism with the original answer to his security question.
通过回答安全验证问题重置Bjoern的密码
Nothing a little bit of Facebook stalking couldn't reveal. Might involve a historical twist.
向JuiceShop的开发者致敬
问题是 Your ZIP/postal code when you were a teenager?(ZIP code 邮政编码)
根据提示,要调查bjoern的facebook。他出生在德国一个叫Uetersen的小镇
推荐个很棒的邮政查询网站 http://www.geopostcodes.com (kexueshangwang)
注意bjoern是用google账号注册的。
邮政编码是25436.上传不对的。
官方文档中道:
Bjoern added some obscurity to his security answer by using an uncommon variant of
the pre-unification format of postal codes in Germany
所以,尊敬的开发者用的是以前德国的邮政编码。
调查网站 http://www.alte-postleitzahlen.de/uetersen
得知德国以前的邮政编码是West-2082
再次上传,正确。
Inform the shop about a vulnerable library it is using. (Mention the exact library name and version in your comment)
告知商店易受攻击的库
调查ftp中的package.json.bak
文件。就可以知道 sanitize-html 1.4.2
实际上,在OWASP的漏洞上传平台把一个个用的软件搜索一下,就可以搜到sanitize-html 1.4.2
,还有下文中的epilogue-js
在之前的XSS4中,知道了商店用的框架是 sanitize-html 1.4.2
该框架的问题再XSS4中已经提及了。
在contact一栏提交sanitize-html 1.4.2
即可
Inform the shop about a typosquatting trick it has become victim of.
告知商店他们被URL劫持了。
Investigate the forgotten developer's backup file instead.
调查开发商的备份文件
调查ftp中的suspicious_errors.yml
文件和package.json.bak
文件
得知,epilogue-js
这个软件是有问题的。
根据官方文档,这个软件的具体问题可以查看:
https://www.npmjs.com/package/epilogue-js
在contact处写epilogue-js
即可
Inform the shop about a more literal instance of typosquatting it fell for.
告知商店一个真实的URL劫持的例子。
得到了上面一题的启发,发现了www.npmjs.com
确实是个好网站。这里有点小作弊的嫌疑
看了看juice-shop开发者的一些文档,看到了angular-tooltipps
这个JS脚本是有问题的。
至于具体的问题的话,可以查看:
https://www.npmjs.com/package/angular-tooltipps
然后上传后,就通过了。
感觉这块的题目出的有点稀奇古怪的。这三道题目的本意是要让我们用最新的最安全的框架么。
freebuf 浅谈XXE攻击
OWASP XML External Entity (XXE) Prevention Cheat Sheet
Retrieve the content of C:\Windows\system.ini
or /etc/passwd
from the server.
我们是windows的,按windows来做。
定制payload=<!ENTITY xxe SYSTEM "file:///C:/Windows/system.ini" >]>
上传文件即可完成
Let us redirect you to a donation site that went out of business.
让我们把你重定向到一个破产的捐款网站
如果是捐款网站的话,一定是和购物车有关系。打开购物车,看看付款的地方有没有什么猫腻
查看源码,发现有被注释的一行。
访问地址,完成。(这里的to有重新定向的意思~在之后也会遇上)
localhost:3000/redirect?to=https://gratipay.com/juice-shop
Access a confidential document.
访问机密文件。
实际上我也不知道访问哪个文件。
进入ftp把所有非md文件加上%2500.md
截断后就通过了。
Use a deprecated B2B interface that was not properly shut down.
利用一个弃用的没有正确关闭的B2B接口
B2B接口,想到了xml文件。既然如此,那就上传一个xml文件上去应该就可以了。
然而,在上传文件处,虽然写了只能上传pdf文件,但是.xml居然也可以上传上去不报错。
.xml 和XXE还是有关系的。
Access a salesman's forgotten backup file.
同上,这都是算是文件泄露吧
Access a developer's forgotten backup file.
同上,这都是算是文件泄露吧
Find the hidden easter egg.
找到一个彩蛋
同上,egg文件。打开来有东西
Travel back in time to the golden era of web design.
回到网站刚刚设计那会儿的样子。
应该是和CSS
有关系的。
查看HOT标签。
得知HOT标签的CSS样式是
/css/geo-bootstrap/img/hot.gif
然后访问geo-bootstrap
的网站http://code.divshot.com/geo-bootstrap/
之后的话,就不知道如何做了。
按照官方的说法打开console输入
document.getElementById("theme").setAttribute("href","css/geo-bootstrap/swatch/bootstrap.css");
这道题也许是告诉我们要删掉不用的CSS样式,以免被人利用?
Deprive the shop of earnings by downloading the blueprint for one of its products.
下载产品设计的蓝图来剥夺商店的利益
The product you might want to give a closer look is the OWASP Juice Shop Logo (3D-printed).
查看OWASP Juice Shop Logo 。
Logo的话,第一个反应是点最上边的logo图标,看看有没有MISC之类的东西。
但是这个是PNG图片,似乎和3D打不上边。
想起来之前访问public接口的时候会弹出来一个大大的juiceshop的图标,没准是这个。
访问10.10.10.151:3000/public/
(10.10.10.151)是我虚拟机的IP
好像也不是。。。
也许这是一个产品吧。果然在产品一览找到了这个玩意儿。
访问http://10.10.10.151:3000/public/images/products/3d_keychain.jpg
下载图片,查看,发现了点猫腻
这不是OpenSCAD么。。。以前看别人用过。捏小姐姐
百度知道,它的工程文件是 .stl。
如果原图没有删掉的话,访问3d_keychain.stl
没有这个文件。说明文件名字不叫这个。
既然和juiceshop有关系,那就写个脚本,递归笛卡尔积爆破一下
如果不行那么就再试试别的方法。先按正常人的思维写个笛卡尔积
import requests
from itertools import product
if __name__ == '__main__':
box=product(["J","j"],["uice"],["-",""],["shop","Shop"])
print box
for i in box:
result=""
for j in i:
result+=j
s = requests.Session()
string = s.get(url="http://10.10.10.151:3000/public/images/products/" + result+".stl").url
print string
很巧,http://10.10.10.151:3000/public/images/products/JuiceShop.stl就是目标
后来看了官方文档,文档说没有提示就大胆猜吧。好耿直
Access a misplaced SIEM signature file.
找到一个放错地方的SIEM标记文件
You need to trick a security mechanism into thinking that the file you want has a valid file type.
你需要戏弄安全系统来思考你想找的是一个合法的文件类型
同13.4 13.5 13.6
Retrieve the language file that never made it into production.
找到没有放到产品中去的语言支持文件
Brute force is not the only option for this challenge, but a perfectly viable one.
蛮力并不是挑战的唯一选择,而是一个完全可行的选择。
第一次做1000分的题目~
先看下语言的构成与json调用请求:
也就是说,爆破的思路递归数组ab_CD:
import requests
from itertools import product
def main():
lanbox=boxiter2()
#lanbox=["aa_aa.json","cs_CZ.json"]
s=requests.Session()
for lan in lanbox:
string=s.get(url="http://10.10.10.151:3000/i18n/"+lan).content
if "<!DOCTYPE html>" in string:
pass
# print "[-] No that Language",lan
else:
print "[+] Find the Language",lan
def boxiter2():
box=[]
for i in range(ord("a"), ord("z") + 1):
for j in range(ord("a"), ord("z") + 1):
for x in range(ord("A"), ord("Z") + 1):
for y in range(ord("A"), ord("Z") + 1):
string=chr(i)+chr(j)+"_"+chr(x)+chr(y)+".json"
box.append(string)
return box
一共26**26**26**26
种可能性。
似乎没有找到。可能这个语言是三个字符的?
看了官方文档,因为是老版本的,所以json的前缀就两个字符,而我这个是4个字符,坑人的很
为了提高速度,上多线程和文件IO操作。开了26条线程感觉速度还是上不去。。。
import requests
from itertools import product
import threading
import time
def main(i):
box=[]
for j in range(ord("a"), ord("z") + 1):
for x in range(ord("A"), ord("Z") + 1):
for y in range(ord("A"), ord("Z") + 1):
string = chr(i) + chr(j) + "_" + chr(x) + chr(y) + ".json"
box.append(string)
s=requests.Session()
for lan in box:
string=s.get(url="http://10.10.10.151:3000/i18n/"+lan).content
if "<!DOCTYPE html>" in string:
pass
# print "[-] No that Language",lan
else:
print " [+] Find the Language",lan
f=open("language.txt","a")
f.write(" [+] Find the Language"+lan+"\n"+time.ctime())
f.close()
if __name__ == '__main__':
for i in range(ord("a"), ord("z") + 1):
t1=threading.Thread(target=main,args=(int(i),))
f = open("language.txt", "a")
f.write(" [*] Thread "+chr(i)+" is running"+ "\n" + time.ctime())
f.close()
print " [*] Thread ",chr(i),"is running"
t1.start()
后来,虚拟机的IP被自己撞翻掉了。打算隔夜跑跑看,能不能把这个语言跑出来。
Log in with the administrator's user credentials without previously changing them or applying SQL Injection.
可以看SQL注入第一题的第二种方法
Log in with Bjoern's user account without previously changing his password, applying SQL Injection, or hacking his Google account.
首先这和Google没有关系,因为Google的防御系统太完善了。不可能去枚举爆破Bjoern的密码。
之前枚举爆破Bjoern的密码也无济于事。
查看登录的js函数调用,找到了http://10.10.10.151:3000/dist/juice-shop.min.js
文件
然后一打开,发现里面内容很多。
无奈之下看了官方文档。文档中说juiceshop的登录方式是用OAuth。动用查找引擎:
发现一个函数:
也就是说,OAuth用了Bjoern的谷歌账号,然后通过r.encode生成了密码。而r就对应的base64啊
复习一下Bjoern的密码。
也就说说 Bjoern的账号是:
bjoern.kimminich@googlemail.com
密码是账号的base64加密!验证一下!
raw>>>bjoern.kimminich@googlemail.com
b64encode>>YmpvZXJuLmtpbW1pbmljaEBnb29nbGVtYWlsLmNvbQ==
md5>>448af65cf28e8adeab7ebb1ecff66f15
完全正确。
Wherever you go, there you are.
君向何方,君归于此。
You have to find a way to beat the whitelist of allowed redirect URLs.
你要找到一个好方法去战胜白名单,完成重新定向。
redirect 的话,想起来有个to的链接:
<a href="http://10.10.10.151:3000/redirect?to=https://gratipay.com/juice-shop">
可以访问的。(可能juiceshop把这个域名删了所以出现了github404)。明显是被加到白名单去了。
直接将to改成http://www.baidu.com
会报错的。
但是可以通过重复白名单域名的方式即可完成。
Exploit OAuth 2.0 to log in with the Chief Information Security Officer's user account.
利用OAuth 2.0 来登录核心信息管理员的账户
Don't try to beat Google's OAuth 2.0 service. Rather investigate implementation flaws on Juice Shop's end.
不要想着战胜谷歌的OAuth2.0服务,不如观察下生效的缺陷在果汁超市的底部
似乎有个账户交CISO,赶紧查一下,找到了。
{"id":5,"email":"ciso@juice-sh.op","password":"861917d5fa5f1172f931dc700d81a8fb","createdAt":"2018-02-12T15:05:03.763Z","updatedAt":"2018-02-12T15:05:03.763Z"}
抱着试一试的心态去cmd5看了看,果然破解失败。
万能秘钥直接登录,居然是admin的账户?果然这个CISO的账户有点问题。
那么什么叫做implementation flaws呢?揣摩了一下hint的意思。可能是勾选记住用户这个选项。
结果记住用户之后,发现多了一个email的cookie和X-USER-EMAIL的HTML头。
如果把头和email的cookie改一下,是不是默认登录了CISO账户呢?
还是不行。
搞了很久不知道问题出在哪里,
看了官方文档,自己思路没有问题。具体也不知道什么问题
按照官方的文档,自己在post请求中加了 "oauth":true。登录成功了,计分板没有跳出来,算是做完了吧。
Log in with the support team's original user credentials without applying SQL Injection or any other bypass.
登录支持者的账户不用sql注入和其他手段。
老样子,找下support的ID
{"id":6,"email":"support@juice-sh.op","password":"d57386e76107100a7d6c2782978b2e7b","createdAt":"2018-02-12T15:05:03.763Z","updatedAt":"2018-02-12T15:05:03.763Z"}
如果是support的信息的话,可能就是之前在ftp下的一个文件support.kdbx的文件。利用keepass打开。
然后要输入秘钥。
不知道该如何找秘钥,官方说明说有这句Support Team: Our secret is still common Caoimhe master password empty!,master password为空,重点是找Caoimhe,这是一个人名,然后这个肯定是个文件,(因为keepass解密需要一个文件)官方说明中通过这个名字是一个意大利女生找到了这张照片。
然后就可以打开了。(这是什么鬼题目啊)
Inform the shop about an algorithm or library it should definitely not use the way it does.
在评论区提交base64即可
打开彩蛋,有段base64加密的语句
解密得:
/gur/qrif/ner/fb/shaal/gurl/uvq/na/rnfgre/rtt/jvguva/gur/rnfgre/rtt
localhost:3000/访问一下,发现不对。可能加了密
这种的话应该是古典密码,凯撒不行,栅栏不可能,ROT18出来了。
/the/devs/are/so/funny/they/hid/an/easter/egg/within/the/easter/egg
再次访问即可(文件比较大,加载要很久)
Forge a coupon code that gives you a discount of at least 80%.
构造一个打折券让你打两折
ftp文件夹中有个礼品券的,coupon开头的文件,用%2500.md截断后把它下下来。
这是什么加密啊?这里也是小作弊了一下。去看了看juice-shop开发者的文档,发现有一个z85-cli的算法。按照出题人的思路,应该就是这个了。
解密出来是这个东西。
如果有更多的样本的话,应该更加好观察,在礼品券一栏说在推特上可以找到juiceshop的礼品券,去看看。好吧没有
这个优惠券是2013年一月份的,也就是对应了JAN13。打的是9这对应-10.今天是2018年2月16日那么就是FEB18试试看。
成功!
Solve challenge #99. Unfortunately, this challenge does not exist.
You need to trick the hacking progress persistence feature into thinking you solved challenge #99.
完成一个不存在的挑战,你需要戏弄判题系统让他认为你完成第99个挑战了
抓了一个解题成功的包。实在看不出有什么区别。
发现调用了一个json
http://10.10.10.151:3000/rest/continue-code
其cookie是:
{"continueCode":"3jH3uLhotec3ILiMfnU9H5hvt2cQIqTkC9FVimfLU6HMh7toC5FViRHzkubbhontOKcevCvr"}
也就是说,如果你做对了某道题目,continue-code就会发过去,然后系统给你计分。
如果成功明白continue-code的生成,那么这道题就迎刃而解了。
之后便没有思路了。
根据官方文档的提示:continue-code的生成来自于算法hashids
访问该哈希算法网站http://hashids.org/
再访问在线演示功能。https://codepen.io/ivanakimov/pen/bNmExm
可以看到 第一个数字位置是盐的长度,第二个是数字。设置为如下格式
得cookie=69OxrZ8aJEgxONZyWoz1Dw4BvXmRGkKgGe9M7k2rK63YpqQLPjnlb5V5LvDj
利用put方式,访问
http://10.10.10.151:3000/rest/continue-code/apply/69OxrZ8aJEgxONZyWoz1Dw4BvXmRGkKgGe9M7k2rK63YpqQLPjnlb5V5LvDj
完成。
我从头到尾,都理解不了为什么是apply的子文件夹下。
Unlock Premium Challenge to access exclusive content
i0ycvJyZ+WoHTEIjAatNFK5A8r8GxRbwOLC2OuXHVsZcKkEc3lRgc58KjEKn2Byj8Fg3A3ai5yahQANdWL/5j5k3E3qHTjm93tuenE0YlauCdy+7tGkFvo5OltIhiXSWt1SiICecyghFZ8ca/aKtHQ==
审查代码发现一段密文。连接点开来没撒用。
如果是==的话可能是b64但是不行。估计是AES了。
所以我们要找秘钥在哪里。在哪里。
看了官方文档,官方文档推崇自己家的OWASP ZAP。并用字典扫描。
(PS:这软件比burpsuit的爬虫还要暴力。我电脑查点跑的死机)
然后扫到了http://10.10.10.151:3000/encryptionkeys这个目录。里面有着秘钥和初始向量,还有秘钥文件。
上openssl解密:
反序列化 Deserialization 原因:不会做没思路。官方文档未给出解析
JWT Jason web token 原因:看不懂解析。
加密问题 Crypto
xml文件包含 XEE
花了一个礼拜时间,终于把JuiceShop做完了。五星难度的有些题目没有完成。
以前接触的漏洞网站,大多数都是PHP+CSS+HTML+JS建站的,而利用.NET建站的juiceshop刚好填补了自己这块空白。
小结
在本次计算思维实训中,我本来是想自己写一些自动化测试的工具,类似于sqlmap,nmap,OWASP ZAP之类。前人的智慧让自己有些望尘莫及。后来决定还是去做一些漏洞测试的开源项目。做过了DVMA,sql-lib,感觉这些都不够综合。一个偶然的机会,我在别人的博客中发现了juice-shop这个项目。它吸引了我的注意力。从搭建到开始做题,自己花了半个寒假时间完成了这一非常有趣的项目。以下是我的一些感受
[ 1 ] 吴浩清 书名:白帽子讲WEB安全 电子工业出版社 2012.2