本文以一个故事的形式,来看看如何集齐OWASP Top 10“漏洞勋章”。

本故事纯属虚构,故事的主人公是A同学,一个爱好自己“折腾”的“技术爱好者”。

某一天,A同学想,“我应该把我平常学习的技术知识分享出去,这样能跟人交流学习,还能构建技术影响力”。思来想去,觉得博客是个好方式,于是决定搭建一个博客站点。

现在的需求是快,重点是博客内容,而不是搭建过程,因此A同学决定搭建一个静态博客,快速方便。于是使用静态博客模版搭建了一个博客。

过了一段时间,A同学觉得“没有留言的博客没有灵魂”,想要加个留言功能。刚好自己会点编程,于是A同学决定自己来做,刚好锻炼一下编程能力。

A同学决定做个简单的功能,填个邮箱,填个名字,就可以留言。由于A同学刚学SQL,还不是很熟练,于是打开搜索引擎,搜“SQL教程”,发现有样例,照着样例自己实现了一遍。

过了几天,A同学的博客被黑了,博客内容也被改成广告了。咋办?

刚好A同学有个做安全的朋友B,于是A同学赶紧联系朋友B,让他帮忙看看怎么办,同时查一下是什么问题。

那么问题来了,A同学并没有记录日志,没有东西可以分析。

第一块“勋章”获得。
A09:2021 – Security Logging and Monitoring Failures
安全日志和监控失效。主要指系统需要记录日志,并且还需要对关键操作记录日志,比如重要的增删改查操作,登录操作等。(关于日志,需要注意不要在日志中记录敏感信息,如PII相关信息,这一点是记录日志时容易出问题的点。)

由于A同学没有记录日志,因此缺少可以用来分析的内容,没办法分析被黑的原因。

由于没有日志,博客内容本地也有备份,两位同学决定,删除之后,重新部署。不过这次增加了日志记录的功能。由于博客内容被改了,B同学建议,数据库操作相关部分也做一些日志记录,这样可以查查是不是操作数据库的问题。

新系统,暂且定义为0.2版本,上线了。这几天风平浪静,没有变化。又过了几天,当A同学访问博客时,发现首页弹了个窗,写着”hacked by XXX”。同时有博客也被改掉了。A同学赶紧找到B同学,B同学访问首页,说“你的网站有XSS啊”。同时下载了记录的日志,分析之后,发现博客被改,是因为网站存在SQL注入漏洞,被攻击者获取了权限,然后把文章修改了。

A03:2021 – Injection
注入漏洞。是指输入没有验证,或者验证存在缺陷,导致恶意输入被执行。

XSS指跨站脚本攻击,以上面的案例为例,用户留言的时候,输入的`<script>alert(“hacked by XXX”)</script>`被存储之后,当其他用户浏览时,这段内容被当作脚本执行了,如果脚本包含其他恶意操作,则会带来其他危害。

SQL注入。指用户输入的内容被当作SQL命令被执行。当用户留言时,会需要通过执行SQL命令将数据存储到数据库中,由于未使用更安全的写法,而是直接拼接了SQL语句,导致用户的输入也被拼接到SQL语句中被当作语句执行了,这样用户就可以通过拼接执行自定义的SQL语句,进而获取权限。

找到问题之后,A同学开始升级。对存在XSS的漏洞点,输入和输出都做了相应的格式判断和转义。对于SQL注入,改为参数化查询的方式进行数据库操作。 “看来网上的参考样例也不一定是安全的写法”,A同学感叹道。 修改之后,v0.3版本上线。

安全的日子没有过多久,博客又被黑了。检查了Web日志之后,没有看到明显的攻击记录。B有点纳闷,问题会在哪里呢?也许不是直接通过web攻击的。既然不是web,会不会是数据库?幸好数据库也有日志。查看之后,B惊讶地发现,root用户有多次非本地登录的记录,同时查看配置,发现root用户的密码也是root,默认密码没有修改。同时A在配置数据库时,不小心将数据库开放在公网ip上了,这样就可以直接在公网访问到。同时看到数据库记录中有修改博客的记录。

A05:2021 – Security Misconfiguration
Security Misconfiguration。安全配置错误。指缺少一些安全配置,或者保留了不安全的配置,如默认账号密码没有修改,服务器错误地开放在公网上,缺少安全头配置等。

由于A的数据库直接开放在公网ip上,可以被攻击者访问到,同时由于没有修改默认密码,直接就被登录成功,攻击者后续可对数据库进行操作,同时利用数据库特性,尝试获取更多权限。

检查之后,发现没有被进一步利用,修改了数据库密码,只监听在本地之后,系统继续上线。

