中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

企業(yè)網(wǎng)站服務器建設方法最好的網(wǎng)站推廣軟件

企業(yè)網(wǎng)站服務器建設方法,最好的網(wǎng)站推廣軟件,網(wǎng)站分頁,簡潔 手機 導航網(wǎng)站模板下載1.1 .Sql 注入攻擊原理 SQL 注入漏洞可以說是在企業(yè)運營中會遇到的最具破壞性的漏洞之一,它也是目前被利用得最多的漏洞。要學會如何防御 SQL 注入,首先我們要學習它的原理。 針對 SQL 注入的攻擊行為可描述為通過在用戶可控參數(shù)中注入 SQL 語法&#x…

1.1 .Sql 注入攻擊原理

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

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

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

1.2 .Sql 審計方法

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

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

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

常見 SQL 語句關鍵詞

【一一幫助安全學習,所有資源一一】①網(wǎng)絡安全學習路線②20 份滲透測試電子書③安全攻防 357 頁筆記④50 份安全攻防面試指南⑤安全紅隊滲透工具包⑥網(wǎng)絡安全必備書籍⑦100 個漏洞實戰(zhàn)案例⑧安全大廠內部教程

1.3Sql 注入漏洞危害

1 、 攻擊者可以做到

  • 業(yè)務運營的所有數(shù)據(jù)被攻擊

  • 對當前數(shù)據(jù)庫用戶擁有的所有表數(shù)據(jù)進行增、刪、改、查等操作

  • 若當前數(shù)據(jù)庫用戶擁有 file_priv 權限,攻擊者可通過植入木馬的方式進一步控制 DB 所在服務器

  • 若當前數(shù)據(jù)庫用戶為高權限用戶,攻擊者甚至可以直接執(zhí)行服務器命令從而通過該漏洞直接威脅整個內網(wǎng)系統(tǒng)

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

① 用戶信息被篡改

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

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

1.4 Sql 注入漏洞代碼示例

Java 代碼動態(tài)構建 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
}

復制代碼

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

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 表中所有儲存的條目,而不管它們的所有者是誰,而原本應該只返回屬于當前已認證用戶的條目。

在存儲過程中動態(tài)構建 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ù)值來構建查詢字符串,和在應用程序代碼中拼接參數(shù)一樣,同樣是有 SQL 注入風險的。

Hibernate 動態(tài)構建 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)構建 SQL/HQL 查詢時包含了不可信輸入,同樣也會面臨 SQL/HQL 注入的問題。

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

Mybatis 注入分析

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

1)模糊查詢 like

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

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

復制代碼

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

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

復制代碼

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

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

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

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

復制代碼

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

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

復制代碼

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

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

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

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

復制代碼

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

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

復制代碼

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

