前言
在上一期我已经介绍了AKun Wallpaper的部署,分析了部分xss漏洞并且讲解了如何修复这些漏洞。如果还没有看过我上一期文章可以先回到上一期:https://blog.csdn.net/rpsate/article/details/122354690。在这一篇文章中我将继续分析xss漏洞,但是与上一期中类似的xss漏洞将会直接跳过。
漏洞分析1
注意下图中标红的 (Shared Sink) - [0/7]
,这说明有7个数据流共享一个数据输出点。也就是有7个位置接收数据,这7个不同的数据将会在同一个地方输出。我们在修复漏洞时,可以在数据流输入的位置处理数据也可以在输出的地方处理数据,所以我们在 alert($message, $redirect)
函数中处理即可同时修复这几个漏洞。
当光标放在文件名上时,会提示文件的路径。用phpstorm打开这个文件进行修改,当然也可以在fortify上直接修改。
用转义函数处理这两个变量,将下列两行代码加入到 alert
函数中。
$message = my_htmlspecialchars($message);
$redirect = my_htmlspecialchars($redirect);
然后选中刚修复的漏洞,右击鼠标并点击 Unsuppress Issues
,然后就会在漏洞前面看到X
状图标,这代表你忽略这个漏洞或处理完了这个漏洞。
如果点击Unsuppress Issues
后发现漏洞不见了,可以在菜单栏依次点击 Options
> Show Suppressed Issues
。
漏洞分析2
看到 index.php
第22行,这里的数据是直接从cookie中获取。我们不能直接修改别人浏览器中的cookie,也就是这里不会存在xss漏洞。如果网站有跨域资源共享漏洞(CORS)就可以通过ajax请求修改受害者cookie,结合此处就代码就形成xss漏洞,所以最好在此处对特殊字符进行转义。
漏洞分析3
我们对 $_COOKIE['adminUser']
处理后再仔细观察此处代码,发现程序首先会判断 $_SESSION['adminUser']
是否存在,如果不存在就会获取 $_COOKIE['adminUser']
的值。我们知道session是无法改变的,但是自己浏览器上的cookie是可以任意修改的。我们猜测判断登录的逻辑也和此处一样,如果一样则可以通过修改cookie来绕过登录。
在index.php的第3行有判断登录的函数,按住 ctrl
同时用鼠标点击 checkLogin()
,这样就跳转到了该函数定义的位置。
发现判断登录的函数的逻辑果然和上一处一样。程序会判断 $_SESSION['adminId']
和 $_COOKIE['adminId']
是否存在且不等于空,只要其中一个存在且不等于空则会认为用户已经登录。
漏洞复现
首先打开网站后台,发现无法访问。
在cookie中添加 adminId
,其值为1。
再次访问后台,发现可以成功进入。
修复方法
禁止使用cookie值作为登录的标志,修改后代码如下图所示。但是这样修改后就无法保存登录状态,每次进入后台都要重新登录。
漏洞分析4
看到 page.func.php
的第3行,这条数据流的来源 $_SERVER['PHP_SELF']
,经过一系列处理后直接输出在页面,中间没有对特殊字符进行转义。其中 $_SERVER['PHP_SELF']
是获取url中文件地址和文件名,例如访问 http://localhost/admin/index.php?id=1
,该页面中的 $_SERVER['PHP_SELF']
就等于 /admin/index.php
。再例如访问 http://localhost/admin/index.php/<script>alert(1)</script>?id=1
,该页面中的$_SERVER['PHP_SELF']
就等于 /admin/index.php/<script>alert(1)</script>
,这样就成功利用了xss漏洞。
漏洞复现
在 /indexpc.php
中搜索图片,图片要大于1页才会显示页码。发现该网页文件名已经显示了在浏览器中。
可以在
/indexpc.php
中66,69行修改每页图片张数,默认是每页20张,如下图所示是修改为每页2张图片。
在 /indexpc.php
加上恶意代码并访问: /indexpc.php/'><script>alert(1)</script>
,发现成功弹出提示框。
注意浏览器中显示的是
"
,但是实际上是'
,所以此处需要单引号来闭合标签。
其他xss漏洞也是以同样的方法修复,这里就不在赘述。下一期分析任意文件删除漏洞和sql注入漏洞。
最后感谢我的室友斧正。