整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          招聘丨本科可報!中國鐵物總部及所屬單位公開招聘

          國鐵路物資集團(tuán)有限公司(簡稱中國鐵物)是國務(wù)院國資委監(jiān)管的大型中央企業(yè),是我國規(guī)模最大、服務(wù)能力最強(qiáng)、專業(yè)經(jīng)驗(yàn)最豐富、行業(yè)領(lǐng)先的鐵路生產(chǎn)性服務(wù)綜合提供商。集團(tuán)公司總部設(shè)在北京,在全國及美國、澳大利亞、老撾等國家擁有100多家分支機(jī)構(gòu)。經(jīng)營業(yè)務(wù)主要圍繞國內(nèi)外鐵路運(yùn)營、裝備制造、建設(shè)施工,涉及鐵路油品、軌道、裝備、鐵建、工業(yè)、物流、國際及相關(guān)多元等領(lǐng)域。

          根據(jù)公司發(fā)展需要,中國鐵物現(xiàn)就以下崗位面向社會進(jìn)行公開招聘。

          招聘崗位及資格條件


          (一)招聘部門:集團(tuán)總部法律合規(guī)部


          招聘崗位:法律顧問(經(jīng)理)1人


          崗位職責(zé):


          1.參與公司重大項(xiàng)目的法律事務(wù),提供法律咨詢與服務(wù);

          2.負(fù)責(zé)集團(tuán)公司總部工商登記管理和證照管理,辦理分子公司工商批復(fù)并監(jiān)督檢查證照使用管理工作;

          3.參與公司訴訟案件管理;

          4.審查合同,對公司業(yè)務(wù)發(fā)展中的法律風(fēng)險進(jìn)行分析,并提供法律意見和建議

          5.部門綜合事務(wù)和其他法律事務(wù)。


          崗位任職資格:


          1.全日制大學(xué)本科及以上學(xué)歷,法學(xué)相關(guān)專業(yè);

          2.5年以上工作經(jīng)歷,3年及以上企業(yè)法律顧問或律師事務(wù)所、法院、檢察院工作經(jīng)歷;

          3.具有法律執(zhí)業(yè)資格或企業(yè)法律顧問資格;

          4.具備較強(qiáng)的語言表達(dá)能力、邏輯能力、分析能力及良好的團(tuán)隊(duì)協(xié)作精神;

          5.人品正直,作風(fēng)正派,具有良好的職業(yè)素養(yǎng)和抗壓能力,無違規(guī)違紀(jì)違法等不良記錄;

          6.具有良好的心理素質(zhì),身體健康,年齡一般不超過35周歲。


          (二)招聘部門:集團(tuán)公司所屬信息中心


          招聘崗位:系統(tǒng)管理經(jīng)理 1人


          崗位職責(zé):


          1.負(fù)責(zé)集團(tuán)數(shù)據(jù)中心的構(gòu)架優(yōu)化、建設(shè)和實(shí)施工作;

          2.負(fù)責(zé)集團(tuán)數(shù)據(jù)中心服務(wù)器、數(shù)據(jù)庫、備份容災(zāi)系統(tǒng)等基礎(chǔ)設(shè)施平臺系統(tǒng)的監(jiān)控和維護(hù)工作;

          3.負(fù)責(zé)集團(tuán)各部門及分、子公司基礎(chǔ)設(shè)施方面運(yùn)行情況的監(jiān)督和咨詢支持工作;

          4.配合完成數(shù)據(jù)中心相關(guān)網(wǎng)信安全工作;

          5.協(xié)助完成集團(tuán)總部辦公網(wǎng)絡(luò)維護(hù)工作;

          6.承辦上級交辦的其他工作。


          崗位任職資格:


          1.計算機(jī)類、軟件類相關(guān)專業(yè)本科及以上學(xué)歷;

          2.對集團(tuán)級數(shù)據(jù)中心有深入理解,具備信息化基礎(chǔ)設(shè)施平臺5年以上實(shí)施和運(yùn)維經(jīng)驗(yàn);

          3.熟悉數(shù)據(jù)庫系統(tǒng)理論知識。熟悉ORACLE數(shù)據(jù)庫系統(tǒng),理解ORACLE數(shù)據(jù)庫體系結(jié)構(gòu)。能規(guī)劃并熟練安裝配置和維護(hù)多實(shí)例ORACLE數(shù)據(jù)庫系統(tǒng),熟悉RAC、DG等,熟悉ORACLE備份恢復(fù)機(jī)制,熟練使用PL/SQL等相關(guān)開發(fā)運(yùn)維工具;了解SQL-server、MYSQL數(shù)據(jù)庫;具有相關(guān)產(chǎn)品認(rèn)證;

          4.熟悉PC服務(wù)器和小型機(jī)服務(wù)器產(chǎn)品,熟悉AIX系統(tǒng)的安裝、配置和維護(hù);熟練運(yùn)用LINUX系統(tǒng);熟練運(yùn)用windows server系統(tǒng);具有shell、python(至少一種)編程能力;熟練搭建、維護(hù)ftp、nginx、apache、zabbix等服務(wù)及應(yīng)用能力;

          5.熟悉云計算技術(shù)和私有云搭建方式,有維護(hù)云主機(jī)與云數(shù)據(jù)庫經(jīng)驗(yàn);熟悉1-2種虛擬化管理軟件,具備VMware虛擬化環(huán)境的規(guī)劃、實(shí)施和運(yùn)維能力;

          6.了解SAP系統(tǒng)體系結(jié)構(gòu),了解SAP系統(tǒng)維護(hù)的主要內(nèi)容,有SAP basis經(jīng)驗(yàn)為佳;

          7.了解企業(yè)數(shù)據(jù)網(wǎng)絡(luò)管理,了解TCP/IP協(xié)議及網(wǎng)絡(luò)基礎(chǔ)知識。熟悉H3C、Juniper、Cisco、radware、深信服等主流網(wǎng)絡(luò)產(chǎn)品的配置和使用。了解網(wǎng)絡(luò)安全知識。了解ITIL運(yùn)維體系;

          8.身體健康,年齡一般不超過40周歲。


          招聘崗位:系統(tǒng)開發(fā)運(yùn)維經(jīng)理 1人


          崗位職責(zé):


          1.負(fù)責(zé)制定系統(tǒng)開發(fā)和集成技術(shù)規(guī)范;

          2.負(fù)責(zé)自開發(fā)系統(tǒng)需求分析、系統(tǒng)設(shè)計、代碼編寫與系統(tǒng)運(yùn)行管理;

          3.負(fù)責(zé)自開發(fā)系統(tǒng)代碼庫管理,保證代碼庫及時更新;

          4.負(fù)責(zé)開發(fā)文檔、開發(fā)外包的管理工作;

          5.負(fù)責(zé)自開發(fā)及相關(guān)系統(tǒng)的安裝、升級、日常運(yùn)行監(jiān)控和培訓(xùn)工作;

          6.承辦上級交辦的其他工作。


          崗位任職資格:


          1.計算機(jī)類、軟件類相關(guān)專業(yè)本科及以上學(xué)歷;

          2.6年以上軟件開發(fā)經(jīng)驗(yàn),3年以上大型企業(yè)級系統(tǒng)架構(gòu)設(shè)計開發(fā)經(jīng)驗(yàn),具備獨(dú)立設(shè)計開發(fā)系統(tǒng)能力;

          3.熟練使用兩種以上常用開發(fā)框架:Spring、JFinal、Hibernate、Mybatis等;

          4.熟練使用 JavaScript、Jquery、Html、CSS、AJAX及前端UI工具;

          5.熟練使用JAVA開發(fā)語言,了解C#、ABAP開發(fā)語言及企業(yè)開發(fā)方法;

          6.熟悉GIT、SVN等開發(fā)管理工具;

          7.熟悉主流數(shù)據(jù)庫Oracle、SQLServer、MySQL等,精通Oracle數(shù)據(jù)庫,能熟練使用存儲過程、視圖等;

          8.熟悉項(xiàng)目管理理論,熟悉敏捷和CMMI開發(fā)模式;

          9.最好具備倉儲物流相關(guān)業(yè)務(wù)知識;

          10.具有良好的溝通能力及團(tuán)隊(duì)協(xié)作精神,責(zé)任心強(qiáng);

          11.身體健康,年齡一般不超過40周歲。


          (三)招聘單位:中企云商物流(北京)有限公司


          招聘崗位:法律顧問1人


          崗位職責(zé):


          1.負(fù)責(zé)對公司經(jīng)營和決策提出法律意見;

          2.負(fù)責(zé)合同評審工作,參加合同的談判和起草;

          3.建立公司合規(guī)管理體系,開展合規(guī)管理工作,對業(yè)務(wù)過程進(jìn)行監(jiān)控,防范經(jīng)營風(fēng)險;

          4.組織、參與公司規(guī)章制度體系建設(shè);

          5.處理公司法律糾紛,代理公司仲裁、訴訟、行政復(fù)議等工作。


          崗位任職資格:


          1.全日制大學(xué)本科及以上學(xué)歷,法學(xué)、法律相關(guān)專業(yè);

          2. 2年及以上工作經(jīng)歷,具有企業(yè)法務(wù)管理、律師、法院、檢察院等工作經(jīng)歷者優(yōu)先;

          3.具備良好的法律基礎(chǔ)和企業(yè)法律知識,熟悉國內(nèi)貿(mào)易、物流、供應(yīng)鏈行業(yè)法律規(guī)定者優(yōu)先;

          4.具有較強(qiáng)組織協(xié)調(diào)能力、執(zhí)行能力和抗壓能力;

          5.具有良好的職業(yè)道德,較強(qiáng)的責(zé)任心和團(tuán)隊(duì)協(xié)作精神,無違規(guī)違紀(jì)違法等不良記錄;

          6.具有良好的心理素質(zhì),身體健康,年齡一般不超過35周歲。


          招聘程序


          1.招聘人員錄用工作按照自愿報名、資格審查、筆試、面試、組織考察、決定聘用的程序進(jìn)行。


          2.按照有關(guān)規(guī)定,對招聘正式聘用人員實(shí)行任職試用期。


          報名方式、要求及截至?xí)r間


          報名方式:下載并填寫《公開招聘報名表》(見附件)


          應(yīng)聘郵件標(biāo)題格式:“應(yīng)聘崗位+姓名+現(xiàn)單位及職務(wù)”。應(yīng)聘人員需將本人學(xué)歷學(xué)位證書、身份證、職稱證書、兩寸彩色照片、相關(guān)工作業(yè)績證明等材料,掃描件打包一并發(fā)送至報名電子郵箱binfei_1981@163.com


          中國鐵物總部及所屬信息中心崗位聯(lián)系方式:

          電話:010-51899255 報名郵箱:hr@crmsc.com.cn


          中企云商物流(北京)有限公司崗位聯(lián)系方式:

          電話:010-57649387 報名郵箱:binfei_1981@163.com


          報名截至?xí)r間:2019年7月17日


          來源:國務(wù)院國有資產(chǎn)監(jiān)督管理委員會

          責(zé)任編輯:王迪

          “人民旅游”

          分享你的游記與攻略,展示你的美景與美食,代你體驗(yàn)不一樣的風(fēng)景與風(fēng)情。

          AiJ是一套完整的房間類游戲解決方案,支持無限水平擴(kuò)展來滿足更大的人數(shù)承載,并且提供了良好的調(diào)試接口。

          主要模塊包括:

          • 注冊中心
          • 大廳服務(wù)
          • 游戲服務(wù)
          • 親友圈服務(wù)
          • 運(yùn)營管理

          .1.Sql注入攻擊原理

          SQL注入漏洞可以說是在企業(yè)運(yùn)營中會遇到的最具破壞性的漏洞之一,它也是目前被利用得最多的漏洞。要學(xué)會如何防御SQL注入,首先我們要學(xué)習(xí)它的原理。

          針對SQL注入的攻擊行為可描述為通過在用戶可控參數(shù)中注入SQL語法,破壞原有SQL結(jié)構(gòu),達(dá)到編寫程序時意料之外結(jié)果的攻擊行為。其成因可以歸結(jié)為以下兩個原因疊加造成的:

          程序編寫者在處理應(yīng)用程序和數(shù)據(jù)庫交互時,使用字符串拼接的方式構(gòu)造SQL語句。未對用戶可控參數(shù)進(jìn)行足夠的過濾便將參數(shù)內(nèi)容拼接進(jìn)入到SQL語句中。
          注入攻擊的本質(zhì),是把用戶輸入的數(shù)據(jù)當(dāng)做代碼執(zhí)行。這里有兩個關(guān)鍵條件:用戶能夠控制輸入。
          原本程序要執(zhí)行的代碼,拼接了用戶輸入的數(shù)據(jù)。

          1.2.Sql審計方法

          手動找的話,可以直接找到sqlmapper.xml文件或者直接搜索 select、update、delete、insert “String sql=”等關(guān)鍵詞,定位SQL xml配置文件。

          如果 sql 語句中有出現(xiàn) $ 進(jìn)行參數(shù)拼接,則存在SQL注入風(fēng)險。

          當(dāng)找到某個變量關(guān)鍵詞有 SQL 注入風(fēng)險時,可以再根據(jù)調(diào)用鏈找到該存在注入風(fēng)險的業(yè)務(wù)邏輯代碼,查看參數(shù)來源是否安全、是否有配置SQL危險參數(shù)過濾的過濾器,最終確認(rèn)是否存在SQL注入。以下給出可能造成sql注入攻擊的關(guān)鍵字,審計時可根據(jù)實(shí)際情況進(jìn)項(xiàng)查找

          常見SQL語句關(guān)鍵詞

          關(guān)鍵詞

          解釋

          ResultSet

          數(shù)據(jù)庫結(jié)果集的數(shù)據(jù)表,通常通過執(zhí)行查詢數(shù)據(jù)庫的語句生成。

          executeQuery

          執(zhí)行查詢

          select

          數(shù)據(jù)庫中的查詢關(guān)鍵字

          insert

          數(shù)據(jù)庫中的插入關(guān)鍵字

          update

          數(shù)據(jù)庫中的修改關(guān)鍵字

          delete

          數(shù)據(jù)庫中的刪除關(guān)鍵字

          where

          數(shù)據(jù)庫中的條件關(guān)鍵字

          union

          數(shù)據(jù)庫中的聯(lián)合查詢關(guān)鍵字

          drop

          數(shù)據(jù)庫中的刪除數(shù)據(jù)庫關(guān)鍵字

          create

          數(shù)據(jù)庫中的創(chuàng)建數(shù)據(jù)庫關(guān)鍵字

          count

          數(shù)據(jù)庫中的返回匹配行數(shù)關(guān)鍵字

          java.sql.Connection

          與特定數(shù)據(jù)庫的連接類

          Statement

          是 Java 執(zhí)行數(shù)據(jù)庫操作的重要接口

          jdbcTemplate

          最基本的Spring JDBC模板

          PreparedStatement

          預(yù)編譯的 SQL 語句的對象

          queryForInt

          數(shù)據(jù)庫查詢方法關(guān)鍵字

          queryForObject

          數(shù)據(jù)庫查詢方法關(guān)鍵字

          queryForMap

          數(shù)據(jù)庫查詢方法關(guān)鍵字

          getConnection

          獲取sql連接

          outfile

          數(shù)據(jù)庫中把表數(shù)據(jù)導(dǎo)出關(guān)鍵字

          load_file

          數(shù)據(jù)庫中導(dǎo)入數(shù)據(jù)的關(guān)鍵字

          【一一幫助安全學(xué)習(xí),以下都是免費(fèi)獲取,文末有領(lǐng)取方式~一一】
          ①網(wǎng)絡(luò)安全學(xué)習(xí)路線
          ②20份滲透測試電子書
          ③安全攻防357頁筆記
          ④50份安全攻防面試指南
          ⑤安全紅隊(duì)滲透工具包
          ⑥網(wǎng)絡(luò)安全必備書籍
          ⑦100個漏洞實(shí)戰(zhàn)案例
          ⑧安全大廠內(nèi)部教程

          1.3Sql注入漏洞危害

          1 、 攻擊者可以做到

          • 業(yè)務(wù)運(yùn)營的所有數(shù)據(jù)被攻擊
          • 對當(dāng)前數(shù)據(jù)庫用戶擁有的所有表數(shù)據(jù)進(jìn)行增、刪、改、查等操作
          • 若當(dāng)前數(shù)據(jù)庫用戶擁有file_priv權(quán)限,攻擊者可通過植入木馬的方式進(jìn)一步控制DB所在服務(wù)器
          • 若當(dāng)前數(shù)據(jù)庫用戶為高權(quán)限用戶,攻擊者甚至可以直接執(zhí)行服務(wù)器命令從而通過該漏洞直接威脅整個內(nèi)網(wǎng)系統(tǒng)

          2、可能對業(yè)務(wù)造成的影響

          ① 用戶信息被篡改

          ② 攻擊者偷取代碼和用戶數(shù)據(jù)惡意獲取

          線上代碼被非法篡改,并造成為惡意攻擊者輸送流量或其他利益的影響

          1.4Sql注入漏洞代碼示例

          Java 代碼動態(tài)構(gòu)建 SQL

          Statement stmt = null;
          
          ResultSet rs = null;
          
          try{
          
          String userName = ctx.getAuthenticatedUserName(); //this is a constant
          
          String sqlString = "SELECT * FROM t_item WHERE owner='" + userName + "' AND itemName='" + request.getParameter("itemName") + "'";
          
          stmt = connection.createStatement();
          
          rs = stmt.executeQuery(sqlString);
          
          // ... result set handling
          
          }
          
          catch (SQLException se){
          
          // ... logging and error handling
          
          }
          

          這里將查詢字符串常量與用戶輸入進(jìn)行拼接來動態(tài)構(gòu)建SQL查詢命令。僅當(dāng)itemName不包含單引號時,這條查詢語句的行為才會是正確的。如果一個攻擊者以用戶名wiley發(fā)起一個請求,并使用以下條目名稱參數(shù)進(jìn)行查詢:

          name' OR 'a' = 'a
          

          那么這個查詢將變成:

          SELECT * FROM t_item WHERE owner = 'wiley' AND itemname = 'name' OR 'a'='a';
          

          此處,額外的OR ‘a(chǎn)’='a’條件導(dǎo)致整個WHERE子句的值總為真。那么,這個查詢便等價于如下非常簡單的查詢:

          SELECT * FROM t_item
          

          這個簡化的查詢使得攻擊者能夠繞過原有的條件限制:這個查詢會返回items表中所有儲存的條目,而不管它們的所有者是誰,而原本應(yīng)該只返回屬于當(dāng)前已認(rèn)證用戶的條目。

          在存儲過程中動態(tài)構(gòu)建SQL

          Java代碼:

          CallableStatement = null
          
          ResultSet results = null;
          
          try
          
          {
          
          String userName = ctx.getAuthenticatedUserName(); //this is a constant
          
          String itemName = request.getParameter("itemName");
          
          cs = connection.prepareCall("{call sp_queryItem(?,?)}");
          
          cs.setString(1, userName);
          
          cs.setString(2, itemName);
          
          results = cs.executeQuery();
          
          // ... result set handling
          
          }
          
          catch (SQLException se)
          
          {
          
          // ... logging and error handling
          
          }
          
          SQL Server存儲過程:
          
          CREATE PROCEDURE sp_queryItem
          
          @userName varchar(50),
          
          @itemName varchar(50)
          
          AS
          
          BEGIN
          
          DECLARE @sql nvarchar(500);
          
          SET @sql = 'SELECT * FROM t_item
          
          WHERE owner = ''' + @userName + '''
          
          AND itemName = ''' + @itemName + '''';
          
          EXEC(@sql);
          
          END
          
          GO
          
          

          在存儲過程中,通過拼接參數(shù)值來構(gòu)建查詢字符串,和在應(yīng)用程序代碼中拼接參數(shù)一樣,同樣是有SQL注入風(fēng)險的。

          Hibernate 動態(tài)構(gòu)建 SQL/HQL

          原生SQL查詢:

          String userName = ctx.getAuthenticatedUserName(); //this is a constant
          
          String itemName = request.getParameter("itemName");
          
          Query sqlQuery = session.createSQLQuery("select * from t_item where owner = '" + userName + "' and itemName = '" + itemName + "'");
          
          List<Item> rs = (List<Item>) sqlQuery.list();
          

          HQL查詢:

          String userName = ctx.getAuthenticatedUserName(); //this is a constant
          
          String itemName = request.getParameter("itemName");
          
          Query hqlQuery = session.createQuery("from Item as item where item.owner = '" + userName + "' and item.itemName = '" + itemName + "'");
          
          List<Item> hrs = (List<Item>) hqlQuery.list();
          
          

          即使是使用Hibernate,如果在動態(tài)構(gòu)建SQL/HQL查詢時包含了不可信輸入,同樣也會面臨SQL/HQL注入的問題。

          HQL代碼中,session.createQuery使用HQL語句將查詢到的數(shù)據(jù)存到到list集合中,需要時在拿出來使用。而參數(shù)中itemName是通過request.getParameter直接獲取。攻擊者若在此處寫入惡意語句,程序?qū)阂庹Z句查詢出來的數(shù)據(jù)存放在list集合中,再通過某處調(diào)用成功將數(shù)據(jù)顯示在前臺。

          Mybatis注入分析

          Mybatis框架下易產(chǎn)生SQL注入漏洞的情況主要分為以下三種:

          1)模糊查詢like

          例如對人員姓名檢索進(jìn)行模糊查詢,如果考慮安全編碼規(guī)范問題,其對應(yīng)的SQL語句如下:

          Select * from user where name like '%#{name}%'
          

          但由于這樣寫程序會報錯,研發(fā)人員將SQL查詢語句修改如下:

          Select * from user where name like '%${name}%'
          

          在這種情況下我們發(fā)現(xiàn)程序不再報錯,但是此時產(chǎn)生了SQL語句拼接問題,如果java代碼層面沒有對用戶輸入的內(nèi)容做處理勢必會產(chǎn)生SQL注入漏洞。

          2)in之后的參數(shù)

          例如對人員姓名進(jìn)行同條件多值檢索的時候,如當(dāng)用戶輸入001,002,003…時,如果考慮安全編碼規(guī)范問題,其對應(yīng)的SQL語句如下:

          Select * from name where id in (#{id})
          

          但由于這樣寫程序會報錯,研發(fā)人員將SQL查詢語句修改如下:

          Select * from name where id in (${id})
          

          修改SQL語句之后,程序停止報錯,但是卻引入了SQL語句拼接的問題,如果沒有對用戶輸入的內(nèi)容做過濾,勢必會產(chǎn)生SQL注入漏洞。

          3)order by之后(重點(diǎn)和區(qū)分點(diǎn))

          當(dāng)根據(jù)姓名、id序號等信息用戶進(jìn)行排序的時候,如果考慮安全編碼規(guī)范問題,其對應(yīng)的SQL語句如下:

          Select * from user where name = 'qihoo' order by #{id} desc
          

          但由于發(fā)布時間id不是用戶輸入的參數(shù),無法使用預(yù)編譯。研發(fā)人員將SQL查詢語句修改如下:

          Select * from user where name = 'qihoo' order by ${id} desc
          

          修改之后,程序未通過預(yù)編譯,但是產(chǎn)生了SQL語句拼接問題,極有可能引發(fā)SQL注入漏洞。

          1.5.實(shí)戰(zhàn)案例-OFCMS SQL注入漏洞分析

          本文中使用ofcms進(jìn)行SQL注入漏洞講解,此CMS算是對新手學(xué)習(xí)代碼審計比較友好的CMS。

          上述為安裝成功頁面,如何安裝CMS本章不在贅述。

          后臺頁面:http://localhost:8080/ofcms-admin/admin/index.html

          漏洞點(diǎn):

          ofcms-admin/src/main/java/com/ofsoft/cms/admin/controller/system/SystemGeneratrController.java
          
          create方法
          
          | 
          
          /**
          
          * 創(chuàng)建表
          
          */
          
          public void create() {
          
          try {
          
          String sql = getPara("sql");
          
          Db.update(sql);
          
          rendSuccessJson();
          
          } catch (Exception e) {
          
          e.printStackTrace();
          
          rendFailedJson(ErrorCode.get("9999"), e.getMessage());
          
          }
          
          }
          

          上述代碼中使用getpara獲取sql的參數(shù)值,并update,跟進(jìn)一下getpara和update方法。

          跳轉(zhuǎn)至 jfinal-3.2.jar/com/jfinal/core/controller.class

          public String getPara(String name) {
          
          return this.request.getParameter(name);
          
          }
          

          上述代碼無特殊用意,就是獲取參數(shù)值,繼續(xù)跟進(jìn) Db.update 方法。

          跳轉(zhuǎn)至 jfinal-3.2.jar/com/jfinal/plugin/activerecord/Db.class

          public static int update(String sql) {
          
          return MAIN.update(sql);
          
          }
          

          發(fā)現(xiàn)調(diào)用 MAIN.update , 繼續(xù)跟進(jìn)。

          跳轉(zhuǎn)至 jfinal-3.2.jar/com/jfinal/plugin/activerecord/DbPro.class

          public int update(String sql) {
          
          return this.update(sql, DbKit.NULL_PARA_ARRAY);
          
          }
          

          繼續(xù)跟進(jìn)到最后,發(fā)現(xiàn)華點(diǎn)。

          public int update(String sql, Object... paras) {
          
          Connection conn = null;
          
          int var4;
          
          try {
          
          conn = this.config.getConnection();//連接
          
          var4 = this.update(this.config, conn, sql, paras);//調(diào)用update更新
          
          } catch (Exception var8) {
          
          throw new ActiveRecordException(var8);
          
          } finally {
          
          this.config.close(conn);
          
          }
          
          return var4;
          
          }
          

          重點(diǎn):Object…

          Object是所有類的基類,而 Object… 是不確定方法參數(shù)情況下的一種多態(tài)表現(xiàn)形式(可以傳遞多個參數(shù))。

          再繼續(xù)跟進(jìn) update ,同文件代碼

          int update(Config config, Connection conn, String sql, Object... paras) throws SQLException {
          
          PreparedStatement pst = conn.prepareStatement(sql);
          
          config.dialect.fillStatement(pst, paras);
          
          int result = pst.executeUpdate();
          
          DbKit.close(pst);
          
          return result;
          
          }
          

          上述代碼執(zhí)行SQL語句,并返回結(jié)果。

          至此,整個功能流程結(jié)束,在我們跟進(jìn)的過程中,代碼中無任何過濾語句,獲取參數(shù)值,調(diào)用update方法更新,更新成功后返回結(jié)果。

          漏洞驗(yàn)證

          漏洞點(diǎn)打上斷點(diǎn),網(wǎng)頁中輸入poc進(jìn)行驗(yàn)證

          update of_cms_topic set topic_url=updatexml(1,concat(0x7e,(user())),0) where topic_id = 1
          

          根據(jù)如上截圖可看出我們傳入的SQL語句是被完整的接收,并未做任何過濾直接帶入數(shù)據(jù)庫執(zhí)行,所以此處直接寫入漏洞代碼爆出當(dāng)前數(shù)據(jù)庫賬戶為 root。

          上述為sqlmap工具跑出來的注入點(diǎn)。

          1.6漏洞修復(fù)方法

          添加全局過濾器,過濾特殊字符

          SQLFilter.java中:

          PreparedStatement 參數(shù)化

          如果使用參數(shù)化查詢,則在SQL語句中使用占位符表示需在運(yùn)行時確定的參數(shù)值。參數(shù)化查詢使得SQL查詢的語義邏輯被預(yù)先定義,而實(shí)際的查詢參數(shù)值則等到程序運(yùn)行時再確定。參數(shù)化查詢使得數(shù)據(jù)庫能夠區(qū)分SQL語句中語義邏輯和數(shù)據(jù)參數(shù),以確保用戶輸入無法改變預(yù)期的SQL查詢語義邏輯。

          在Java中,可以使用java.sql.PreparedStatement來對數(shù)據(jù)庫發(fā)起參數(shù)化查詢。在這個正確示例中,如果一個攻擊者將itemName輸入為name’ OR ‘a(chǎn)’ = ‘a(chǎn),這個參數(shù)化查詢將免受攻擊,而是會查找一個itemName匹配name’ OR ‘a(chǎn)’ = 'a這個字符串的條目。

          PreparedStatement stmt = null
          
          ResultSet rs = null
          
          try
          
          {
          
          String userName = ctx.getAuthenticatedUserName(); //this is a constant
          
          String itemName = request.getParameter("itemName");
          
          // ...Ensure that the length of userName and itemName is legitimate
          
          // ...
          
          String sqlString = "SELECT * FROM t_item WHERE owner=? AND itemName=?";
          
          stmt = connection.prepareStatement(sqlString);
          
          stmt.setString(1, userName);
          
          stmt.setString(2, itemName);
          
          rs = stmt.executeQuery();
          
          // ... result set handling
          
          }
          
          catch (SQLException se)
          
          {
          
          // ... logging and error handling
          
          }
          

          存儲過程參數(shù)化

          這個存儲過程使用參數(shù)化查詢,而未包含不安全的動態(tài)SQL構(gòu)建。數(shù)據(jù)庫編譯此存儲過程時,會生成一個SELECT查詢的執(zhí)行計劃,只允許原始的SQL語義被執(zhí)行。任何參數(shù)值,即使是被注入的SQL語句也不會被執(zhí)行,因?yàn)樗鼈儾皇菆?zhí)行計劃的一部分。

          CallableStatement = null
          
          ResultSet results = null;
          
          try
          
          {
          
          String userName = ctx.getAuthenticatedUserName(); //this is a constant
          
          String itemName = request.getParameter("itemName");
          
          // ... Ensure that the length of userName and itemName is legitimate
          
          // ...
          
          cs = connection.prepareCall("{call sp_queryItem(?,?)}");
          
          cs.setString(1, userName);
          
          cs.setString(2, itemName);
          
          results = cs.executeQuery();
          
          // ... result set handling
          
          }
          
          catch (SQLException se)
          
          {
          
          // ... logging and error handling
          
          }
          

          Hibernate 參數(shù)化查詢

          Hibernate支持SQL/HQL參數(shù)化查詢。為了防止SQL注入以及改善性能,以上這些示例使用了參數(shù)化綁定 的方式來設(shè)置查詢參數(shù)。

          String userName = ctx.getAuthenticatedUserName(); //this is a constant
          
          String itemName = request.getParameter("itemName");
          
          Query hqlQuery = session.createQuery("from Item as item where item.owner = ? and item.itemName = ?");
          
          hqlQuery.setString(1, userName);
          
          hqlQuery.setString(2, itemName);
          
          List<Item> rs = (List<Item>) hqlQuery.list();
          

          HQL基于名稱的參數(shù)化查詢

          String userName = ctx.getAuthenticatedUserName(); //this is a constant
          
          String itemName = request.getParameter("itemName");
          
          Query hqlQuery = session.createQuery("from Item as item where item.owner = :owner and item.itemName = :itemName");
          
          hqlQuery.setString("owner", userName);
          
          hqlQuery.setString("itemName", itemName);
          
          List<Item> rs = (List<Item>) hqlQuery.list();
          

          原生參數(shù)化查詢

          String userName = ctx.getAuthenticatedUserName(); //this is a constant
          
          String itemName = request.getParameter("itemName");
          
          Query sqlQuery = session.createSQLQuery("select * from t_item where owner = ? and itemName = ?");
          
          sqlQuery.setString(0, owner);
          
          sqlQuery.setString(1, itemName);
          
          List<Item> rs = (List<Item>) sqlQuery.list();
          

          MyBatis框架的修復(fù)方案

          盡量使用#描述參數(shù),如果一定要使用$,則需要自己過濾用戶輸入

          模糊查詢like SQL注入修復(fù)建議

          按照新聞標(biāo)題對新聞進(jìn)行模糊查詢,可將SQL查詢語句設(shè)計如下:

          select * from news where name like concat(‘%’,#{name }, ‘%’)
          

          采用預(yù)編譯機(jī)制,避免了SQL語句拼接的問題,從根源上防止了SQL注入漏洞的產(chǎn)生。

          in之后的參數(shù)SQL注入修復(fù)建議

          在對新聞進(jìn)行同條件多值查詢的時候,可使用Mybatis自帶循環(huán)指令解決SQL語句動態(tài)拼接的問題:

          select * from news where id in<foreach collection="ids" item="item" open="("separator="," close=")">#{item} </foreach>
          

          order by SQL注入修復(fù)建議

          在Java層面做映射預(yù)編譯機(jī)制只能處理查詢參數(shù),其他地方還需要研發(fā)人員根據(jù)具體情況來解決。如前面提到的排序情景:

          Select * from news where title =‘淘寶’ order by #{time} asc,
          

          這里time不是查詢參數(shù),無法使用預(yù)編譯機(jī)制,只能這樣拼接:

          Select * from news where title =‘淘寶’ order by ${time} asc
          

          針對這種情況研發(fā)人員可以在java層面做映射來進(jìn)行解決。如當(dāng)存在發(fā)布時間time和點(diǎn)擊量click兩種排序選擇時,我們可以限制用戶只能輸入1和2。

          當(dāng)用戶輸入1時,我們在代碼層面將其映射為time,當(dāng)用戶輸入2時,將其映射為click。而當(dāng)用戶輸入1和2之外的其他內(nèi)容時,我們可以將其轉(zhuǎn)換為默認(rèn)排序選擇time(或者click)。


          主站蜘蛛池模板: 亚洲一区二区无码偷拍| 国产aⅴ一区二区三区| 国产一区视频在线| 无码毛片一区二区三区视频免费播放| 3d动漫精品啪啪一区二区免费| 久久精品国产免费一区| 国产一区二区三区乱码| 中文字幕在线一区| 日本一区二区不卡视频| 亚洲AV无码第一区二区三区| 无码人妻久久久一区二区三区| 久久久久99人妻一区二区三区| 99久久综合狠狠综合久久一区| 91久久精品国产免费一区| 一区国产传媒国产精品| 久久中文字幕无码一区二区| 在线精品日韩一区二区三区| 亚洲AV无码一区二区三区国产| 久久精品国产一区二区三区| 久久精品一区二区三区日韩| 蜜臀AV免费一区二区三区| 久热国产精品视频一区二区三区 | 日韩美一区二区三区| 最新中文字幕一区| 国产99精品一区二区三区免费| 香蕉视频一区二区三区| 一区二区三区视频在线观看| 国产精品视频一区二区猎奇| 北岛玲在线一区二区| 国产裸体歌舞一区二区| 极品人妻少妇一区二区三区| 国产一区二区影院| 国产波霸爆乳一区二区| 天堂va在线高清一区| 精品在线一区二区| 久久一区二区三区免费播放| 老熟妇高潮一区二区三区| 精品亚洲一区二区三区在线观看| 无码一区二区三区在线观看| 欧美日韩精品一区二区在线视频| 一区二区手机视频|