1.5 .實戰(zhàn)案例-OFCMS 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方法
| 
/**
* 創(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,跟進一下 getpara 和 update 方法。

跳轉至 jfinal-3.2.jar/com/jfinal/core/controller.class

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

復制代碼

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

跳轉至 jfinal-3.2.jar/com/jfinal/plugin/activerecord/Db.class

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

復制代碼

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

跳轉至 jfinal-3.2.jar/com/jfinal/plugin/activerecord/DbPro.class

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

復制代碼

繼續(xù)跟進到最后,發(fā)現(xià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);//調用update更新
} catch (Exception var8) {
throw new ActiveRecordException(var8);
} finally {
this.config.close(conn);
}
return var4;
}

復制代碼

重點:Object...

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

再繼續(xù)跟進 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 語句,并返回結果。

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

漏洞驗證

漏洞點打上斷點,網(wǎng)頁中輸入 poc 進行驗證

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

復制代碼

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

上述為 sqlmap 工具跑出來的注入點。

1.6 漏洞修復方法

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

SQLFilter.java 中:

PreparedStatement 參數(shù)化

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

在 Java 中,可以使用 java.sql.PreparedStatement 來對數(shù)據(jù)庫發(fā)起參數(shù)化查詢。在這個正確示例中,如果一個攻擊者將 itemName 輸入為 name' OR 'a' = 'a,這個參數(shù)化查詢將免受攻擊,而是會查找一個 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
}

復制代碼

存儲過程參數(shù)化

這個存儲過程使用參數(shù)化查詢,而未包含不安全的動態(tài) SQL 構建。數(shù)據(jù)庫編譯此存儲過程時,會生成一個 SELECT 查詢的執(zhí)行計劃,只允許原始的 SQL 語義被執(zhí)行。任何參數(shù)值,即使是被注入的 SQL 語句也不會被執(zhí)行,因為它們不是執(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ù)。

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 框架的修復方案

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

模糊查詢 like SQL 注入修復建議

按照新聞標題對新聞進行模糊查詢,可將 SQL 查詢語句設計如下:

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

復制代碼

采用預編譯機制,避免了 SQL 語句拼接的問題,從根源上防止了 SQL 注入漏洞的產生。

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

在對新聞進行同條件多值查詢的時候,可使用 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 注入修復建議

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

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

復制代碼

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

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

復制代碼

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

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

?

http://www.risenshineclean.com/news/53978.html

相關文章:

  • 網(wǎng)站制作網(wǎng)址網(wǎng)絡推廣方法怎么做
  • 南京網(wǎng)站建設公司 w搜索引擎優(yōu)化專員
  • 國外網(wǎng)站做色情主播app拉新推廣接單平臺
  • 福州綜合網(wǎng)站建設慧生活798app下載
  • 金華網(wǎng)站建設哪里好百度權重域名
  • 公司網(wǎng)站建設怎么計費網(wǎng)絡推廣員工作好做嗎
  • alexa排名全球前50網(wǎng)站排名優(yōu)化方案
  • 交河做網(wǎng)站價格windows優(yōu)化大師可靠嗎
  • 如何承接設計網(wǎng)站建設傳媒網(wǎng)站
  • 諸城做網(wǎng)站的公司php視頻轉碼
  • 在線直播網(wǎng)站怎么做人民網(wǎng)輿情數(shù)據(jù)中心官網(wǎng)
  • 國外大型網(wǎng)站曹操seo博客
  • 酒泉做網(wǎng)站網(wǎng)站目錄結構
  • 門戶網(wǎng)站建設工作方案在線優(yōu)化seo
  • 深圳市建設科技促進中心網(wǎng)站網(wǎng)絡優(yōu)化網(wǎng)站
  • 做網(wǎng)站的例子設計網(wǎng)站官網(wǎng)
  • 佛山門戶網(wǎng)站建設廣告優(yōu)化師怎么學
  • 做日語字幕的網(wǎng)站杭州關鍵詞排名系統(tǒng)
  • 做vi的網(wǎng)站廣告門
  • 廣告設計圖片 門頭windows優(yōu)化大師有用嗎
  • 零度業(yè)務網(wǎng)站seo學校培訓班
  • 自己做網(wǎng)站要買域名嗎谷歌seo網(wǎng)站推廣怎么做
  • 網(wǎng)站用微信登錄 要怎么做東莞網(wǎng)站優(yōu)化關鍵詞排名
  • 鄭州企業(yè)網(wǎng)站開發(fā)信陽seo推廣
  • 南寧網(wǎng)站設計推廣在線網(wǎng)頁服務器
  • 正能量網(wǎng)站推薦免費下載名詞解釋seo
  • 網(wǎng)站做的圖上傳后字變得很模糊win7一鍵優(yōu)化工具
  • 上海成品網(wǎng)站google推廣一年的費用
  • 沈營商環(huán)境建設監(jiān)督局網(wǎng)站網(wǎng)站開發(fā)的公司
  • 移動網(wǎng)站設計方案好的競價推廣托管