<p class="f_center"><img src="http://dingyue.ws.126.net/2020/0328/e16c764cg00q7v5si006id000p00046g.gif"/><br/></p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2020%2F0328%2Fcfef74e5p00q7v5si000hd000u0004ug.png&thumbnail=660x2147483647&quality=80&type=jpg"/><br/></p><p>前言</p><p>这次介绍的是一篇发表在安全顶会2018 USENIX Security的paper,文章旨在自动化挖掘web漏洞,同时生成对应的exp,其比同类的工具拥有更高的准确度,由于其动静结合的特性,对代码也有更好的覆盖率。</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2020%2F0328%2Fcfef74e5p00q7v5si000hd000u0004ug.png&thumbnail=660x2147483647&quality=80&type=jpg"/><br/></p><p>背景介绍</p><p>首先我们从如下这样一个例子切入,来简单介绍一下web漏洞自动挖掘和通常一些静态分析的工具的做法。</p><p>例如如下3个代码片段:</p><p>selectBooks.php用于选择你想要借的书,代码如下:</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2020%2F0328%2F7290c55dp00q7v5sj008od000ne012ug.png&thumbnail=660x2147483647&quality=80&type=jpg"/><br/></p><p>hold.php用于额外的check输入,并引导用户到下一步操作,代码如下:</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2020%2F0328%2Ff315502cp00q7v5sj001nd000mq009ug.png&thumbnail=660x2147483647&quality=80&type=jpg"/><br/></p><p>checkout.php用于结算,代码如下:</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2020%2F0328%2Fd5cd05b7p00q7v5sj003ed000lm00gog.png&thumbnail=660x2147483647&quality=80&type=jpg"/><br/></p><p>我们可以看到,在这样一个简单的功能实现上,其实出现了不少潜在的漏洞函数,例如selectBooks.php中的mysql_query可能会导致sql注入,又如checkout.php中的echo可能会导致XSS漏洞。</p><p>那么对于一些常规的静态分析漏洞挖掘工具,他们会怎么做呢?一般情况下,其会首先全局定位到漏洞函数的位置,例如selectBooks.php的第17行,checkout.php的第15行,然后对其参数利用PDG(数据依赖)的关系进行backward反向回溯。</p><p>例如selectBooks.php的第17行,我们使用PDG关系回溯,可以发现其影响的关键参数有3个,分别是$book_name,$edition,$publisher。他们又分别来自第5行,第9行和第13行。此时我们又会继续对第5行,第9行和第13行继续进行PDG回溯,而后发现他们都会经过过滤函数,那么此时回溯结束,静态分析工具粗略的判断其为安全的flow,因为其参数都会经过过滤。</p><p>我们再看checkout.php的第15行,利用PDG进行回溯,我们可以关注到2个变量,分别是$name和$msg,而后找到第 9行和第10行,此时我们发现第10行是攻击者可控的$_GET变量,那么此时该flow会被输出,并交由运行者进行check,判断其是否为误报。而对于对9行,我们却不太那么容易找到其真实的数据依赖,因为$result实际上来自于数据库内的数据,而非直接显示在代码中。</p><p>那么此时一般的静态分析工具的缺点便暴露无遗,其会受到数据库查询的约束而不能准确进行分析,且由于其依赖于PDG的后向回溯,很难去发现逻辑上的漏洞。</p><p>同时还有一个关键的问题,仅从代码上来看,似乎$msg我们可以找到一条攻击路线,但实际上,这是需要前期铺垫的,我们必须拥有session才能到达这一步,这为人工check也增加了不少不便捷性。</p><p>因此,本篇paper就是旨在解决这些问题,而提出了动静结合的web漏洞挖掘工具:NAVEX。</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2020%2F0328%2Fcfef74e5p00q7v5si000hd000u0004ug.png&thumbnail=660x2147483647&quality=80&type=jpg"/><br/>工具设计<br/></p><p>那么我们来简单看一下,NAVEX是如何设计,用于解决上述问题的。</p><p>首先作者定义了一个字典:</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2020%2F0328%2Fd765087dp00q7v5sk0004d000a8004sg.png&thumbnail=660x2147483647&quality=80&type=jpg"/><br/></p><p>其中记录一些关键的函数名,例如XSS,对应echo和print等,依次类推,作者一共记录了如下几类攻击的潜在漏洞函数:sql注入、XSS、文件包含、命令注入、代码注入和逻辑漏洞。</p><p>然后NAVEX一样会像平常的静态分析工具一样,对漏洞进行检测,其也会通过全局定位敏感函数,然后用上述思想,对关键变量进行PDG后向回溯,其伪代码如下:</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2020%2F0328%2F169c498bp00q7v5sk002ud000po00y4g.png&thumbnail=660x2147483647&quality=80&type=jpg"/><br/></p><p>运行结束后,程序会返回路径集,即从攻击者可控变量source($_GET、$_POST等)到潜在漏洞函数调用之间的变量传递。</p><p>值得一提的是,作者这里不仅仅使用了PDG的后向分析,同时其为了发掘逻辑上的漏洞,也会进行正向寻找。</p><p>然后作者会将提取出的约束放入Z3求解器进行约束求解。以备后续生成exp使用。</p><p>待上述操作结束后,程序进入动态分析,或者称为前端约束生成阶段。在这一步中,作者使用爬虫,爬取html页面中的信息和属性名,例如提取form表单或者js的相关约束:</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2020%2F0328%2F9a2e2a3dp00q7v5sk000dd000p6005gg.png&thumbnail=660x2147483647&quality=80&type=jpg"/><br/></p><p>然后同样会使用约束器求解,得到满足的input,并进行输入,但由于可能input也会受到后端的约束,因此为了防止爬虫由于未能正确input,不能到达下一步,作者对后端进行了监控,以探测在input后,后端是否会发生变化,例如进行数据库查询,或者改变了当前状态,例如全局变量的赋值(session,cookie等),或者新产生了变量等。以此断定爬虫的前段约束后得到的input是否生效,如果未生效,其会同时考虑后端约束,并再次求解,而后继续监控往复,直到成功input。</p><p>如我们最开始的例子中,此时会考虑到后端的约束,即$publisher的长度问题:</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2020%2F0328%2F483a9b8ep00q7v5sk000bd000lm003yg.png&thumbnail=660x2147483647&quality=80&type=jpg"/><br/></p><p>同时作者也考虑过了角色问题,在web网站中,通常会分为管理员和普通用户,那么为了最大的代码覆盖率,作者会存储管理员用户的登录凭证,以方便探测到管理员用户可能存在的潜在漏洞。</p><p>为了存储这些关系,作者定义了Navigation Graph,其为有向图:G = (N , E ),它的边代表了下一步跳转的意义,例如下图:</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2020%2F0328%2F11559051p00q7v5sl002ed000u0005bg.png&thumbnail=660x2147483647&quality=80&type=jpg"/><br/></p><p>在我们第一步达到selectBooks.php后,在html模拟用户input,会来到下一个url操作:selectBooks.php?action=borrow,而这2个node之间则会产生一条edge,又前者指向后者。</p><p>同时对于每一个Node,其拥有一些属性,例如id为每一个node的唯一标识符,url为当前node的链接,form_params为表单的input,role存放管理员用户的登录凭证。</p><p>如此一来,在找到漏洞点后,作者即可找到一条可到达,并触发该漏洞函数的链接,如下:</p><p>1. http://localhost/App/index.php<br/></p><p>2. http://localhost/App/selectBooks.php with POST params:[book name=intro to CS by author1, edition=2,publisher=aaaaaaa]</p><p>3. http://localhost/App/selectBooks.php?action =borrow</p><p>4. http://localhost/App/hold.php</p><p>5. http://localhost/App/hold.php?step=checkout</p><p>6. http://localhost/App/hold.php?step=checkout &msg=</p><p>最终成功将exp带入到6条语句,成功进行xss攻击。</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2020%2F0328%2Fcfef74e5p00q7v5si000hd000u0004ug.png&thumbnail=660x2147483647&quality=80&type=jpg"/><br/></p><p>实验测试</p><p>作者对26个php cms进行了测试,php文件数量超过22.7k,列表如下:</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2020%2F0328%2F29462346p00q7v5sl001md000ha00n4g.png&thumbnail=660x2147483647&quality=80&type=jpg"/><br/></p><p>对于sql注入,作者只关心了如下4种潜在的漏洞函数:mssql query, mysql query, mysqli query和sqlite query,并通过实验测试发现,在不到1小时的时间内,工具生成了105个sql注入exp:</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2020%2F0328%2Ff9a14646p00q7v5sm000pd000n400c8g.png&thumbnail=660x2147483647&quality=80&type=jpg"/><br/></p><p>可以看到在获得的结果里,均为true positives,以此显现了 NAVEX的高精度和高效率。</p><p>同样的,对于XSS和逻辑漏洞,在较短的时间内,都有不错的表现:</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2020%2F0328%2Fcddfb184p00q7v5sm000td000mo00deg.png&thumbnail=660x2147483647&quality=80&type=jpg"/><br/></p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2020%2F0328%2F7ce11336p00q7v5sm000pd000lu00d8g.png&thumbnail=660x2147483647&quality=80&type=jpg"/><br/></p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2020%2F0328%2Fcfef74e5p00q7v5si000hd000u0004ug.png&thumbnail=660x2147483647&quality=80&type=jpg"/><br/></p><p>后记</p><p>本篇文章的思路较为新颖,由于其动静态结合的方式,不仅可以一定程度上增加效率,并且能够有效的探测到一些普通静态分析工具不能检测出的漏洞。其贡献不仅在于学术上的创新,对我们cms审计也提供了不少的便利。</p>
讯享网

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/205974.html