“现在全网扫描的特别多,你这种默认密码+开放公网的情况,是很容易被攻击的,有些会窃取数据库,然后加密勒索,有些还会卖数据。前段时间就有发生这种案例,很重要的数据”,B说道。

过了一段时间之后,留言评论的人多了,同时出现一个问题,就是有人冒名留言,导致留言错乱,影响阅读。A想,要不让大家注册用户之后,才能留言。

经过一段时间的改造之后,带有用户功能的版本上线了,v0.4。上线之后,一切正常。 但是没过多久,又出现了冒名留言的问题,怎么回事?

A同学再次找到B同学。这次,分析日志,没有找到问题,确实是有人在进行留言操作。于是他们决定分析一下代码,通过对代码的分析,B发现,在留言的时候,会传入用户的id去查询用户的名字,而id参数是在Cookie中传入的,并且id比较简单,就是自然数,用户修改id,就可以在留言的时候,伪造成另外一个人留言。

A01:2021 – Broken Access Control
Broken Access Control,不完备的访问控制。指用户可以以超出自己权限范围的权限去执行操作。比如,用户A可以查看、修改用户B的私有信息,普通用户可以操作管理员的功能等。

由于留言功能未检测好用户权限,导致修改参数之后,可以伪造成其他用户。

更新完代码之后。A想着,网站不好看,要不改改前端吧。A搜了一下流行的前端框架,决定使用Ant Design,大厂维护,应该不错。又经过一段时间的开发,代码写好了。上线!

这一次改动不多,也没有发生安全问题,时间到了十二月份,快到月末的时候,A又去浏览了自己的网站,发现,“网站的按钮为啥被狗啃了一样”,A很惊讶,觉得干这种事的人是不是很无聊。问了朋友,朋友说,你去网上搜一下”AntDesign彩蛋”,不搜不知道,一搜吓一跳。各种各样的留言,有说“政府客户觉得他们开发的项目留了后门,停了项目”,还有说“刚到公司,要跑路了”。没想到,原来是一个“彩蛋”,现在闹得满城风雨。

A06:2021 – Vulnerable and Outdated Components
Vulnerable and Outdated Components,指使用了不安全的组件或者过时的组件。由于现代软件开发,需要集成各种组件,由于引用层层递归,因而软件供应链容易引入未知的安全风险。

A由于使用了Ant Design,框架里面的改动,A并不能十分清楚,而引入的“彩蛋”就闹的沸沸扬扬。如果不是无实际危害的改动,那会怎样?现实中就有一些组件库被污染,引入之后,会窃取系统中的Secret,进一步利用。

A想着,还是换个框架,谁知道还有没有其他“彩蛋”。刚好快过年了,换个新面貌。

过完了一个祥和的春节,A发现自己的网站又被篡改了,这是咋回事,被盯上了吗?

赶紧找到B同学,分析分析日志,发现后台登录接口有非常多的访问记录,其中还有一条是跳转到登录成功了的记录。这条记录发生在大年三十晚上,A想,“谁这么无聊,不去看春晚,居然来黑自己的网站。我的密码这么复杂,居然能被猜到”。B说,你是不是“一个密码走天下”?A说“是呀,所有网站我都用的一个密码”。B说,“不好,赶紧把密码改掉,不同网站使用不同密码,如果你记不住,还可以使用密码管理工具来帮助自己生成复杂密码。听说最近C**N的数据库泄漏了,它们还是明文存储的密码,你不会刚好注册过吧”。A说,“我刚注册不久,因为它老是弹窗让注册。那他怎么知道我后台登录的名字呢?我可是用的自己的名字”。B说,“你的网站,发表博客之后,不是会展示发表的用户名吗?搜集一下,然后结合社工库泄漏的密码,就可能登录成功。加上你也没有使用双因素认证,知道你的密码之后,就登录成功了。” A惊出一身冷汗,“不会把我的银行卡余额给转走吧!还有我的外卖APP里面充值的奶茶钱。”

A07:2021 – Identification and Authentication Failures
Identification and Authentication Failures,如默认弱口令,登录接口暴力破解,缺少双因素验证,在URL中暴露session id。

由于A的后台接口没有限制访问,对外开放,并且登录接口还能被多次尝试登录、暴力破解,并且由于缺少双因素认证,密码泄漏之后,就被登录成功了。

改好密码,添加完双因素认证之后,更新了网站。

由于这次修改的文章比较多,清理起来比较麻烦。A想着能不能从数据库进行清理。但是由于上次数据库暴露在公网出了问题,他决定使用web端的数据库管理,从网上找了一个工具,上传到服务器,清理完数据库。网站再次上线。

