Java應用程序中的SQL注入

在本文中,我們將討論什么是SQL注入攻擊。 以及它如何影響任何Web應用程序使用后端數據庫。 在這里,我專注于Java Web應用程序。 開放Web應用程序安全項目(OWAP)列出了SQL注入是Web應用程序的主要漏洞攻擊。 黑客將Web請求中的SQL代碼注入Web應用程序并控制了后端數據庫,即使后端數據庫未直接連接到Internet也是如此。 我們將看到如何解決和防止Java Web Application中的SQL注入。

為此,我們需要1個工具。 這些工具是完全開源的。 SQL Map – SqlMap是一種開源滲透測試工具,可自動執行檢測和利用SQL Injection的過程。 我們可以從這里得到。

SQL注入

SQL注入是通過Web應用程序提取數據庫信息的技術。
場景:

我們有一臺數據庫服務器[MySQL]和Web應用程序服務器[Tomcat]。 考慮數據庫服務器未連接到Internet。 但它與應用程序服務器連接。 現在我們將看到使用Web應用程序如何使用sql-injection方法提取信息。

在查看sql注入之前,我們創建了小型Web應用程序。 它包含單個jsp頁面,像這樣

<form action='userCheck'><input type='text' name='user' value=''/><input type='submit' value='Submit'/></form>

在userCheck中,Servlet接收用戶輸入字段并連接到數據庫服務器,并根據用戶輸入觸發sql查詢,并接收ResultSet并將其迭代打印到網頁中。
userCheck servlet

