Java应用程序中的SQL注入
在本文中,我們將討論什么是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
當(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ǔ)句
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 支付宝里健康金需要自己注册吗?
- 下一篇: Java SE 11:推动Java向前发