zzcms2019存储型xss漏洞审计(超详细)

本文详细介绍了zzcms2019中存储型XSS漏洞的审计过程,从复现漏洞到定位关键代码,再到成功绕过防护机制,最终实现XSS攻击。主要涉及内容包括:识别stripfxg调用、调试show.php与top.php、寻找usermodify.php并执行更新操作、分析stopsqlin.php函数以及触发XSS代码。
摘要由CSDN通过智能技术生成
存储型xss漏洞复现
  1.  function stripfxg($string,$htmlspecialchars_decode=false,$nl2br=false) {
         
       $string=stripslashes($string);
     if ($htmlspecialchars_decode==true){
         
       $string=htmlspecialchars_decode($string);//转html实体符号
     }
     if ($nl2br==true){
         
       $string=nl2br($string);
     }
       return $string; 
     }
     /*传入字符串,默认参数$htmlspecialchars_decode=false,,$nl2br=false,先对传入的字符串进行stripslashes()调用,
     返回一个去除转义反斜线后的字符串(\' 转换为 ' 等等)。双反斜线(\\)被转换为单个反斜线(\)。
     实例:
     <?php
       $str = "Is your name O\'reilly?";
     
       // 输出: Is your name O'reilly?
       echo stripslashes($str);
     ?>
     接着if($htmlspecialchars_decode==true)决定是否对字符串调用htmlspecialchars_decode()此函数的作用和 htmlspecialchars() 刚好相反。它将特殊的HTML实体转换回普通字符。
     被转换的实体有: &amp;, &quot; (没有设置ENT_NOQUOTES 时), &#039; (设置了 ENT_QUOTES 时), &lt; 以及&gt;。
     最后根据一个nl2br()函数只是根据变量执行换行,并不是重点*/
    
  2.  梳理完上述的函数,要想借由这个函数触发xss,需要达到以下几点:
     ①如果传入的字符串$string在调用之前被类似htmlspecialchars()处理过,
     则需要在在调用stripfxg()函数第二个参数$htmlspecialchars_decode传入true,
     执行翻转,并将调用stripfxg的string进行类似echo的操作,才会显示在页面上,即xss触发。
     ②如果传入的字符串$string在调用之前未被类似htmlspecialchars()处理过,
     则在调用stripfxg()函数第二个参数$htmlspecialchars_decode按照默认的false也可,
     但同样的是对调用stripfxg的string进行类似echo的操作,才xss触发。
    
  3. 全局检索stripfxg的调用:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0QNSEAIj-1616777439254)(./pic/image-20210223212425161.png)]
    由于是复现,故知道了漏洞位置,真实审计过程,需要进行筛选,甄别

  4.  在...zt/show.php,有如下代码:
     $gsjj=$gsjj. stripfxg($content,true);   
     //第二个参数传入true会进行thmlspcialchars翻转,使得出于安全考虑的xss过滤无效
    
  5. 尝试调试/zt/show.php,访问/zt/show.php:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8o8CBkBc-1616777439257)(./pic/image-20210223213210631.png)]
    在show.php文件下断点,看缺少的参数是哪里的[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hacmUh93-1616777439259)(./pic/image-20210223213407179.png)]
    发现卡壳的位置在第六行代码,跟进发现在top.php出现如下代码:

  6.  //略
     if($id<>0){
            //参数缺失
       $sql="select * from zzcms_user where id='$id'";
     }elseif ($editor<>"" && $editor<>"www" && $editor<>"demo" && $domain<>str_replace("http://","",siteurl)){
         
       $sql="select * from zzcms_user where username='$editor'";
     }elseif(isset($editorinzsshow)) {
         
       $sql="select * from zzcms_user where username='".$editorinzsshow."'"; 
     }else{
         
       showmsg ("参数不足!");//这句被执行了。出现了上述的弹窗
     }
     //回溯$id的传值过程,发现如下同文件下的代码:
     $id=isset($_REQUEST['id'])?$_REQUEST['id']:0;
     
     //至此了解到,访问zt/show.php失败是由于访问时没有传递字段id,经由三目运算符使得$id=0,被if语句捕获,出现了弹窗。
    
  7. 传递id字段,/zt/show.php?id=1(由if语句,只要设置id字段非0即可),继续调试[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CPCdASAa-1616777439273)(./pic/image-20210223214505174.png)]
    不再进入弹窗分支,后边分支做了语句拼接$sql="select * from zzcms_user where id=’$id’"执行了查询:

  8.  $rs=query($sql);
     $row=num_rows($rs);
     if (!$row){
       showmsg ("不存在该用户信息!",siteurl);
     }
    

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值