检验用户是否有权使用某功能的织梦函数TestPurview
什么是渗透测试?
渗透测试,是渗透测试工程师完全模拟黑客可能使用的攻击技术和漏洞发现技术,对目标网络、主机、应用的安全作深入的探测,发现系统最脆弱的环节。
如何进行Web渗透测试?
完整web渗透测试框架当需要测试的web应用数以千计,就有必要建立一套完整的安全测试框架,流程的最高目标是要保证交付给客户的安全测试服务质量。
1、立项:项目建立,时间安排,人力分配,目标制定,厂商接口人确定;
系统分析&威胁分析:针对具体的web应用,分析系统架构、使用的组件、对外提供的接口等,以STRIDE为威胁模型进行对应的安全威胁分析,输出安全威胁分析表,重点关注top3威胁;
制定测试用例:根据威胁分析的结果制定对应的测试用例,测试用例按照模板输出,具备可执行性;
测试执行&漏洞挖掘:测试用例执行&发散测试,挖掘对应的安全问题or漏洞;
问题修复&回归测试:指导客户应用开发方修复安全问题or漏洞,并进行回归测试,确保安全问题or漏洞得到修复,并且没有引入新的安全问题;
项目总结评审:项目过程总结,输出文档评审,相关文档归档。
2、Web应用的渗透测试流程
主要分为3个阶段,分别是:信息收集→漏洞发现→漏洞利用,下面仔细分析一下各个阶段流程:
一、信息收集
在信息收集阶段,我们需要尽量多的收集关于目标web应用的各种信息,比如:脚本语言的类型、服务器的类型、目录的结构、使用的开源软件、数据库类型、所有链接页面,用到的框架等
脚本语言的类型:常见的脚本语言的类型包括:php、asp、aspx、jsp等
测试方法:
1 爬取网站所有链接,查看后缀
2 直接访问一个不存在页面后面加不同的后缀测试
3 查看robotstxt,查看后缀
服务器的类型:常见的web服务器包括:apache、tomcat、IIS、ngnix等
测试方法:
1 查看header,判断服务器类型
2 根据报错信息判断
3 根据默认页面判断
目录的结构:了解更多的目录,可能发现更多的弱点,如:目录浏览、代码泄漏等。
测试方法
1 使用字典枚举目录
2 使用爬虫爬取整个网站,或者使用google等搜索引擎获取
3 查看robotstxt是否泄漏
使用的开源软件:我们如果知道了目标使用的开源软件,我们可以查找相关的软件的漏洞直接对网站进行测试。
测试方法
指纹识别(网络上有很多开源的指纹识别工具)
数据库类型:对于不同的数据库有不同的测试方法。
测试方法
1 使应用程序报错,查看报错信息
2 扫描服务器的数据库端口(没做NAT且防火墙不过滤时有效)
所有链接页面:这个跟前面的获取目录结构类似,但是这个不只是获取网站的所有功能页面,有时候还可以获取到管理员备份的源码。
测试方法
1 使用字典枚举页面
2 使用爬虫爬取整个网站,或者使用google等搜索引擎获取
3 查看robotstxt是否泄漏
用到的框架:很多网站都利用开源的框架来快速开发网站,所以收集网站的框架信息也是非常关键的。
测试方法
指纹识别(网络上有很多开源的指纹识别工具)
二、漏洞发现
在这个阶段我们在做测试的时候要对症下药,不能盲目的去扫描,首先要确定目标应用是否使用的是公开的开源软件,开源框架等、然后在做深一度的漏洞扫描。
关于开源软件的漏洞发现
开源的软件:常见的开源软件有wordpress、phpbb、dedecms等
开源的框架:常见的开源框架有Struts2、 Spring MVC、ThinkPHP等
中间件服务器:常见的中间件服务器有jboss、tomcat、Weblogic等
数据库服务:常见的数据库服务mssql、mysql、oracle、redis、sybase、MongoDB、DB2等
对于开源软件的测试方法
1 通过指纹识别软件判断开源软件的版本信息,针对不同的版本信息去开放的漏洞数据库查找相应版本的漏洞进行测试
2 对于默认的后台登录页、数据库服务端口认证等入口可以进行简单的暴力破解、默认口令尝试等操作
3 使用开源的漏洞发现工具对其进行漏洞扫描,如:WPScan
关于自主开发的应用
手动测试:这个阶段,我们需要手工测试所有与用户交互的功能,比如:留言、登入、下单、退出、退货、付款等操作
软件扫描:使用免费的软件扫描,如:appscan、wvs、netsparker,burp等
可能存在的漏洞
Owasp关键点
代码安全之上传文件
代码安全之文件包含
代码安全之SSRF
逻辑漏洞之密码重置
逻辑漏洞之支付漏洞
逻辑漏洞之越权访问
平台安全之中间件安全
三、漏洞利用
针对不同的弱点有不同的漏洞利用方式,需要的知识点也比较多。一般这个阶段包括两种方式,一种是手工测试,一种是工具测试
手工测试
手工测试是通过客户端或服务器访问目标服务,手工向目标程序发送特殊的数据,包括有效的和无效的输入,观察目标的状态、对各种输入的反应,根据结果来发现问题的漏洞检测技术。手工测试不需要额外的辅助工具,可由测试者独立完成,实现起来比较简单。但这种方法高度依赖于测试者,需要测试者对目标比较了解。手工测试可用于Web应用程序、浏览器及其他需要用户交互的程序。
这种方式对于有特殊过滤等操作,或者网络上没有成型的利用工具的时候可以使用。
工具测试
网络上有很多好用的免费利用工具,比如针对sql注入的sqlmap、针对软件漏洞的matesploit等。
我们完成了环境的准备之后,下面就可以通过在浏览器中输入安装向导的网址开始进行DedeCMS的安装,在安装完成之后我们就可以看到我们的站点。
我们下载下来通常是一个压缩包,将其解压,然后将upload文件夹中的文件上传到网站的根目录中。
提示:安装包解压后,一般含有使用协议、安装说明及版本说明几个文件,新人在第一次使用的时候希望阅读下相关的说明。
1我们在浏览器中打开http://你的网址/install/indexphp ,开始进行安装。
2选中“我已经阅读并同意此协议”点击继续,这里系统跳转到环境检测页面。
这里我们对系统环境做一个简单的说明:
DedeCMS是基于PHP和MySQL技术开发,可以同时使用在Windows、Linux、Unix平台,其具体环境如下:
◆Windows 平台 IIS/Apache + PHP4/PHP5 + MySQL3/4/5
如果在windows环境中使用,建议用DedeCms提供的DedeAMPZ套件以达到最佳使用性能。
◆Linux/Unix 平台 Apache + PHP4/PHP5 + MySQL3/4/5 (PHP必须在非安全模式下运行) 建议使用平台 Linux + Apache22 + PHP52 + MySQL50
◆PHP必须环境或启用的系统函数 [√]allow_url_fopen [√]GD扩展库
[√]MySQL扩展库 [√]系统函数(phpinfo、dir)
2如果环境检测全部正确([√]),我们点击“继续”进入“参数配置”
3首先我们配置“数据库设定”部分的参数,这里我们涉及到几个概念“数据库主机”、“数据库名称”、“数据库用户”、“数据库密码”、“数据表前缀”、“数据库编码”。
如果您使用的是虚拟主机或者合租服务器,一般空间商都会提供给你相关的数据,如果你是自己配置服务器或者本地测试,一般在环境架设时候会有相关的信息提示。
以 DedeAMPZ为例,因为Apache和MySQL共同安装在一台计算机上,所以数据库主机地址为“localhost”,数据库名称我们这是设置为默 认“dedecmsv53”,数据库用户名为“root”、密码为MySQL数据库默认密码“123456”,表前缀为“dede_”。
说 明:数据表前缀是为了方便一个数据库中存放多个程序的数据库,例如你一个数据库需要安装两个DedeCMS系统,第一个系统数据表前缀可以设置为 “dedea_”,第二个数据表可以设置为“dedeb_”,因为表前缀不同,数据表在数据库中存在的表名也不相同,例如第一个系统的管理员账号存放的数 据表则为“dedea_admin”,第二个数据表名为“dedeb_admin”,这样他们两个系统的数据库就可以共存在一个Mysql数据库中。
4网站设置中需要注意的是填写你的“网站网址”和“CMS安装目录”,其中“CMS安装目录”如果你安装在网站根目录不需要去理会,如果你安装在根目录的某个文件夹下需要进行相关的设置(程序会自动检测)。
5点击“继续”,完成DedeCMS的安装,到这里为止,我们的安装已经完成了,下面就是我们开始使用DedeCMS
6点击[登陆网站后台],网址自动转向到http://wwwyoursitecom/dede/loginphp(yoursite代表你的网站),输入我们安装时候填写的管理员用户名和密码,以超级管理员身份登陆系统。
提示:系统默认管理路径是dede,登陆管理后台可以通过地址http://wwwyoursitecom/dede/loginphp进行访问,但是为了确保系统的安全,建议新人在安装完成之后修改后台的管理路径,例如:myadmin,这样你可以通过http://wwwyoursitecom/myadmin/loginphp登陆,别人就不容易猜到你的后台地址。
函数TestPurview($n)虽然,看上去只是一个相对比较简单的函数,但是这个函数是非常非常重要的,试想一下如果一个系统中没有检验某个用
户是否有权限操作某些功能的话,那么,这个系统一定非常危险,因为,随便一个人都可以操作某个功能,例如,进入后台,删除栏目,删除数据库等,就如同一个
家四周都没有墙一样,随便什么人都可以进入,这样的家完全就是公共场合,完全没有什么安全可言,一个系统也是如此。
所以,检测系统函数就比较重要了,当然,光这个一个函数还不够,不光要检验用户的使用权限,还要检验用户密码,是不是管理员,甚至是用户登录ip等,都要检验一下,这样才可以称得上安全的系统。
本函数在“管理员登陆类”userloginclassphp里面的第一个函数就是它,返回的值是true或false,若有权限则返回trure否则返回false。
通过教程“织梦中cookie和session的应用”我们知道了,当我们登录后台后,织梦系统会把登录的用户信息写入session里面,并把session存放在/data/session文件夹里面。
因为不同的用户登录后台,产生的session是不一样的,我就在后台注册一个发布员,用户名为fby。并且,在后台定义“信息发布员”的权限如下图所示。
登录/注册后可看大图
我整理了一下“信息发布员”的权限如下:
列出授权栏目(t_AccList)
发布授权文档(a_AccNew)
列出授权文档(a_AccList)
列出我发布的文档(a_MyList)
修改我发布的文档(a_MyEdit)
删除我发布的文档(a_MyDel)
更改个人密码(sys_MdPwd)
评论管理(sys_Feedback)
管理我的上传(sys_MyUpload)
当我用fby用户名登录后,在data/session/文件夹里面,生成一个名为sess_3vtlqpg0pnlmc63pd5ai86gl16 的 session 。这个session里面的内容如下所示。
securimage_code_value|s:4:"npll";
dede_admin_id|s:1:"8";
dede_admin_type|s:1:"1";
dede_admin_channel|s:0:"";
dede_admin_name|s:3:"fby";
<font color="Blue">dede_admin_purview|s:107:"t_AccList
a_AccNew a_AccList a_MyList a_MyEdit a_MyDel sys_MdPwd sys_Feedback
sys_MyUpload plus_留言簿模块 ";</font>
dede_admin_style|s:10:"newdedecms";
复制代码
如果我们以超级管理员,也就是最高级别的身份登录后台后,我们同样得到类似的如下内容。
securimage_code_value|s:4:"2gsf";
dede_admin_id|s:1:"1";
dede_admin_type|s:2:"10";
dede_admin_channel|s:1:"0";
dede_admin_name|s:5:"admin";
<font color="Blue">dede_admin_purview|s:15:"admin_AllowAll ";</font>
dede_admin_style|s:10:"newdedecms";
复制代码
当登录后,这些是如何生成的?这个我们在上面提到了,以前的教程已经详细讲解了,其实,就是通过“管理员登陆类”userloginclassphp里面的函数来实现的,当然,不只是这个文件。
我们分析上面这些,完全就是为了函数TestPurview($n)作准备的,好了,现在我们来分析一下这个用户权限检验函数。
函数:
function TestPurview($n)
{
$rs = FALSE;
$purview = $GLOBALS['cuserLogin']->getPurview();
if(preg_match('/admin_AllowAll/i',$purview))
{
return TRUE;
}
if($n=='')
{
return TRUE;
}
if(!isset($GLOBALS['groupRanks']))
{
$GLOBALS['groupRanks'] = explode(' ',$purview);
}
$ns = explode(',',$n);
foreach($ns as $n)
{
//只要找到一个匹配的权限,即可认为用户有权访问此页面
if($n=='')
{
continue;
}
if(in_array($n,$GLOBALS['groupRanks']))
{
$rs = TRUE; break;
}
}
return $rs;
}
复制代码
通过getPurview()方法,我们从session得到了dede_admin_purview里面的值,因
为,$GLOBALS['cuserLogin']是实例化“登录类”的对像,而这个登录类的构造函数,在我们实例化时,已经把session里面的值赋
给了$this->userPurview,代码如下所示。
$this->userID = $_SESSION[$this->keepUserIDTag];
$this->userType = $_SESSION[$this->keepUserTypeTag];
$this->userChannel = $_SESSION[$this->keepUserChannelTag];
$this->userName = $_SESSION[$this->keepUserNameTag];
$this->userPurview = $_SESSION[$this->keepUserPurviewTag];
$this->adminStyle = $_SESSION[$this->keepAdminStyleTag];
复制代码
从上面代码我们就不难发现$this->userPurview=$_SESSION['dede_admin_purview'],即
t_AccList a_AccNew a_AccList a_MyList a_MyEdit a_MyDel sys_MdPwd
sys_Feedback sys_MyUpload plus_留言簿模块这些值,明白了这一点,这个TestPurview($n)就简单多了。
1、条件判断:
if(preg_match('/admin_AllowAll/i',$purview))
{
return TRUE;
}
复制代码
如果我们用的是管理员登录,那么,$_SESSION['dede_admin_purview']的值等于admin_AllowAll,返回true,所以,这句代码就是判断是不是管理登录。
2、条件判断
if($n=='')
{
return TRUE;
}
复制代码
若参数为空,直接返回true,也就是说,只要不提供功能参数,就认为是可以操作的,所以,这一点要注意了,如果你不小心,忘记写参数,那么,很可能本想过虑掉的用户结果没有过虑掉,这是非常危险的,所以,这个最好有个提示,有个对话框,这样可以提醒管理员。
3、把登录的后台的用户的权限,例如,本例子中的“信息发布员”权限$_SESSION['dede_admin_purview'],转换成数组存放到全局变量$GLOBALS['groupRanks']里面,以备下面之用。
if(!isset($GLOBALS['groupRanks']))
{
$GLOBALS['groupRanks'] = explode(' ',$purview);
}
复制代码
4、把功能参数转换成数组:$ns = explode(',',$n);
5、遍历:foreach($ns as
$n),就是把传递过来的功能参数,通过in_array($n,$GLOBALS['groupRanks'])这个函数进行对比,看一下$n里面的有
没有存功能在数组$_SESSION['dede_admin_purview']里面。例如:本例子信息发布员的权限在上我们已经知道了
有:t_AccList a_AccNew a_AccList a_MyList a_MyEdit a_MyDel sys_MdPwd
sys_Feedback sys_MyUpload plus_留言簿模块这些值。
如果$n是:a_AccNew,t_New,经过上面一个遍历,我们发现,其中a_AccNew在数
组$GLOBALS['groupRanks'],函数立马跳出来,返回一个true,也就是说织梦的这个函数,只要$n里面有一个是
与$GLOBALS['groupRanks']里面的值一样,
就可以操作这个页面。而不需要全部都在$GLOBALS['groupRanks']里面才可以操作这个页面。
当然,你可以根据自己需要,直接严格匹配,只有全部都在登录用户的权限里面才可以操作页面。这个功能也简单,只要作如下更改:
if(!in_array($n,$GLOBALS['groupRanks']))
{
$rs = FALSE; break;
}
复制代码
也就是把$n参数里面的值判断一下,只要有一个不在登录用户的权限里面,就返回false,退出操作。
请尝试使用安全软件进行扫描,设备中存在木马一般是不良的上网习惯或者下载陌生的软件导致的。设备中存在木马一般的表现是自动下载其他垃圾软件、系统卡顿或者出现延迟、出现有遮挡的广告等问题。
若怀疑手机中存在木马或者病毒,请尝试按照以下步骤请尝试安装一款安全软件(例如:手机管家等)。以手机管家为例,打开手机管家,点击主界面上的一键体检即可自动检测手机中存在的问题,并且给出处理建议,点击一键清除即可删除病毒程序。
若怀疑电脑中存在木马,请尝试下载一款安全软件(例如:电脑管家等)进行全盘扫描和清理即可。也可以尝试下载木马专杀程序对电脑进行清理。若依然无法处理请尝试将硬盘全部格式化然后重新安装系统。
0条评论