目录
这是什么?
OWASP Juice Shop
是一个练习网页应用测试的工具。
本篇是 OWASP Top 10
系列的起始篇。
对于不清楚 OWASP
是什么的同学,看这里。
简单说 OWASP
是一套网页应用的测试列表,你可以按照它的指示一项一项地对网页应用进行测试,
它会告诉你该漏洞的原理,测试方式以及应对策略,十分详细,是行业标杆。
部署 Juice Shop
可以在 Juice Shop 的 Github 页面看到,Juice Shop 可以被一键部署到 Heroku(是免费的),你只需要注册一个账号即可。同时也可以下载到本地,部署到虚拟机。
Heroku很方便,注册个账号,点一下 Github 上的部署,就搞定了。
部署完成之后,在个人帐号的 Settings
一栏,往下拉可以看到自己的应用的 Heroku 域名。
直接访问即可。
其他部署方式见文档。
帮助文档
帮助文档在这里,这里有所有你需要的资料。
另外,在浏览器,访问 https://example.herokuapp.com/#/score-board
,将看到一个计分板,这里按照漏洞的类型做了分类,并且每个分类中用难度系数(1-6星)对每一个挑战做了评估,可以选择适合自己的开始。
第一个挑战
排在 OWASP Top 10 第一位的是 Injection
。
在 score-board 把 1-2 星都选上,然后选择 Injection,之后我就按顺序往下走了。
点击右上角 Account,找到 Login 界面。随意输入用户名密码,报错了。
这个练习是一个经典 SQL 注入。首先在 Burp Suite 中拦截一个请求,然后右键 Send to Repeater
(Ctrl + R 也行)。
这里有什么漏洞?
这里的漏洞是 Bypass Login Authentication
,绕过登陆验证。
攻击者只需要在用户名处,构造一个恒为 true
的表达式,然后注释掉接着的部分,即使不输入密码,也可以成功绕过登录验证。
在 Example Attack Scenarios
里面,有对于原理的详细讲解。
漏洞是怎么造成的?
在 OWASP 的解释中可以看到,正式程序员在开发注册流程的时候,手动拼接 SQL 请求,没有对用户的输入做出筛选,过滤和验证,导致的漏洞。
怎么这样的注入漏洞是否存在?
举个例子,某程序员在代码中拼接了如下的 SQL 语句。
query = "SELECT * FROM user
where username =' + $username +
'and password=' +
hash_func($password) +
"';""
这里,在拼接的时候,程序员选择了使用单引号,'
,当然也有可能选择使用双引号,"
,只需要转义一下。
所以,测试这样的注入是否存在,只需要在用户名处输入一个单引号,或者双引号,如果网页报出了服务器端或者数据库端的错误,那么注入漏洞就存在。
输入 test
:test
或者 "
:test
的时候,点击提交报的是 Invalid email or password.
。
而如果我输入一个单引号,页面报错是一个奇怪的 [object Object]
。
初步可以断定,登录验证可绕过。
在 Repeater 里面查看一下服务端的返回,是这样的。
后端的错误展示了很多信息,如使用的是 SQLite 数据库,具体的 SQL 语句以及密码。
利用漏洞
原理知道了,那么只需要构造一个 SQL 表达式,结果恒为 true
即可绕过验证。
在用户名处输入
' or 1 = 1 --
即可绕过验证。
解释:
- 第一个单引号与
email = ''
or
是逻辑表达式,说email = ''
或者1 = 1
1 = 1
是恒为true
的,所以整个表达式恒为true
- 最后的
--
,将剩下的 SQL 部分注释掉,也就是忽略密码部分验证。注意,--
后面一定要加上一个空格,不然后面的注释不生效。
最后的 SQL 表达式会是"SELECT * FROM Users WHERE email = '' or 1 =1 -- AND password = ...
执行一下,成功绕过登录验证。
预防措施
见 OWASP How to Prevent 部分,比我讲的好多了。