JavaSec 之 SQL 注入簡單了解

文章目錄

    • JDBC 注入
      • 語句拼接(Statement)
        • 修復方案
      • 語句拼接(PrepareStatement)
        • 修復方案 預編譯
      • JdbcTemplate
        • 修復方案
    • MyBatis
      • Like 注入
      • Order By 注入
      • In 注入

寒假學了一個月 pwn,真心感覺這玩意太底層學的我生理不適應了,接下來學一段時間 java 安全緩一緩吧。

靶場來源:j3ers3/Hello-Java-Sec: ?? Java Security,安全編碼和代碼審計 (github.com)

bewhale/JavaSec: Java安全 學習記錄 (github.com)

JDBC 注入

語句拼接(Statement)

// 采用Statement方法拼接SQL語句,導致注入產生public String vul1(String id) {Class.forName("com.mysql.cj.jdbc.Driver");Connection conn = DriverManager.getConnection(db_url, db_user, db_pass);Statement stmt = conn.createStatement();// 拼接語句產生SQL注入String sql = "select * from users where id = '" + id + "'";ResultSet rs = stmt.executeQuery(sql);...
}

這就是原始人漏洞了,這邊我們報錯注入。

payload

1' and updatexml(1,concat(0x7e,(SELECT user()),0x7e),1)-- +
修復方案
// 采用黑名單過濾危險字符,同時也容易誤傷(次方案)public static boolean checkSql(String content) {String[] black_list = {"'", ";", "--", "+", ",", "%", "=", ">", "*", "(", ")", "and", "or", "exec", "insert", "select", "delete", "update", "count", "drop", "chr", "mid", "master", "truncate", "char", "declare"};for (String s : black_list) {if (content.toLowerCase().contains(s)) {return true;}}return false;
}

語句拼接(PrepareStatement)

// PrepareStatement會對SQL語句進行預編譯,但如果直接采取拼接的方式構造SQL,此時進行預編譯也無用。public String vul2(String id) {Class.forName("com.mysql.cj.jdbc.Driver");Connection conn = DriverManager.getConnection(db_url, db_user, db_pass);String sql = "select * from users where id = " + id;PreparedStatement st = conn.prepareStatement(sql);ResultSet rs = st.executeQuery();
}

雖然是預編譯吧,但是沒用占位符 ?,和字符拼接沒什么區別

payload

id=2 or 1=1
修復方案 預編譯
// 正確的使用PrepareStatement可以有效避免SQL注入,使用?作為占位符,進行參數化查詢public String safe1(String id) {String sql = "select * from users where id = ?";PreparedStatement st = conn.prepareStatement(sql);st.setString(1, id);ResultSet rs = st.executeQuery();
}    

JdbcTemplate

// JDBCTemplate是Spring對JDBC的封裝,如果使用拼接語句便會產生注入public Map<String, Object> vul3(String id) {DriverManagerDataSource dataSource = new DriverManagerDataSource();...JdbcTemplate jdbctemplate = new JdbcTemplate(dataSource);String sql_vul = "select * from users where id = " + id;// 安全語句// String sql_safe = "select * from users where id = ?";return jdbctemplate.queryForMap(sql_vul);
}

化石拼接語句的鍋

修復方案
// ESAPI 是一個免費、開源的、網頁應用程序安全控件庫,它使程序員能夠更容易寫出更低風險的程序
// 官網:https://owasp.org/www-project-enterprise-security-api/public String safe3(String id) {Codec<Character> oracleCodec = new OracleCodec();Statement stmt = conn.createStatement();String sql = "select * from users where id = '" + ESAPI.encoder().encodeForSQL(oracleCodec, id) + "'";ResultSet rs = stmt.executeQuery(sql);
}

MyBatis

Mybatis的SQL語句可以基于注解的方式寫在類方法上面,更多的是以xml的方式寫到xml文件。

Mybatis中SQL語句需要我們自己手動編寫或者用generator自動生成。編寫xml文件時,Mybatis支持兩種參數符號,一種是#,另一種是$。比如:

<select id="queryAll"  resultMap="resultMap">  SELECT * FROM NEWS WHERE ID = #{id}</select>

使用預編譯,$使用拼接 SQL。Mybatis框架下易產生SQL注入漏洞的情況主要分為以下三種:

Like 注入

Mybatis模糊查詢:

Select * from users where username like '%#{username}%'

在這種情況下使用 # 程序會報錯,把 # 號改成 $ 可以解決

但是如果java代碼層面沒有對用戶輸入的內容做處理,那么將會產生SQL注入漏洞。

正確寫法:

