结合OWASP Top 10 初识安全测试

背景:

团队内一位资深同事在去年给大家share了最新的OWASP Top 10 的变化以及内容,并结合了OWASP的Juice Shop进行讲解,内容非常简洁易懂,让我以最简单的方式了解到了安全测试是什么,希望通过整理,让更多的人有所了解

环境准备:

  1. Juice Shop Github 地址 请按照其中Docker Container 部分搭建环境,我采用的是 v7.5.1这个版本,所以第2,3步相应的变为
docker pull bkimminich/juice-shop:v7.5.1
docker run --rm -p 3000:3000 bkimminich/juice-shop:v7.5.1

安装成功并启动后


Screen Shot 2019-04-02 at 2.50.44 PM.png

网页中打开localhost:3000,即可看到Juice Shop的首页

  1. Charles,下载安装,免费试用一个月

实践 - OWASP Top 10

首先 OWASP 是 Open Web Application Security Project 的缩写,一个非盈利性组织, 详情请自行Google

下图为2013年和2017年的对比版本:


Screen Shot 2019-04-02 at 3.31.44 PM.png

A1:2017 - 注入

Screen Shot 2019-04-02 at 3.45.26 PM.png

练习1 预定圣诞节特供(已删除的商品):
步骤1: 打开Juice Shop的首页
步骤2:打开DevTools -> Network, 用delete按钮清除请求
步骤3:在Search的地方什么都不用输入,点击search搜索,并在Network中找到发送的请求 http://localhost:3000/rest/product/search?q=,看Response中有返回数据,一共有28条数据
步骤4:在search的输入框里输入 '; 然后点search,会在Network里看到发出去另一条请求并且报错,检查后找到报错内容

sql: "SELECT * FROM Products WHERE ((name LIKE '%';%' OR description LIKE '%';%') AND
deletedAt IS NULL) ORDER BY name”

步骤5:找到输入内容拼接的地方,进行修改,在search的输入框里输入 '))-- 然后再点击Search按钮,查看Response里的返回数据有32条

视频:
Search.gif

练习2 登录管理员用户
步骤1:进入Login 页面
步骤2:输入任意账户和密码得到一个错误
步骤3:试试 '# 就会看到报错信息,找到其中的SQL语句

"sql":"SELECT * FROM Users WHERE email = ''#' AND password = 'e855b45052de9a85655f584589edd0f9'"

步骤4:根据出错点,重新输入 ' or 1=1-- 成功登录管理员账户了

练习3 找到管理员页面
步骤1:在DevTools里点Source Tab,找到dist目录,点juice-shop.min.js,搜索 ‘administr’ 这个字符串,会找到一个页面url '/administration'
步骤2:在上一个账户里,将URL中的search替换成administration,

http://localhost:3000/#/search
http://localhost:3000/#/administration

步骤3:你就会见到用户和Comments

A2:2017 - 失效的身份认证

练习4 更改Bender的密码
步骤1:在A1的练习2中的管理员页面,找到Bender的Email
步骤2:利用SQL注入的方式,即在login的账户中输入 bender@juice-sh.op'-- 进入到Bender的账户,可以点击Contact Us验证,会看到Author的地方有Bender的显示
步骤3:打开DevTools -> Network, 清空请求,点上边的 Change Password, 分别在当前密码,新密码,重复新密码三个输入框输入任意字符串,观察请求
步骤4:打开新Tab,在新Tab中分别进行以下3中尝试

http://localhost:3000/rest/user/change-password?current=A # 401Password cannot be empty
http://localhost:3000/rest/user/change-password?current=A&new=B # New and repeated password do not match.
http://localhost:3000/rest/user/change-password?current=A&new=B&repeat=C # New and repeated password do not match.

步骤5:猜测是否可以不给默认密码,进行第4次尝试,成功。

http://localhost:3000/rest/user/change-password?new=B&repeat=B # 200 success

A3:2017 - 敏感数据泄露

例子5 上个例子中修改密码时,密码是MD5加密的,非常容易反解密
例子6 非技术上,请不要把你的密码曝光到网上

A4:2017 - XML 外部实体 (XXE)

参考引用:XML外部实体(XXE)注入详解

A5:2017 - 失效的访问控制

练习7 0星评价
步骤1: 进入 Contact Us
步骤2:其他内容都填好,不给 星星 好评
步骤3:Submit 按钮是不让点的
步骤4:点上3星好评,但立马点掉
步骤5:可以Submit了,成功

例子8 之前例子中提到的/administration页面,理论上是只有管理员可以访问这个页面的,但是可以通过扫描源文件或暴力破解的方式查到

例子9 扫描同时可以找到一个被程序员遗忘了的备份文件夹

网上有很多开源扫描工具可以用,作为练习,可以使用owasp zap