运气不好的时候,真是喝凉水也塞牙。因为没有过多久,网站又被黑了。排查了其他因素之后,范围被缩小到新安装的数据库管理工具上了。不看不知道,一看再吓一跳。数据库管理工具的目录下面多了好几个文件。“这些文件是干什么的,哪里来的?”之前下载的代码没有删除,一顿分析之后,发现之前下载的代码,有个自动更新功能,而由于不是从官方下载的,也没有校验哈希,里面更新的地址被篡改了,所以刚开始是正常工作的,某个时候就会更新下载恶意文件。

A08:2021 – Software and Data Integrity Failures
Software and Data Integrity Failures,下载的代码未做完整性校验,不安全的反序列化,更新未校验等。

由于下载的代码没做完整性校验,是被篡改之后的代码,导致A的网站再一次被黑。

赶紧清理,幸好这个后门没有做更多坏事,只是用来SEO了。吃一堑,长一智。以后下载还得从官方下载,并且还要校验。 休息了一段时间,A想,最近新博客有点少,要不增加一个可以爬取其他地址的功能。比如你在其他地方写了博客,用这个功能,就可以把其他博客爬过来,就不用重新手敲了。这个功能一上,那不是流量蹭蹭蹭往上涨。说写就写,从白天敲到黑夜,一顿噼里啪啦的键盘敲击之后,功能写好了。就是你在写博客的时候,可以输入另外的博客地址,可以将对应文章转换过来。

又一次,A的博客站点又没有逃过被黑的宿命。 “一定是新代码的问题。” B同学分析日志,发现有不少导入博客的请求,其中几条抓住了他的眼球。

/importblog?url=file:///etc/passwd
/importblog?url=http://169.254.169.254/v2/credentials/<UUID>
/importblog?url=http://169.254.169.254/latest/user-data/iam/security-credentials/

就在这时,收到了A*S的告警邮件,服务器被用来挖矿了。

A10:2021 – Server-Side Request Forgery (SSRF)
Server-Side Request Forgery (SSRF),服务端未校验好用户的输入,导致用户可以从服务器发出请求,比如可以绕过来源校验,或者访问内网等。
由于A增加的功能会从服务器向外发送请求,并且没有校验用户输入的地址,导致可以以服务器的身份向外发送请求。由于云服务器提供一些特殊的管理地址,结合SSRF,攻击者可以获取到这些Secret信息。

之前被黑主要影响当前网站,这次直接就影响A*S的账单了。这个教训深刻。

某一个周末,A带着电脑去找B打游戏,结果发现B对着一个天线在鼓捣,在命令行里一顿敲击。

既然B没时间打游戏,那A就决定登录网站后台看看。刚登陆一会,B就说,你的密码是不是*6aCcdaE13eff7i3l9N4o4qrr4S8t12vx)。A十分惊讶,“这么复杂的密码你都知道,你咋知道的?”B说,“这个很简单,你是不是刚登录了后台?”“是”。“你是不是连了我的Wifi?” “是”。“还有一点,你的网站是HTTP的,没有使用HTTPS,并且你的密码也没有加密,直接明文传输的,然后就被我抓到了。” A嘴上说着“厉害”,心里想着“下次不能连你家Wifi了,还是用自己的流量”。

A02:2021 – Cryptographic Failures
Cryptographic Failures,加密失效。例如通过HTTP传输敏感信息,使用的加密算法版本过低,存在安全风险,tls版本较低等。

由于A网站使用的HTTP,传输的整个链路上都可以明文看到,如果存在网络嗅探或者中间人工具,传输的重要信息就会泄漏。

同时B说,你的博客站点是自己一点一点改出来的,没有系统的规划,也没有遵循良好的安全实践,所以问题不少,要不你学一下Threat Modeling。

A04:2021 – Insecure Design
Insecure Design,不安全的设计。比如,未遵循业界最佳安全实践,未进行威胁建模,导致系统设计中存在缺陷。

由于A的网站是自己“拍脑袋”拍出来的,并没有考虑可能存在的安全风险,所以上线之后,经常被黑。

回家之后,A连上自己的Wifi,学习了一下怎么给网站添加https证书。同时搜索了Threat Modeling。开始了新一轮的学习!

最终,A获得了完整的OWASP Top 10“勋章”!

OWASP,全称Open Web Application Security Project,是一个开源的、非盈利的全球性安全组织,致力于应用软件的安全研究,发布有各种安全相关的框架和工具。OWASP Top 10 主要是由安全专家选出当前阶段最严重的一些安全风险或漏洞类型。可作为分析Web应用安全漏洞的参考资料。目前最新为2021版,上一个版本是2017版,下图可以看到其中的变化。

参考链接 https://owasp.org/www-project-top-ten/