protected void processRequest(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType('text/html;charset=UTF-8');PrintWriter out = response.getWriter();try {String user = request.getParameter('user');Connection conn = null;String url = 'jdbc:mysql://192.168.2.128:3306/';String dbName = 'anvayaV2';String driver = 'com.mysql.jdbc.Driver';String userName = 'root';String password = '';try {Class.forName(driver).newInstance();conn = DriverManager.getConnection(url + dbName, userName, password);Statement st = conn.createStatement();String query = 'SELECT * FROM  User where userId='' + user + ''';out.println('Query : ' + query);System.out.printf(query);ResultSet res = st.executeQuery(query);out.println('Results');while (res.next()) {String s = res.getString('username');out.println('\t\t' + s);}conn.close();} catch (Exception e) {e.printStackTrace();}} finally {out.close();}

當我們執行上面的代碼時。 在正常的輸入執行中,如下所示

當我們使用“ ramki”之類的正常值時,請點擊“提交”按鈕,然后像這樣輸出

在正常行為中,它是完全正確的。 當我在輸入框中輸入一些特殊字符或某些sql語句時會發生什么?

當我們單擊提交按鈕時,它將顯示我的表格中的所有行,如下所示

這是我應用程序中的一個重大安全漏洞。 發生了什么……是一種SQL注入。

讓我們看看發生什么了。

當我在輸入框中輸入正常值時,我的servlet接收并替換sql查詢并執行它。

SELECT * FROM User where userId='ramki'

是正確的,我們得到了正確的輸出。

當我放入sdfssd'或'1'='1時會發生什么

SELECT * FROM用戶,其中userId =' sdfssd'或'1'='1 '

它的手段

SELECT * FROM User where userId ='sdfssd' or '1'='1'

像這樣。 因此,我們的查詢已更改。 現在新查詢有2個條件。 第二條件始終為真。 第一個條件可能是正確的,也可能不是。 但是這兩個條件與或邏輯相連。 因此where子句對于所有行始終為true。 結果是它們帶來了表中的所有行。

這稱為盲SQL注入。 如果您想了解更多有關SQL注入的詳細信息,請點擊此處

  • http://www.unixwiz.net/techtips/sql-injection.html
  • http://www.imperva.com/resources/glossary/sql_injection.html
  • http://www.applicure.com/blog/owasp-top-10-2010

現在我們可以直接在輸入框中輸入sql語句

喜歡

ramki'UNION SELECT * FROM mysql.`user` u —

然后

SELECT * FROM User where userId =' ramki'UNION SELECT * FROM MySQL.`user` u — '

然后它的意思

SELECT * FROM User where userId ='ramki' UNION SELECT * FROM mysql.`user` u --'

在這里,他們不會使用*,因為它與第一個表不匹配。 因此,他們找到了多少列,然后將聯合表與第二個表一起使用。他們想要的用戶特定列。 結果,獲取mysql數據庫用戶信息通過我們的Web應用程序公開。

sqlmap

它配備了強大的檢測引擎,針對最終滲透測試儀的眾多細分功能以及從數據庫指紋識別到從數據庫獲取數據的廣泛轉換

在您的系統中安裝sqlmap或使用BackTrack Linux

在這里,我使用了回溯Linux,因為它已經預先安裝了許多應用程序,例如sqlmap。

在回溯中,sqlmap位于/ pentest / web / scanner / sqlmap中

sqlmap命令

檢索所有數據庫

./sqlmap.py -u http://localhost:8080/SQLInject/userCheck?user=ramki --dbs

檢索所有表

./sqlmap.py -u http://localhost:8080/SQLInject/userCheck?user=ramki -D test --tables

從特定表中檢索所有列

./sqlmap.py -u http://localhost:8080/SQLInject/userCheck?user=ramki -D test -T User --columns

轉儲特定表中所有值的列

./sqlmap.py -u http://localhost:8080/SQLInject/userCheck?user=ramki -D test -T User --dump

轉儲特定表中某些值的列

./sqlmap.py -u http://localhost:8080/SQLInject/userCheck?user=ramki -D test -T User -C userId,password --dump

觀看視頻以獲取完整的演示(高清觀看):

http://www.youtube.com/watch?feature=player_embedded&v=C5PQ86nWMkM

如何防止SQL注入

  • 在替代查詢之前,我們需要進行驗證。 刪除ir可以避免使用特殊字符(如單引號),關鍵字(如select,Union)等。
  • 與占位符一起使用準備好的語句
PreparedStatement  preparedStatement=conn.prepareStatement('SELECT * FROM  usercheck where username=?') ;
preparedStatement.setString(1, user);

setXXX()方法進行所有驗證并轉義特殊字符

現在,如果使用相同的盲注SQL注入

sdfssd'或'1'='1然后

SELECT * FROM User where userId='sdfssd\' or \'1\'=\'1'

在這里,所有特殊字符都被轉義。當我們使用JPA類的ORM工具(例如Hibernate,EclipseLink,TopLink)時,也可能出現sqlinjection。

為了防止SQL注入,我們需要使用NamedQuery代替普通的Query。 因為NamedQuery在內部使用PreparedStement,但是普通查詢在Java中使用norma Stement。

JPA中的普通查詢

String q='SELECT r FROM  User r where r.userId=''+user+''';
Query query=em.createQuery(q);
List users=query.getResultList();

所以不要使用普通查詢,而是使用命名查詢

Query query=em.createNamedQuery('User.findByUserId');
query.setParameter('userId', user);
List users=query.getResultList();


您可以從GitHub (或) Google代碼下載演示代碼

參考:在Ramki Java Blog博客上,請我們的JCG合作伙伴 Rama Krishnan 注意Java應用程序中的SQLInjection 。

翻譯自: https://www.javacodegeeks.com/2012/11/sql-injection-in-java-application.html

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

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

相關文章

【轉】ReactNativeweexDeviceOne對比

React Native出來有一段時間了&#xff0c;國內的weex和deviceone是近期發布的&#xff0c;我可以說從2011年就開始關注快速開發的跨平臺平臺技術了&#xff0c;接觸過phoneGap、數字天堂、appcan等早期的移動中間件技術&#xff0c;也跟朋友也討論過這類的輕量級框架。這些年通…

bluetooth射頻已關閉請打開bluetooth射頻_希杰大功率射頻放大器燒了維修診斷步驟...

如果電阻值過低&#xff0c;說明電源內部存在短路&#xff0c;正常時其阻值應能達到100千歐以上;電容器應能夠充放電&#xff0c;如果損壞&#xff0c;則表現為AC電源線兩端阻值低&#xff0c;呈短路狀態&#xff0c;否則可能是開關管擊穿。然后檢查直流輸出部分脫開負載&#…

java中整數如何表示,在Java中如何在位級別上內部表示整數?

慕瓜9086354Java整數為32位&#xff0c;并且總是帶符號的。這意味著&#xff0c;最高有效位(MSB)用作符號位。用an表示的整數int不過是位的加權和。權重分配如下&#xff1a;Bit# Weight31 -2^3130 2^3029 2^29... ...2 2^21 2^10 …

洛谷-P1160 隊列安排

題目 Problem Description 一個學校里老師要將班上N個同學排成一列&#xff0c;同學被編號為1&#xff5e;N&#xff0c;他采取如下的方法&#xff1a; 1.先將1號同學安排進隊列&#xff0c;這時隊列中只有他一個人&#xff1b; 2.2&#xff5e;N號同學依次入列&#xff0c;編號…

1.HTML小結

HTML 基本文檔 <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>文檔標題</title> </head> <body> 可見文本... </body> </html> <!DOCTYPE html>html文件聲明。charset"UTF-8…

方法參數名稱和Spring

繼續之前的博客文章有關構造函數和方法參數以及Java在運行時不保留參數名稱的情況–先前的文章涉及構造函數不保留參數名稱及其對Spring中的Contructor注入的含義&#xff0c;在此我將介紹更多內容不保留參數名稱的情況對Spring有影響&#xff1a; 1.考慮帶參數的Spring MVC C…

Fragment Or DialogFragment Can not perform this action after onSaveInstanceState

轉載&#xff1a;http://blog.csdn.net/chenshufei2/article/details/48747149 public void show(FragmentManager manager, String tag) {mDismissed false;mShownByMe true;FragmentTransaction ft manager.beginTransaction();ft.add(this, tag);ft.commit(); //注意這里…

php延遲更新,ThinkPHP開發指南-模型-高級模型之延遲更新

導航&#xff1a;上一頁我們經常需要給某些數據表添加一些需要經常更新的統計字段&#xff0c;例如用戶的積分、文件的下載次數等等&#xff0c;而當這些數據更新的頻率比較頻繁的時候&#xff0c;數據庫的壓力也隨之增大不少&#xff0c;我們可以利用高級模型的延遲更新功能緩…

three.js制作3d模型工具_3D打印模型打磨拋光常用工具

對于追求更好模型品質的人來說&#xff0c;對3D打印模型進行后處理工作是必不可少的&#xff0c;而后處理&#xff0c;首要的便是對模型進行打磨、拋光&#xff0c;將不屬于模型的耗材去除&#xff0c;提高表面光潔度。在此工作中&#xff0c;我們需要用到很多工具&#xff0c;…

Linux中文檔去掉windows文本的多余的回車符(^M)

1) 使用sed 去掉windows下的回車符 &#xff08;注意^M 在linux 下寫法 按^M 是回車換行符,輸入方法是按住CTRLv,松開v,按m)sed -i s/^M//g filename 2) 在vim下類似 :%s/^M//g &#xff08;^M輸入方法和上面方法相同&#xff09; 3) 使用dos2unix dos2unix filename 個人覺得第…