练习10 获取其他人购物车数据
步骤1:用 'admin@ juice-sh.op/admin123' 登录
步骤2:打开Charles, 为了使用Charles,需要把URL替换成以下的URL,这样就不需要配置代理了

http://localhost.charlesproxy.com:3000/#/search

步骤3:点购物车,DevTools中会看到发出去的请求http://localhost.charlesproxy.com:3000/rest/basket/1

Screen Shot 2019-04-03 at 6.15.00 PM.png

步骤4:basketid就是userid,在Charles中修改这个URL,改为http://localhost.charlesproxy.com:3000/rest/basket/3,意味着我期望在我的账户中请求Bender的购物车数据,然后执行,就会看到自己的购物车里显示的是Bender购物车里的数据

getProductsOfOthers.gif

练习11 更改订单让自己钱包鼓起来
步骤1:在购物车中点增加商品数量,截获请求http://localhost.charlesproxy.com:3000/rest/basket/3
步骤2:修改返回的response,就可以看到总价变成了负数

Richer.gif

练习12 重定向到指定网址
步骤1:将鼠标滑动到右上角的Fork me on Github, 在DevTools的页面中可以看到,a标签的href属性有个重定向地址

image.png

步骤2:将href的链接改为 redirect?to=https://google.ie, 然后点击页面的Fork me
步骤3:你会得到一个错误页面,但是如果你将值改为redirect?to=https://google.ie/?https://github.com/bkimminich/juice-shop,就会成功将网页带到Google去,成功

A6:2017 - 安全配置 错误

暂无

A7:2017 - 跨站脚本攻击

反射性XSS:APP和API都有未经过滤的用户输入作为网页的一部分输出
存储型XSS:APP或API会存储未经过任何处理的用户输入,这些数据在未来会被查看
DOM型XSS:JS框架或SPA会动态引入攻击者可操纵的数据

练习13 反射型XSS攻击
反射型攻击意思就是恶意的query直接来自受害者发送出去的请求。

步骤1:在启动了Juice Shop的网站,直接访问http://localhost:3000/#/search?q=%3Cscript%3Ealert(%22XSS1%22)%3C%2Fscript%3E,点击回车后会发现后边的部分已经变成<script>alert("XSS1")<%2Fscript>, 可以看到有popup弹出,尝试将尾部中%2F改成%2E,直接转义成了- 并且没有攻击成功,也尝试改为%2D,直接q=undefine了,也没有攻击成功,还不知道为什么?如果有知道的小伙伴欢迎补充
而且这是你可见的弹窗了,最担心的是它趁你不注意,做了不应该做的事

练习14 反射型XSS攻击
步骤1:
尝试访问下面的链接

http://localhost:3000/#/search?q=%3Cscript%3Edocument%2EquerySelector%28%22%2Enavbar%2Dlogo%22%29%2EsetAttribute%28%22src%22%2C%22%2Fpublic%2Fimages%2Fproducts%2Fapple_juice%2Ejpg%22%29%3B%3C%2Fscript%3E

其实它其中真正想表达的意思是执行这段code

document.querySelector(".navbar-logo").setAttribute("src", "/public/images/products/apple_juice.jpg");

它将你的主站logo改成了杯子和樱桃的图片,左上角


Screen Shot 2019-04-08 at 3.51.31 PM.png

练习15 反射型XSS攻击
步骤1: 尝试下面的链接

http://localhost:3000/#/search?q=%3Cspan%3Ea%3C%2Fspan%3E

会发现 Search Results旁边多了一个a,这意味着不仅恶意的payload会被执行,同时页面中还有可能试图显示未经过任何处理的输入


Screen Shot 2019-04-08 at 3.58.43 PM.png

练习16 持久化的XSS攻击
步骤1: 打开charles
步骤2:在注册界面,注册一个账号,charles中会看到一个API

Screen Shot 2019-04-08 at 4.19.45 PM.png

步骤3:选中users下/,点击上边灰色的六边形框,Enable Breakpoints
步骤4:在注册页面再填写一个注册用户的信息,然后点击Register,Charles会捕捉到这个请求,然后断点在那里,这时,已经绕过了前端对Email的校验,准备发请求了
Screen Shot 2019-04-08 at 4.23.27 PM.png

步骤5:在charles的断点中选择Edit Request Tab,以及底部的JSON Text,注意是JSON Text,如果你选了JSON会发现,在那里边编辑Email,会进行字符截断,但是选择JSON Text不会,将其中Email的值改为<script>alert("XSS2")</script>,然后点击底部的Execute,这个请求就会发出去,然后Response回来还会进到这里,继续点击Execute就行,这样注入信息就会被记录到数据库中持久化下来
步骤6:不知道大家还记得之前的/administration页面吗,尝试用任意一个账户登录,然后访问这个页面,就会看到有XSS2的弹窗,持久化XSS攻击成功
Screen Shot 2019-04-08 at 4.29.08 PM.png

