Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
國鐵路物資集團有限公司(簡稱中國鐵物)是國務院國資委監管的大型中央企業,是我國規模最大、服務能力最強、專業經驗最豐富、行業領先的鐵路生產性服務綜合提供商。集團公司總部設在北京,在全國及美國、澳大利亞、老撾等國家擁有100多家分支機構。經營業務主要圍繞國內外鐵路運營、裝備制造、建設施工,涉及鐵路油品、軌道、裝備、鐵建、工業、物流、國際及相關多元等領域。
根據公司發展需要,中國鐵物現就以下崗位面向社會進行公開招聘。
招聘崗位及資格條件
(一)招聘部門:集團總部法律合規部
招聘崗位:法律顧問(經理)1人
崗位職責:
1.參與公司重大項目的法律事務,提供法律咨詢與服務;
2.負責集團公司總部工商登記管理和證照管理,辦理分子公司工商批復并監督檢查證照使用管理工作;
3.參與公司訴訟案件管理;
4.審查合同,對公司業務發展中的法律風險進行分析,并提供法律意見和建議;
5.部門綜合事務和其他法律事務。
崗位任職資格:
1.全日制大學本科及以上學歷,法學相關專業;
2.5年以上工作經歷,3年及以上企業法律顧問或律師事務所、法院、檢察院工作經歷;
3.具有法律執業資格或企業法律顧問資格;
4.具備較強的語言表達能力、邏輯能力、分析能力及良好的團隊協作精神;
5.人品正直,作風正派,具有良好的職業素養和抗壓能力,無違規違紀違法等不良記錄;
6.具有良好的心理素質,身體健康,年齡一般不超過35周歲。
(二)招聘部門:集團公司所屬信息中心
招聘崗位:系統管理經理 1人
崗位職責:
1.負責集團數據中心的構架優化、建設和實施工作;
2.負責集團數據中心服務器、數據庫、備份容災系統等基礎設施平臺系統的監控和維護工作;
3.負責集團各部門及分、子公司基礎設施方面運行情況的監督和咨詢支持工作;
4.配合完成數據中心相關網信安全工作;
5.協助完成集團總部辦公網絡維護工作;
6.承辦上級交辦的其他工作。
崗位任職資格:
1.計算機類、軟件類相關專業本科及以上學歷;
2.對集團級數據中心有深入理解,具備信息化基礎設施平臺5年以上實施和運維經驗;
3.熟悉數據庫系統理論知識。熟悉ORACLE數據庫系統,理解ORACLE數據庫體系結構。能規劃并熟練安裝配置和維護多實例ORACLE數據庫系統,熟悉RAC、DG等,熟悉ORACLE備份恢復機制,熟練使用PL/SQL等相關開發運維工具;了解SQL-server、MYSQL數據庫;具有相關產品認證;
4.熟悉PC服務器和小型機服務器產品,熟悉AIX系統的安裝、配置和維護;熟練運用LINUX系統;熟練運用windows server系統;具有shell、python(至少一種)編程能力;熟練搭建、維護ftp、nginx、apache、zabbix等服務及應用能力;
5.熟悉云計算技術和私有云搭建方式,有維護云主機與云數據庫經驗;熟悉1-2種虛擬化管理軟件,具備VMware虛擬化環境的規劃、實施和運維能力;
6.了解SAP系統體系結構,了解SAP系統維護的主要內容,有SAP basis經驗為佳;
7.了解企業數據網絡管理,了解TCP/IP協議及網絡基礎知識。熟悉H3C、Juniper、Cisco、radware、深信服等主流網絡產品的配置和使用。了解網絡安全知識。了解ITIL運維體系;
8.身體健康,年齡一般不超過40周歲。
招聘崗位:系統開發運維經理 1人
崗位職責:
1.負責制定系統開發和集成技術規范;
2.負責自開發系統需求分析、系統設計、代碼編寫與系統運行管理;
3.負責自開發系統代碼庫管理,保證代碼庫及時更新;
4.負責開發文檔、開發外包的管理工作;
5.負責自開發及相關系統的安裝、升級、日常運行監控和培訓工作;
6.承辦上級交辦的其他工作。
崗位任職資格:
1.計算機類、軟件類相關專業本科及以上學歷;
2.6年以上軟件開發經驗,3年以上大型企業級系統架構設計開發經驗,具備獨立設計開發系統能力;
3.熟練使用兩種以上常用開發框架:Spring、JFinal、Hibernate、Mybatis等;
4.熟練使用 JavaScript、Jquery、Html、CSS、AJAX及前端UI工具;
5.熟練使用JAVA開發語言,了解C#、ABAP開發語言及企業開發方法;
6.熟悉GIT、SVN等開發管理工具;
7.熟悉主流數據庫Oracle、SQLServer、MySQL等,精通Oracle數據庫,能熟練使用存儲過程、視圖等;
8.熟悉項目管理理論,熟悉敏捷和CMMI開發模式;
9.最好具備倉儲物流相關業務知識;
10.具有良好的溝通能力及團隊協作精神,責任心強;
11.身體健康,年齡一般不超過40周歲。
(三)招聘單位:中企云商物流(北京)有限公司
招聘崗位:法律顧問1人
崗位職責:
1.負責對公司經營和決策提出法律意見;
2.負責合同評審工作,參加合同的談判和起草;
3.建立公司合規管理體系,開展合規管理工作,對業務過程進行監控,防范經營風險;
4.組織、參與公司規章制度體系建設;
5.處理公司法律糾紛,代理公司仲裁、訴訟、行政復議等工作。
崗位任職資格:
1.全日制大學本科及以上學歷,法學、法律相關專業;
2. 2年及以上工作經歷,具有企業法務管理、律師、法院、檢察院等工作經歷者優先;
3.具備良好的法律基礎和企業法律知識,熟悉國內貿易、物流、供應鏈行業法律規定者優先;
4.具有較強組織協調能力、執行能力和抗壓能力;
5.具有良好的職業道德,較強的責任心和團隊協作精神,無違規違紀違法等不良記錄;
6.具有良好的心理素質,身體健康,年齡一般不超過35周歲。
招聘程序
1.招聘人員錄用工作按照自愿報名、資格審查、筆試、面試、組織考察、決定聘用的程序進行。
2.按照有關規定,對招聘正式聘用人員實行任職試用期。
報名方式、要求及截至時間
報名方式:下載并填寫《公開招聘報名表》(見附件)。
應聘郵件標題格式:“應聘崗位+姓名+現單位及職務”。應聘人員需將本人學歷學位證書、身份證、職稱證書、兩寸彩色照片、相關工作業績證明等材料,掃描件打包一并發送至報名電子郵箱binfei_1981@163.com。
中國鐵物總部及所屬信息中心崗位聯系方式:
電話:010-51899255 報名郵箱:hr@crmsc.com.cn
中企云商物流(北京)有限公司崗位聯系方式:
電話:010-57649387 報名郵箱:binfei_1981@163.com
報名截至時間:2019年7月17日
來源:國務院國有資產監督管理委員會
責任編輯:王迪
“人民旅游”
分享你的游記與攻略,展示你的美景與美食,代你體驗不一樣的風景與風情。
AiJ是一套完整的房間類游戲解決方案,支持無限水平擴展來滿足更大的人數承載,并且提供了良好的調試接口。
主要模塊包括:
SQL注入漏洞可以說是在企業運營中會遇到的最具破壞性的漏洞之一,它也是目前被利用得最多的漏洞。要學會如何防御SQL注入,首先我們要學習它的原理。
針對SQL注入的攻擊行為可描述為通過在用戶可控參數中注入SQL語法,破壞原有SQL結構,達到編寫程序時意料之外結果的攻擊行為。其成因可以歸結為以下兩個原因疊加造成的:
程序編寫者在處理應用程序和數據庫交互時,使用字符串拼接的方式構造SQL語句。未對用戶可控參數進行足夠的過濾便將參數內容拼接進入到SQL語句中。
注入攻擊的本質,是把用戶輸入的數據當做代碼執行。這里有兩個關鍵條件:用戶能夠控制輸入。
原本程序要執行的代碼,拼接了用戶輸入的數據。
手動找的話,可以直接找到sqlmapper.xml文件或者直接搜索 select、update、delete、insert “String sql=”等關鍵詞,定位SQL xml配置文件。
如果 sql 語句中有出現 $ 進行參數拼接,則存在SQL注入風險。
當找到某個變量關鍵詞有 SQL 注入風險時,可以再根據調用鏈找到該存在注入風險的業務邏輯代碼,查看參數來源是否安全、是否有配置SQL危險參數過濾的過濾器,最終確認是否存在SQL注入。以下給出可能造成sql注入攻擊的關鍵字,審計時可根據實際情況進項查找
常見SQL語句關鍵詞
關鍵詞 | 解釋 |
ResultSet | 數據庫結果集的數據表,通常通過執行查詢數據庫的語句生成。 |
executeQuery | 執行查詢 |
select | 數據庫中的查詢關鍵字 |
insert | 數據庫中的插入關鍵字 |
update | 數據庫中的修改關鍵字 |
delete | 數據庫中的刪除關鍵字 |
where | 數據庫中的條件關鍵字 |
union | 數據庫中的聯合查詢關鍵字 |
drop | 數據庫中的刪除數據庫關鍵字 |
create | 數據庫中的創建數據庫關鍵字 |
count | 數據庫中的返回匹配行數關鍵字 |
java.sql.Connection | 與特定數據庫的連接類 |
Statement | 是 Java 執行數據庫操作的重要接口 |
jdbcTemplate | 最基本的Spring JDBC模板 |
PreparedStatement | 預編譯的 SQL 語句的對象 |
queryForInt | 數據庫查詢方法關鍵字 |
queryForObject | 數據庫查詢方法關鍵字 |
queryForMap | 數據庫查詢方法關鍵字 |
getConnection | 獲取sql連接 |
outfile | 數據庫中把表數據導出關鍵字 |
load_file | 數據庫中導入數據的關鍵字 |
【一一幫助安全學習,以下都是免費獲取,文末有領取方式~一一】
①網絡安全學習路線
②20份滲透測試電子書
③安全攻防357頁筆記
④50份安全攻防面試指南
⑤安全紅隊滲透工具包
⑥網絡安全必備書籍
⑦100個漏洞實戰案例
⑧安全大廠內部教程
1 、 攻擊者可以做到
2、可能對業務造成的影響
① 用戶信息被篡改
② 攻擊者偷取代碼和用戶數據惡意獲取
線上代碼被非法篡改,并造成為惡意攻擊者輸送流量或其他利益的影響
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
}
這里將查詢字符串常量與用戶輸入進行拼接來動態構建SQL查詢命令。僅當itemName不包含單引號時,這條查詢語句的行為才會是正確的。如果一個攻擊者以用戶名wiley發起一個請求,并使用以下條目名稱參數進行查詢:
name' OR 'a' = 'a
那么這個查詢將變成:
SELECT * FROM t_item WHERE owner = 'wiley' AND itemname = 'name' OR 'a'='a';
此處,額外的OR ‘a’='a’條件導致整個WHERE子句的值總為真。那么,這個查詢便等價于如下非常簡單的查詢:
SELECT * FROM t_item
這個簡化的查詢使得攻擊者能夠繞過原有的條件限制:這個查詢會返回items表中所有儲存的條目,而不管它們的所有者是誰,而原本應該只返回屬于當前已認證用戶的條目。
在存儲過程中動態構建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
在存儲過程中,通過拼接參數值來構建查詢字符串,和在應用程序代碼中拼接參數一樣,同樣是有SQL注入風險的。
原生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,如果在動態構建SQL/HQL查詢時包含了不可信輸入,同樣也會面臨SQL/HQL注入的問題。
HQL代碼中,session.createQuery使用HQL語句將查詢到的數據存到到list集合中,需要時在拿出來使用。而參數中itemName是通過request.getParameter直接獲取。攻擊者若在此處寫入惡意語句,程序將惡意語句查詢出來的數據存放在list集合中,再通過某處調用成功將數據顯示在前臺。
Mybatis框架下易產生SQL注入漏洞的情況主要分為以下三種:
1)模糊查詢like
例如對人員姓名檢索進行模糊查詢,如果考慮安全編碼規范問題,其對應的SQL語句如下:
Select * from user where name like '%#{name}%'
但由于這樣寫程序會報錯,研發人員將SQL查詢語句修改如下:
Select * from user where name like '%${name}%'
在這種情況下我們發現程序不再報錯,但是此時產生了SQL語句拼接問題,如果java代碼層面沒有對用戶輸入的內容做處理勢必會產生SQL注入漏洞。
2)in之后的參數
例如對人員姓名進行同條件多值檢索的時候,如當用戶輸入001,002,003…時,如果考慮安全編碼規范問題,其對應的SQL語句如下:
Select * from name where id in (#{id})
但由于這樣寫程序會報錯,研發人員將SQL查詢語句修改如下:
Select * from name where id in (${id})
修改SQL語句之后,程序停止報錯,但是卻引入了SQL語句拼接的問題,如果沒有對用戶輸入的內容做過濾,勢必會產生SQL注入漏洞。
3)order by之后(重點和區分點)
當根據姓名、id序號等信息用戶進行排序的時候,如果考慮安全編碼規范問題,其對應的SQL語句如下:
Select * from user where name = 'qihoo' order by #{id} desc
但由于發布時間id不是用戶輸入的參數,無法使用預編譯。研發人員將SQL查詢語句修改如下:
Select * from user where name = 'qihoo' order by ${id} desc
修改之后,程序未通過預編譯,但是產生了SQL語句拼接問題,極有可能引發SQL注入漏洞。
本文中使用ofcms進行SQL注入漏洞講解,此CMS算是對新手學習代碼審計比較友好的CMS。
上述為安裝成功頁面,如何安裝CMS本章不在贅述。
后臺頁面:http://localhost:8080/ofcms-admin/admin/index.html
漏洞點:
ofcms-admin/src/main/java/com/ofsoft/cms/admin/controller/system/SystemGeneratrController.java
create方法
|
/**
* 創建表
*/
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的參數值,并update,跟進一下getpara和update方法。
跳轉至 jfinal-3.2.jar/com/jfinal/core/controller.class
public String getPara(String name) {
return this.request.getParameter(name);
}
上述代碼無特殊用意,就是獲取參數值,繼續跟進 Db.update 方法。
跳轉至 jfinal-3.2.jar/com/jfinal/plugin/activerecord/Db.class
public static int update(String sql) {
return MAIN.update(sql);
}
發現調用 MAIN.update , 繼續跟進。
跳轉至 jfinal-3.2.jar/com/jfinal/plugin/activerecord/DbPro.class
public int update(String sql) {
return this.update(sql, DbKit.NULL_PARA_ARRAY);
}
繼續跟進到最后,發現華點。
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);//調用update更新
} catch (Exception var8) {
throw new ActiveRecordException(var8);
} finally {
this.config.close(conn);
}
return var4;
}
重點:Object…
Object是所有類的基類,而 Object… 是不確定方法參數情況下的一種多態表現形式(可以傳遞多個參數)。
再繼續跟進 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;
}
上述代碼執行SQL語句,并返回結果。
至此,整個功能流程結束,在我們跟進的過程中,代碼中無任何過濾語句,獲取參數值,調用update方法更新,更新成功后返回結果。
漏洞點打上斷點,網頁中輸入poc進行驗證
update of_cms_topic set topic_url=updatexml(1,concat(0x7e,(user())),0) where topic_id = 1
根據如上截圖可看出我們傳入的SQL語句是被完整的接收,并未做任何過濾直接帶入數據庫執行,所以此處直接寫入漏洞代碼爆出當前數據庫賬戶為 root。
上述為sqlmap工具跑出來的注入點。
SQLFilter.java中:
如果使用參數化查詢,則在SQL語句中使用占位符表示需在運行時確定的參數值。參數化查詢使得SQL查詢的語義邏輯被預先定義,而實際的查詢參數值則等到程序運行時再確定。參數化查詢使得數據庫能夠區分SQL語句中語義邏輯和數據參數,以確保用戶輸入無法改變預期的SQL查詢語義邏輯。
在Java中,可以使用java.sql.PreparedStatement來對數據庫發起參數化查詢。在這個正確示例中,如果一個攻擊者將itemName輸入為name’ OR ‘a’ = ‘a,這個參數化查詢將免受攻擊,而是會查找一個itemName匹配name’ OR ‘a’ = '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
}
這個存儲過程使用參數化查詢,而未包含不安全的動態SQL構建。數據庫編譯此存儲過程時,會生成一個SELECT查詢的執行計劃,只允許原始的SQL語義被執行。任何參數值,即使是被注入的SQL語句也不會被執行,因為它們不是執行計劃的一部分。
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支持SQL/HQL參數化查詢。為了防止SQL注入以及改善性能,以上這些示例使用了參數化綁定 的方式來設置查詢參數。
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基于名稱的參數化查詢
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();
原生參數化查詢
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();
盡量使用#描述參數,如果一定要使用$,則需要自己過濾用戶輸入
模糊查詢like SQL注入修復建議
按照新聞標題對新聞進行模糊查詢,可將SQL查詢語句設計如下:
select * from news where name like concat(‘%’,#{name }, ‘%’)
采用預編譯機制,避免了SQL語句拼接的問題,從根源上防止了SQL注入漏洞的產生。
in之后的參數SQL注入修復建議
在對新聞進行同條件多值查詢的時候,可使用Mybatis自帶循環指令解決SQL語句動態拼接的問題:
select * from news where id in<foreach collection="ids" item="item" open="("separator="," close=")">#{item} </foreach>
order by SQL注入修復建議
在Java層面做映射預編譯機制只能處理查詢參數,其他地方還需要研發人員根據具體情況來解決。如前面提到的排序情景:
Select * from news where title =‘淘寶’ order by #{time} asc,
這里time不是查詢參數,無法使用預編譯機制,只能這樣拼接:
Select * from news where title =‘淘寶’ order by ${time} asc
針對這種情況研發人員可以在java層面做映射來進行解決。如當存在發布時間time和點擊量click兩種排序選擇時,我們可以限制用戶只能輸入1和2。
當用戶輸入1時,我們在代碼層面將其映射為time,當用戶輸入2時,將其映射為click。而當用戶輸入1和2之外的其他內容時,我們可以將其轉換為默認排序選擇time(或者click)。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。