為何要清除浮動?如何清除?

原因&#xff1a; 元素設置了float屬性后&#xff0c;就會脫離文檔流&#xff0c;當 包含框 的高度小于 浮動框 的時候&#xff0c;會出現高度塌陷。因此才需要清除浮動&#xff01; 表現如圖&#xff1a;包括框container已經包不住float的圖片了&#xff01; 清除浮動方法&a…

Spring MVC錯誤處理示例

這篇文章描述了在Spring MVC 3中執行錯誤處理的不同技術。該代碼在GitHub上的Spring-MVC-Error-Handling目錄中可用。 它基于帶有注釋的Spring MVC示例。 在Spring 3之前處理異常 在Spring 3之前&#xff0c;使用HandlerExceptionResolvers處理異常。 此接口定義一個方法&…

PLSQL 學習之路(1)創建用戶,表空間,表,數據

1.用SYS用戶登錄PL/SQL SYSXE as SYSDBA 2.創建表空間 create tablespace Mars datafile F:\oracle\Mars.dbf size 500M autoextend on next 100M maxsize unlimited logging extent management local autoallocate segment space management auto; 3.創建用戶 create user Mar…

php數字取反,[轉+自]關于PHP7的新特性(涉及取反和disabled_functions繞過)

PHP7和PHP5上的安全區別preg_replace()不再支持/e修飾符利用\e修飾符執行代碼的后門大家也用了不少了&#xff0c;具體看官方的這段描述:如果設置了這個被棄用的修飾符&#xff0c; preg_replace() 在進行了對替換字符串的 后向引用替換之后, 將替換后的字符串作為php 代碼評估…

