当前位置: 首页 > 后端技术 > PHP

通过代码审计找出网站XSS漏洞(三)

时间:2023-03-29 21:57:18 PHP

一、背景作者之前录制了一套XSS视频教程,在章节中讲解了人工挖掘、工具挖掘、代码审计三个部分漏洞案例。我打算以文章的形式再写一遍内容。前两篇已经写好了,内容有一定的关联性。手动XSS挖掘文章地址是快速找出网站可能存在的XSS漏洞的做法(一)https://segmentfault.com/a/1190000016095198本文主要记录通过代码审计进行XSS漏洞挖掘,分为三部分:查找关键位置、正向审计、反向审计。审计系统就是渗透测试系统,测试系统的搭建可以参考作者的第一篇文章。2.操作概述找出关键位置正向审计和反向审计3.找出关键位置打蛇打七寸,说明在关键位置做事效率会更高。代码审计查找漏洞也是如此,所以作者需要找出XSS的关键位置;对于目前大多数的Web应用来说,MVC模型是一种非常主流的形式,所以笔者会在这里找到对应的控制器和模板。本节主要讲解查找位置的思路3.1查找控制器查找控制器的方式通常是分析主入口文件和URL地址。现在我打开主页,发现URL地址是http://permeate.songboy.net/home/index.php,当我点击该部分后,URL地址变成了下面的地址http://permeate.songboy。net/home/index.php?m=tiezi&a=index&bk=6从url地址可以看出,无论是首页还是栏目页,都是通过url地址home/index.php,所以笔者可以打开home/index.php文件以检查存储控制器的位置。打开后代码如下public/footer.php";再次打开../core/common.php文件,代码如下functionincludeAction($model,$action){//判断controller是否存在$filePath="./action/$模型.php";如果(is_readable($filePath)){require_once$filePath;$class=new$model;如果(is_callable(array($class,$action))){$class->$action();返回真;}}//如果没有找到对应的controller,直接调用模板文件$tplFilePath="./tpl/$model/$action.php";if(is_readable($tplFilePath)){require_once$tplFilePath;returntrue;}echo'Controllerortemplatefile'.$filePath.'Doesnotexist!';die;}从代码你可以可以看到它的controller文件存放在home/action/下,此时笔者打开这个文件夹可以看到几个php文件,如下图所示,回想一下刚才看到的URL地址是如下http://permeate.songboy.net/home/index.php?m=tiezi&a=index&bk=6认为其controller文件为tiezi.php,打开可以看到$val){$$key=$val;}require_once$filePath;}从上面的代码可以看出,模板存放在home/tpl目录下,通过文件夹打开查看,如下图3.3验证位置通过上面的操作过程,controller和模板的位置已经基本确定,但是为了防止出现意外,还是要核对准确,在controller中输出字符串1111111,在模板中输出字符串222222222,如果按照笔者之前的expectation,那么两组字符串都会输出,参考代码如下,controller中添加的测试代码如下publicfunctionindex(){echo'11111111111';模板文件中添加的测试代码如下222222222222222现在进入浏览器,在当前页面点击鼠标右键,选择ViewSourceCode,如下图在源代码中,搜索字符串11111,找到该字符串,如下图4.前向审计找到关键位置后,作者可以进行有针对性的审计代码审计,XSS代码审计主要有两种方式,正向代码审计和反向代码审计;正向代码审计是指从参数的接收到参数的最终使用进行检查,而反向审计则与变量的使用相反,将位置向上推到参数接收4.1接收参数的位置首先进行代码审计通过前向方法,而前向代码审计是从接收参数开始检查,所以找到controller,通过编辑器的搜索功能,笔者在controller文件中查找关键字$_GET,找到了index方法中的tiezi.php控制器,代码如下publicfunctionindex(){$id=$_GET['bk'];$bk=&$id;//开始分页大小$page_size=15;//获取当前页码$page_num=empty($_GET['page'])?1:$_GET['页面'];//中间代码....省略$data['bk']=$bk;$数据['计数']=$计数;$data['page_size']=$page_size;$data['page_count']=$page_count;$data['page_num']=$page_num;displayTpl('贴子/索引',$data);}4.2是否对模板位置进行过滤从上面的代码可以看出,参数bk并没有进行任何过滤,所以直接放在模板中,存在安全隐患。如果模板中没有安全过滤,那么就存在反射XSS漏洞。打开模板文件,搜索关键字bk,代码如下">Post

可以看出模板中确实没有安全过滤4.3漏洞验证http://permeate.songboy.net/home/index.php?m=tiezi&a=index&bk=6%22%3E%3Cscript%3Ealert(123)%3C/script%3E如下图5.逆向审计逆向审计发现模板中使用了哪些变量,反向变量来源,是否进行了安全过滤5.1找出模板中的变量通过PHPStrom编辑器的正则表达式功能匹配变量。正则表达式如下:echo\$([a-z]*)这个正则表达式是匹配输出变量,比如匹配字符echo$zhangsan,PHPStorm匹配的结果如下图所示,double-点击鼠标左键打开对应的代码文件/home/search.php,代码如下所示,可以看到变量是直接放在模板中的,如果控件中没有转义这个变量的源码在服务器中,所以可能存在XSS问题5.2查找变量源跟踪变量$keyword,查找变量源