那些年幹過的事(一)—php電商網站***及防護

背景

偶遇一從事電商的朋友,閒談說到了他的電商網站,他不理解自己的網站是如何被破解的,問我能否幫忙看看他的網站存在哪些安全漏洞,說實話當時偶並沒有研究過網站破解及安全防護,也是一時興起抱着學習的態度答應了朋友。

目標:

尋找網站漏洞獲取後臺數據,提供修復建議

工具及手段:

google、UE、Sqlyog、SQL注入

方式方法:

1、瞭解目標網站

訪問朋友網站,通過網站風格、網頁後綴、版權信息等判斷網站爲基於開源EC-SHOP進行簡單整合後部署的,開發語言php,版本號v2.5.0。

2、搜索資料

通過google搜索ec-shop介紹及其漏洞,下載ec-shop程序,網上公佈了很多ec-shop的漏洞,主要利用SQL注入的方式。

搜索到user.php頁面存在注入漏洞,http://xxx.com/user.php?act=order_query&order_sn=21,其中order_sn並沒有對字符進行檢查,可以通過構造特殊字符如:user.php?act=order_query&order_sn=',其中構造的參數爲英文單引號,頁面會返回sql錯誤提示。

3、搭建測試環境

工慾善其事必先利其器,我們不能上來就拿朋友的網站開火,還是自己搭建一個學習學習,當然如果需要的話,還可能要讀一下源代碼,以便找到更好的構造方法。

在網上下載到ecshop的程序,結合安裝部署說明在本地搭建ec-shop測試環境。

4、利用漏洞進行安全測試

使用在google上搜索到的常用漏洞進行試驗,

訪問http://localhost/user.php?act=order_query&order_sn=',返回的頁面讓我和小夥伴都驚呆了。截圖如下173734468.jpg

這個頁面告訴我們單引號被當作sql語句直接執行了,而且系統很豪爽的把sql的出錯信息完整的告訴了大家,通過這個返回頁面我們可以知道後臺的表名稱保留了ecshop的默認表。

系統執行的SQL語句爲SELECT order_id, order_status, shipping_status, pay_status, shipping_time, shipping_id, invoice_no, user_id FROM `ecs_order_info` WHERE order_sn = ''' LIMIT 1 ),請注意我們輸入的字符串會直接放入WHERE order_sn = '' 的雙引號內。熟悉SQL的同學們可以充分發揮你們的想象力了,提示下使用union(別小看這些平時不太起眼的詞呀)

這個漏洞相當於告訴大家,我給你們一個入口,可以執行sql語句,而且還可以把結果返回給你顯示,太恐怖了,如果sql溝通得當,我們可以得到後臺數據庫中任何想要的信息。

既然這麼多信息都能拿到,那什麼最重要呢,其實我們只要拿到那個最重要的,其他的都很有更好的辦法獲得,聰明的朋友也許想到了,那就是獲取管理員密碼,你想想管理員密碼都能拿到了,直接進入後臺管理界面,通過正常的頁面就能得到其他任何信息了。

那麼怎麼獲得管理員密碼信息呢?是不是覺得激動人心的時刻到了,事實上從發現漏洞,到漏洞發揮價值是一個煎熬也是令人激動的過程。

首先通過本地環境的數據庫知道管理員信息存放在表ecs_admin_user表中,主要字段名user_name,password,那麼獲取用戶名密碼的簡單sql爲 select username,password from ecs_admin_user;

考慮union的語法需要前後的字段數量、類型要一致纔可,SELECT order_id, order_status, shipping_status, pay_status, shipping_time, shipping_id, invoice_no, user_id FROM `ecs_order_info` WHERE order_sn = '' LIMIT 1 )我們可構造union select 1,2,3,4,5,6,concat(user_name,0x7c,password),8 from ecs_admin_user,其中0x7c爲構造一個分隔符,便於區分用戶名密碼,那我們把整個sql連接起來在數據庫中執行查詢,看是否能得到想要的結果,至於在如何在數據庫中執行查詢驗證我就不再這裏贅述了,經過驗證sql語句正確可以執行。

第二步,我們將這個sql放到url中,http://localhost/user.php?act=order_query&order_sn='union select 1,2,3,4,5,6,concat(user_name,0x7c,password),8 from ecs_admin_user,看結果,是不是很失望,並沒有返回我們想要的結果,通過查看錯誤提示,發現sql語法有錯誤,url中可以看到在union之前我們添加一個單引號,而網站在構造後臺sql時會在order_sn的值兩邊都添加單引號,這樣最後構造的sql是語法不正確的,怎麼解決呢? 還得感謝sql提供的好東東 /* ,這個特殊語句用於註釋後面的內容,我們把它加在我們構造的字符之後,就可以把不需要的內容屏蔽了,從而得到一個可執行的sql語句了。

第三步,再試http://localhost/user.php?act=order_query&order_sn='union select 1,2,3,4,5,6,concat(user_name,0x7c,password),8 from ecs_admin_user/*,怎麼樣?是不是很激動呢!

第四步,激動之後定睛一看,不對呀,密碼怎們是那麼長一串字符呢,嘿嘿,我悄悄的告訴你,那是用md5做加密的,是不是有些灰心了,折騰了半天怎們拿到的密碼還不能用呢,別灰心,要有耐心,要抱着水來土掩兵來將擋的精神,不折不撓,碰到攔路的要嗎直接幹掉要嗎想辦法繞過。至於md5密碼如何使用網上有很多辦法,本文中就不描述了,當然如果有必要的話,我會單獨寫文件介紹。

再給大家贈送一個附加信息,上述方法只會取數據庫中的第一個管理員密碼,如果想獲取其他行的管理員密碼,也有應辦法,在sql後 增加limit語句 from ecs_admin_user limit 0,1/*,limit的語法大家可上網查找。

第五步,通過管理員賬號密碼登錄後臺,成功!!!後臺數據都暴露與我的眼前!

第六步,既然都準備好了,就要真刀實槍的上陣了,訪問朋友網站,開火,一切順利,登錄後臺成功。告知朋友已經過測試,其網站存在漏洞。當我把管理員的密碼告訴他時,他震驚了。

第七步,我們的目的不是***網站,是幫朋友提供解決辦法提高網站安全性,不能忘記目的呀,要不就走上歪路了,呵呵。其實辦法也很簡單,如果會改代碼的話增加sql校驗即可。

當然朋友是小白,這種方法他肯定不會了,我就告訴他最笨的辦法,其實ecshop已經公佈了補丁,只是這哥們太懶沒有升級,到ecshop下載補丁包升級網站程序,解決此問題。

以上sql注入語句不是本人原創,都是網上蒐集到方法,我只是原封不動的利用或者略覺修改利用。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章