如何關閉蘋果手機自動扣費_教你關閉蘋果手機系統的自動更新功能,舊手機還能再用幾年!...

大家都知道&#xff0c;蘋果手機在更新幾個大版本后&#xff0c;手機不是變得非常卡&#xff0c;就是非常的耗電&#xff0c;大大的縮短了手機的使用壽命。所以&#xff0c;許多人都不會選擇更新系統&#xff0c;但是手機只要連上WiFi并且在充電狀態&#xff0c;就會在半夜自動…

meta標簽的常見用法

一、定義和用法 <meta> 標簽始終位于 head 元素中。<meta> 元素可提供有關頁面的元信息&#xff08;meta-information&#xff09;&#xff0c;元數據不會顯示在頁面上&#xff0c;但是對于機器是可讀的。比如針對搜索引擎和更新頻度的描述和關鍵詞。 元數據&…

HttpClient的使用

新引入Hutool-HttpUtil的使用&#xff08;更簡單&#xff0c;更強大&#xff01;&#xff09;&#xff0c;詳見&#xff1a;http://www.cnblogs.com/jiangbei/p/7667858.html 一、概述 1.簡介 根據凡技術必登其官網的原則&#xff08;如果有&#xff09;&#xff0c;我們可以先…

四人幫–代理設計模式

代理是另一種結構設計模式 &#xff0c;可以“代表”另一個對象或“代替”另一個對象以訪問后面的對象。 何時使用此模式&#xff1f; 當我們需要創建一個包裝來覆蓋客戶端的主要對象的復雜性時&#xff0c;將使用代理模式。 有哪些使用場景&#xff1f; 虛擬代理–設想一種…

面試題38_數字在排序數組中出現的次數

題目描寫敘述 統計一個數字在排序數組中出現的次數。解題思路 數組是排序的&#xff0c;所以反復出現的數字是相鄰排列的。 用二分查找算法&#xff0c;找到第一次出現的位置。和 最后一次出現的位置。 推斷第一次出現的位置條件為&#xff1a;當前數字的前一個是否與之相等。若…

Hex hsl 轉換 php,關于 RGB,HEX,HSL 顏色相互轉換

最近一段時間在折騰一個微信在線編輯器的項目&#xff0c;使用 UEditor 進行二次開發。關于 UEditor 的定制&#xff0c;用到的都太粗淺&#xff0c;官方文檔上都能找得到。主題使用的樣式表是 ueditor.css 而不是ueditor.min.css&#xff0c;定制主題要注意這一點。而對整個項…