Select * from users where username like concat('%',#{username}, '%')

Order By 注入

由于使用 #{} 會將對象轉成字符串(因為預編譯機制,系統將我們輸入的字符當作了一個字符串)根據字符串排序是不生效的

因此很多研發會采用${}來解決,從而造成SQL注入

POC:

id and (updatexml(1,concat(0x7e,(select user())),0))-- -

因此,此種情況下,安全的做法應當在 Java 代碼層面來進行解決。可以設置一個字段值的白名單,僅允許用戶傳入白名單內的字段。

String sort = request.getParameter("sort");
String[] sortWhiteList = {"id", "username", "password"};
if(!Arrays.asList(sortWhiteList).contains(sort)){sort = "id";
} 

In 注入

在 IN 關鍵字之后使用 #{} 查詢多個參數:

<select id="getUser" parameterType="java.lang.String" resultType="user.NewUserDO">select * from user_table where username in (#{usernames})
</select>

in之后多個username查詢時使用 # 同樣會報錯(因為預編譯機制,系統將我們輸入的字符當作了一個字符串,因此查詢結果為空,不能滿足業務功能需求),因此很多研發會采用${}來解決,從而造成SQL注入

select * from user_table where username in (${usernames})

POC:

1,2,3) and (updatexml(1,concat(0x7e,(select user())),0))-- -

此種情況下,安全的做法應當使用 foreach 標簽

<select id="getUserFromList" resultType="user.NewUserDO">select * from user_table where username in<foreach collection="list" item="username" open="(" separator="," close=")">#{username}</foreach>
</select>

總結一下,碰到 jdbc 的 預編譯 + 占位符 或者 mabatis 的預編譯 #{} 就不用深挖了。如果碰到 jdbc 不帶 預編譯占位符 或者 mybatis 拼接字符 ${} 的話,值得 sql 注入一試。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/697830.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/697830.shtml
英文地址,請注明出處:http://en.pswp.cn/news/697830.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

力扣226 翻轉二叉樹 Java版本

文章目錄 題目描述解題思路代碼 題目描述 給你一棵二叉樹的根節點 root &#xff0c;翻轉這棵二叉樹&#xff0c;并返回其根節點。 示例 1&#xff1a; 輸入&#xff1a;root [4,2,7,1,3,6,9] 輸出&#xff1a;[4,7,2,9,6,3,1] 示例 2&#xff1a; 輸入&#xff1a;root…

[云原生] 二進制k8s集群(下)部署高可用master節點

在上一篇文章中&#xff0c;就已經完成了二進制k8s集群部署的搭建&#xff0c;但是單機master并不適用于企業的實際運用&#xff08;因為單機master中&#xff0c;僅僅只有一臺master作為節點服務器的調度指揮&#xff0c;一旦宕機。就意味著整個集群的癱瘓&#xff0c;所以成熟…

代理技術引領出海征程

在數字娛樂的繁榮時代&#xff0c;游戲開發者和發行商們意識到&#xff0c;要在全球市場立足&#xff0c;必須邁向國際化的出海之路。然而&#xff0c;這一旅程面臨著跨越網絡壁壘、適應多元文化和提升全球連接性的巨大挑戰。本文將深入探討代理技術在游戲行業出海過程中的創新…

這才開工沒幾天收到Offer了,簡歷改的好,找工作沒煩惱。

喜報喜報 這才開工沒幾天&#xff0c;就收到了喜報&#xff01; 就像上面截圖中所說的一樣&#xff1a;簡歷改了真的有用。 我也和大家分享一下優化簡歷的技巧&#xff0c;希望對大家有幫助&#xff0c;把握住金三銀四的機會&#xff0c;都能順利上岸&#xff0c;升職加薪&am…

Leetcode日記 2583. 二叉樹中的第 K 大層和

Leetcode日記 2583. 二叉樹中的第 K 大層和 題目&#xff1a;解題思路&#xff1a;代碼實現制作不易&#xff0c;感謝三連&#xff0c;謝謝啦 題目&#xff1a; 給你一棵二叉樹的根節點 root 和一個正整數 k 。 樹中的 層和 是指 同一層 上節點值的總和。 返回樹中第 k 大的層和…

Vue2 基礎面試題

v-show 和 v-if 區別 v-show 通過 CSS display 控制顯示和隱藏v-if 通過判斷組件真實渲染和銷毀&#xff0c;而不是顯示和隱藏頻繁切換顯示狀態用 v-show&#xff0c;否則用 v-if v-if 當 v-if 與 v-for 一起使用時&#xff0c;v-for 具有比 v-if 更高的優先級&#xff0c;意…

PolarDN MISC做題筆記

cat flag 使用01打開flag.png,發現圖片尾部有padding的數據。D0 CF 11 E0 A1 B1 1A E1為office2007以前版本的文件頭。將其另存為flag.doc,打開發現提示需要密碼。&#xff08;可以注意到&#xff1a;D0CF11E0非常類似DOCFILE&#xff09; 使用john的office2john.py 提取hash …

【操作系統】處理機調度算法

實驗3 處理機管理 一、實驗目的 在多道程序或多任務系統中&#xff0c;系統中同時處于就緒態的進程有若干個&#xff0c;即能運行的進程數遠遠大于處理機個數。為了使系統中的各個進程能有條不紊的運行&#xff0c;必須按照某種調度策略&#xff0c;選擇一個進程占用處理機。…

使用puppeteer完成監聽瀏覽器下載文件并保存到自己本地或服務器上完成上傳功能

需求場景 獲取網站點擊的下載pdf&#xff0c;并把pdf重命名再上傳到COS云上面 技術使用 “puppeteer”: “^19.7.2”, “egg”: “^3.15.0”, // 服務期用egg搭的 文件服務使用COS騰訊云 核心思路 獲取瀏覽器下載事件&#xff0c;并把文件保存到本地 const session awai…

Unity3D 框架如何搭建基于純Lua的U框架與開發模式詳解

前言 Unity3D 是一款非常流行的游戲開發引擎&#xff0c;它支持C#、JavaScript和Boo等多種腳本語言。而Lua語言作為一種輕量級的腳本語言&#xff0c;也在游戲開發中得到了廣泛應用。本文將介紹如何在Unity3D框架中搭建基于純Lua的U框架&#xff0c;并詳細講解其開發模式。 對…

MYSQL--存儲過程操作

一&#xff1a;概念&#xff1a; 存儲過程實際上對標了JAVA當中的方法&#xff0c;兩者是相似的&#xff0c;同時需要注意的一點是&#xff0c;MYSQL僅僅在5.0版本之后才出現這種存儲操作的過程&#xff1b; 優點&#xff1a; 1.存儲過程能夠讓運行的速度變得更加迅速&#xff…

SpringBoot指定外部環境配置

nohup java -Xms256m -Xmx512m -Dfile.encodingUTF-8 -jar /usr/local/xxxx.jar --spring.profiles.activeprod > system.log 2>&1 & --spring.profiles.activeprod修改的是多環境配置中內部application.properties里的spring.profiles.active值 -Dspring.config…

ubuntu 查詢流量使用

在Ubuntu系統中&#xff0c;可以使用nethogs命令來查看每個進程的網絡流量使用情況。這個工具可以顯示每個進程的實時網絡流量&#xff0c;從而可以找出使用流量最多的應用。 首先&#xff0c;你需要安裝nethogs。在終端中輸入以下命令&#xff1a; sudo apt install nethogs…

消息隊列MQ 保證消息不丟失(消息可靠性)

文章目錄 概述RabbitMQ 怎么避免消息丟失&#xff08;可靠傳輸&#xff09;RocketMQ 怎么確保消息不丟失Kafka 怎么保證消息不丟失activeMQ 怎么避免消息丟失MQ 宕機了消息是否會丟失線上服務宕機時&#xff0c;如何保證數據100%不丟失嗎&#xff1f;消息隊列消息持久化 概述 …

思偉老友記 | 攜手并進17年 中泰公司的穩步發展和企業傳承

17年攜手并進 合作共贏 2023年是中泰&#xff08;福建&#xff09;混凝土發展有限公司攜手思偉軟件的第17年。在這關鍵的17年間&#xff0c;我們共同經歷了一個行業的興盛發展&#xff0c;也相互見證了彼此的榮耀成長。中泰從泉州惠安洛陽江邊一個簡單的攪拌站&#xff0c;到如…

h-table(表格列表組件的全封裝)

文章目錄 概要h-table的封裝過程查詢組件封裝 h-highForm結果頁右側工具欄封裝RightToolbar結果頁列表組件h-table結果頁vue頁面使用js文件有需要的請私信博主&#xff0c;還請麻煩給個關注&#xff0c;博主不定期更新組件封裝&#xff0c;或許能夠有所幫助&#xff01;&#x…

如何做代幣分析:以 SOL 幣為例

作者&#xff1a;lesleyfootprint.network 編譯&#xff1a;cicifootprint.network 數據源&#xff1a;Solana Token Dashboard &#xff08;僅包括以太坊數據&#xff09; 在加密貨幣和數字資產領域&#xff0c;代幣分析起著至關重要的作用。代幣分析指的是深入研究與代幣…

springmvc基于springboot 的音樂播放系統 _7sdu8

這就意味著音樂播放系統的設計可以比其他系統更為出色的能力&#xff0c;可以更高效的完成最新的ymj排行榜、ymj音樂資訊等功能。 此系統設計主要采用的是JAVA語言來進行開發&#xff0c;JSP技術、采用SSM框架技術&#xff0c;框架分為三層&#xff0c;分別是控制層Controller&…

Seata的 TCC 模式

目錄 概述 使用 依賴與配置 代碼 概述 TCC 模式是一種侵入式的分布式事務解決方案&#xff0c;它不依賴于數據庫的事務&#xff0c;而是要求開發者自定義完成 預提交、提交、回滾的方法邏輯。因此&#xff0c;它是一個種偏 復雜、靈活、有侵入性 的分布式事務處理方案。 De…

針對Umi、React中遇到的 “xxxx”不能用作 JSX 組件 問題解決方案

一、處理方案 這是因為"types/react"、"types/react-dom"在子依賴中使用的版本不一致導致&#xff0c;一般情況npm會自動幫我們處理版本不一致的問題。如果npm處理不了&#xff0c;就需要我們自己手動處理在package.json中添加一項配置 {name:"test&…