步骤7:因为在管理员页面,有显示所有账户的Email,当我们的注入被读取时,就会产生影响

练习17 持久化的XSS攻击
步骤1 - 步骤4 同上
步骤5:同样的方法,将Email 改为<script>document.body.style.background = 'pink';</script>,其他相同
步骤6:仍然是访问/administration页面,就会看到页面背景色变为粉色

Pink.gif

练习18 根本不用前端的持久化XSS攻击
步骤1:在search页面里,点击某一个商品的logo,注意查看DevTools里有会有这样一个请求

Screen Shot 2019-04-09 at 6.37.15 PM.png

步骤2:截取其中一部分,直接打开另一个Tab,粘贴进去

http://localhost.charlesproxy.com:3000/api/Products/1

步骤3:会看到如下的Response,而且这是一个Get请求

{
"status": "success",
"data": {
"id": 1,
"name": "Apple Juice (1000ml)",
"description": "test",
"price": 1.99,
"image": "apple_juice.jpg",
"createdAt": "2019-04-09T08:19:13.430Z",
"updatedAt": "2019-04-09T10:09:58.409Z",
"deletedAt": null
}
}

步骤4:猜测这个API也接受Post请求,那我们接下来用Curl命令在命令行里发一个Put请求

curl -X PUT "http://localhost:3000/api/Products/1" -H "Content-Type:application/json" --data-binary '{"description":"<script>alert(\"XSS3\")</script>"}'

步骤5:会看到Response 成功了,在search页面任何用户访问Products页面都会看到XSS3弹窗,攻击成功

A8:2017 - 不安全的反序列化

练习19 执行一个DoS攻击
步骤1:用人工检查或自动化URL发现工具,会找到一个Swagger API 文档,

http://localhost:3000/api-docs/#/Order/post_orders

步骤2:会看到一个Orders的Post请求,看到其中的Example中orderLinesData字段可以是任意的Json数据
步骤3:打开DevTools后点击Swagger中Try it Out,以及Execute,看到"No Authorization header was found"的Error
步骤4:回到刚才的search页面,打开DevTools,用任意账号登录,查看whoami这个API,找到Authorization

Screen Shot 2019-04-09 at 7.08.39 PM.png

步骤5:将刚才找到的Authorization内容放到Swagger里右上角有一个Authorize的输入框里
步骤6:再Execute一下,看到正确的Response
步骤7:接下来我们执行一个DoS攻击,DoS即拒绝服务
步骤8:在Value中将orderLinesData那一行改为并Execute

"orderLinesData": "(function dos() { while(true); })()"

步骤9:看Response就发现死循环的代码已经在server里执行了,攻击成功

A9:2017 - 使用含有已知漏洞的组件

练习20 找到软件中使用的组件
步骤1:点菜单中About Us,在点击文字中唯一的链接,注意观察这个URL的地址,其中含有 /ftp/legal.md?md_debug=true
步骤2:截断ftp后边的部分,回车,会看到被程序员遗忘了的备份文件,点击其中的package.json.bak下载,看到Error提示,只有以md和pdf结尾的文件可以下载
步骤3:将package.json.bak改为package.json.bak%2500.pdf试一下,下载成功,检查这个json文件中有

"sanitize-html": "1.4.2"
接下来就可以利用1.4.2版本的sanitize-html中已知的安全漏洞去攻击网站了,查找成功

A10:2017 - 不足的日志记录和监控

练习21 记录不安全的尝试
步骤1:回想之前的下载尝试,如果有充分的Log记录,这样的行为是应该被记录的
步骤2:打开另一个命令行窗口,执行

docker ps

步骤3:找到你正在运行的Container, bkimminich/juice-shop:v7.5.1,执行

docker exec -it container_id sh
ls

步骤4:看到一个类似access.log.2018-10-25的文件
步骤5:执行

tail -f access.log.2018-10-25

步骤6:当你进入search页面的时候,记了很多Log,但再尝试下载上边的文件时,并没有相应的Log记录,其实有很多信息都是可以记录在Log里的,但结合之前的A3,又不应该记录太多敏感信息

总结

至此,大部分的情况都已经通过例子或练习share给大家了,这些只是我浅显的理解,但就这些东西如果我们能举一反三,也是可以发现不少问题或者预防不少问题的

参考:
https://www.owasp.org/images/6/67/OWASP_AppSec_Research_2010_OWASP_Top_10_by_Wichers.pdf

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,978评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,954评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,623评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,324评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,390评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,741评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,892评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,655评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,104评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,569评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,254评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,834评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,725评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,950评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,260评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,446评论 2 348

推荐阅读更多精彩内容