BOOK THIS SPACE FOR AD
ARTICLE AD前面第二部分我们发现了三个漏洞,分别是:
order_id导致BAC(破损的访问控制)表单date字段导致反射XSS账号密码泄露路漫漫其修远兮,让我们继续踏上征程吧。
第二部分还发现了一个admin页面:
https://www.bugbountytraining.com/fastfoodhackings/api/loader.php?f=/admin但是提示我们没有权限访问。
既然无法访问,那就一定有什么验证程序阻止了我们访问,因为我们缺少某些东西。
把这个链接放到浏览器里打开,看看burp是否能发现些什么。果然,我们发现了一个adToken参数:
使用burp的全局搜索功能,搜索一下这个adToken:
我们在js文件里发现了adToken的值,尝试把这个值粘贴到请求的adToken中,最终,我们得到flag:
第二部分的时候,我们曾找到过一个泄露的账号密码,并且从主页面登录了进去,发现了靶场作者的照片,但是那只是一个静态页面,没有功能点,所以去burp看看有没有抓取到什么:
发现了一个id参数,后面跟了很长的一串值。发到repeater模块,改下参数值试试:
改成1后,显示“Test account for zseano”
有戏,爆破试试。
爆破结果发现,只有参数值1和2有同样的结果,其他的数字回显都是用户不存在。不过这也算是一个不错的发现了。这是一个不安全直接对象引用(IDOR),也称越权。
目前页面上的功能点基本都探寻的差不多了。
回顾前面发现的漏洞,有一个有趣的地方,就是他们不少都来自隐藏的端点和参数,不管是XSS,重定向还是越权。
所以我们可以继续去寻找隐藏参数,然后触发漏洞。
我们需要寻找类似?param=value 这种格式的参数,可以使用正则表达式在burp里匹配满足条件的url。在正则表达式中, .代表任意字符, *表示任意数量的字符。然而,我们需要包括一些技巧。
首先,我们在?之前添加一个反斜杠\ 。告诉 Burp ?是模式的一部分,而不是特殊字符。此外,我们将添加一个?在等号=之前指示 Burp 在满足此模式后停止匹配,而不是继续到行尾。
所以,最终的模式将如下所示:
\?.*?=在一番寻找过后,我们发现了?promoCode=UKONLY :
试着直接在浏览器打开这个链接,返现直接跳转到了:
https://www.bugbountytraining.com/fastfoodhackings/book.php后缀?promoCode=UKONLY 都消失了,难道是就这样直接过滤了吗?应该是不会的,这样的话这传参数就没有意义了。所以我们在burp里全局搜索这个参数:
发现这个参数在memu.php的源码内。将menu.php这个路径在浏览器打开,并检查源码,会发现参数值UKONLY 被储存到了一个变量中:
这预示着我们这里也许会存在XSS漏洞,并且如果利用成功,还可能会导致存储型XSS。
接下里开始构造payload。此时反射点已经位于<script>标签内,就不再需要构造<script>了。我们试试直接用一个alert():
https://www.bugbountytraining.com/fastfoodhackings/book.php?promoCode=alert()浏览器访问该连接后,再访问menu.php的路径,查看源码,很不幸,alert被过滤掉,最后只剩了一个括号:
遇到这种情况,我么可以做一个加倍,在alert的里面再加一个aert,即:alalertert(),因为如果过滤器没有循环过滤的话,就会只检测到里面的一层alert,然后留下外面的一层。
完美,我们做到了。
接下来需要逃逸出单引号,如果不逃逸的话,此时的alert()只是字符串的形式,并没能被执行,修改paylaod:
';alalertert()'结果如下:
这样也并不可行,因为后面的两个单引号导致了语法错误,这并不是一个完整的js语句。
那就把这两个单引号给注释掉,遗憾的是,双斜杠都被替换成了反斜杠:
既既然注释不掉,那就设法让它成为一个合法的js语句:
';alalertert();var x='1这次,我们逃逸成功
到这里,我们发现了今天的第二个漏洞:存储XSS。
下一个我们再继续。