前言:
首发知识星球,
每周会陆续选一篇或者2篇本周写的文章放公众号上。
之前的文章写过利用../ ;的权限绕过案例,这里就不再谈了。
后面陆续写几篇其他类型的绕鉴权方式,部分放出来。
有些是代码审计审的,有些是黑盒挖的。
漏洞挖掘:
今天写的是一篇利用action的权限绕过案例:
具体情况如下 打一次护网项目遇到了一个通用的设备系统:
搜索相关历史漏洞存在2个历史rce和缓存文件包含导致的getshell。
拿poc直接打的时候发觉
2个历史rce均回显显示为–>认证失败,请重新登陆!
且代码路径不同,action方式不同,但是回显的内容均相同,即怀疑有可能是include一个代码做的权限校验,具体目前还不得而知。
于是进行抓包前台的接口,如登陆接口等,这里抓的是登陆接口。
发觉这里的action为login,且回显不太一样。但是这里代码也可能是白名单路径导致的,所以需要进行尝试,尝试更改action为其他的。
得到了回显结果跟上面一样的结果–>认证失败,请重新登陆!即
历史漏洞1 | 路径相同,action不为login–>认证失败,请重新登陆! |
---|---|
历史漏洞2 | 路径相同,action不为login–>认证失败,请重新登陆! |
前台路径 | 路径相同,action不为login–>认证失败,请重新登陆! |
且代码为php代码,可能采用循环request的方式思路去赋值。
于是尝试将历史漏洞的action改为login 成功得到success的访问。
但是访问文件会发现 并没有写入成功什么原因导致的呢,思考了下这里的原因是由于action没有调用到原来的方法,然后导致无法执行之前的代码。
走到这里似乎比较鸡肋了,但是既然权限已经过了,是否可以意味着我们可以找一个后台不需要action来进行限制的代码,然后直接执行呢?
恰巧上面的日志文件包含就是这种写法。
由于造成漏洞是缓存文件写入加include包含导致的漏洞,不需要调用action,因此可以直接利用他去进行getshell。
后续就是正常写shell的事情了。
成功1day转0day,通杀。
原理分析:
php语言中,常见几种鉴权方式
1、include一个代码文件,包含文件中写鉴权代码进行做鉴权。即
<?php
include("鉴权.php");
?>
2、继承一个父类,父类中写鉴权代码来进行鉴权。
3、在每一个代码中分别进行写代码来进行鉴权。
根据上面的三种不同路径,但是返回均相同,即大概率先排除第三种的写法。
又加上action为login时,同路径但是action不同回显返回包内容不同。
因此可以猜测代码中是用action来进行做鉴权的,然后把代码放在继承的父类或者include的代码中(即第二种或第三种)
if(($action != "login" )){
$usersession= $_COOKIE["usersession"];
$sql = "SELECT user from users where session='$usersession' ";
$res=mysql_query($sql);
$islogin = 0;
while($row = mysql_fetch_array($res,MYSQL_BOTH)){
$islogin = 1;
}
if($islogin == 0){
$errstr = "认证失败,请重新登录!";
echo "{'success':false,'info':'$errstr'}";
exit(0);
}
}
因此我们构造action为login即可导致这个绕过。
而又因为如果非原来的action会进不到执行代码里面去,所以我们需要进行找一个非action而是直接本身就可以进行通过的代码。
最后:
陆陆续续有师傅在加星球,首先感谢各位老哥的信任。
但是吧,搞这玩意纯粹是给自己写文章更多一些动力以及限定有一个交流技术的群。
所以加的师傅,考虑好是否真的有用后再加,说不定这个是割韭菜呢?
以及为了限制门槛,人数上了50人后会进行涨价到129。
原文始发于微信公众号(goddemon的小屋):巧用action方式进行权限绕过