Web安全之手動Sql注入


SQL注入

 SQL注入,旁注,XSS跨站,COOKIE欺騙,DDOS,0day 漏洞,社會工程學 等等等等,只要有數據交互,就會存在被入侵風險!哪怕你把網線拔掉,物理隔絕,我還可以利用傳感器捕捉電磁輻射信號轉換成模擬圖像。你把門鎖上,我就爬窗戶;你把窗戶關上,我就翻院牆;你把院牆加高,我就挖地洞。。。道高一尺魔高一丈,我始終堅信計算機不存在絕對的安全,你攻我防,此消彼長,有時候,魔與道只在一念之間。
    下面,就讓我們一起推開計算機中那另一扇不為人知的門---

sql注入工具sqlmap

http://sqlmap.org/

   (一)了解注入原理
    為什么會存在sql注入呢,只能說SQL出身不好。因為sql作為一種解釋型語言,在運行時是由一個運行時組件解釋語言代碼並執行其中包含的指令的語言。基於這種執行方式,產生了一系列叫做代碼注入(code injection)的漏洞 。它的數據其實是由程序員編寫的代碼和用戶提交的數據共同組成的。程序員在web開發時,沒有過濾敏感字符,綁定變量,導致攻擊者可以通過sql靈活多變的語法,構造精心巧妙的語句,不擇手段,達成目的,或者通過系統報錯,返回對自己有用的信息。
    我們在學JDBC和SQL時,講師跟我們說 Statement不能防止SQL注入, PreparedStatement能夠防止SQL注入. 沒錯, 這句話是沒有問題的, 但到底如何進行SQL注入?怎么直觀的去了解SQL注入?這還是需要花一定的時間去實驗的.預編譯語句java.sql.PreparedStatement ,擴展自 Statement,不但具有 Statement 的所有能力而且具有更強大的功能。不同的是,PreparedStatement 是在創建語句對象的同時給出要執行的sql語句。這樣,sql語句就會被系統進行預編譯,執行的速度會有所增加,尤其是在執行大語句的時候,效果更加理想。而且PreparedStatement中綁定的sql語句是可以帶參數的。

下面是一個項目的實例:

以下更改已應用到原始請求:
已將參數“->"companyId"”的值設置為“5a3a363f972702ad45c9402b%27%3B

推理:
測試結果似乎指示存在脆弱性,因為響應包含 SQL Server 錯誤。這表明測試設法通過注入危險字符穿透了應用程序並到達 SQL 查詢本身

1.准備漏洞web系統,fiddler或其他可以攔截http請求的工具

2.登錄系統,打開fiddler確保可以正常抓包

3.將抓到的網站請求拖到Composer里

4.修改並執行此請求(如在公司id后添加{"companyId":"5a3a363f972702ad45c9402b';","name":)

 

原來的正常請求:

 Sql注入的結果:

 

 另一篇SQL注入,是可以獲取用戶數據的。

https://www.cnblogs.com/pursuitofacm/p/6706961.html

--------------------------------------------

  SQL盲注

首先來簡單介紹一下盲注,盲注是不能通過直接顯示的途徑來獲取數據庫數據的方法。在盲注中,攻擊者根據其返回頁面的不同來判斷信息(可能是頁面內容的不同,也可以是響應時間不同)。一般情況下,盲注可分為三類。

Booleanbase
Timebase
Errorbase

其中第一類Boolean就是我們最常接觸到的普通盲注。

比如在where語句中可以構造or 1=1來使返回頁面不同。(這里用mysql演示一下,大家體會就好)

mysql> select 123 from dual where 1=1;
+-----+
| 123 |
+-----+
| 123 |
+-----+
1 row in set (0.00 sec)
mysql> select 123 from dual where 1=0;
Empty set (0.00 sec)

如果注入點在order by后面,那么則可以使用判斷語句來構造報錯。(其實order by后面的注入也可以根據返回結果的順序來判斷,這里自由發揮就好:P)

mysql> select 1 from te order by if(1,1,(select 1 union select 2)) limit 0,3;
+---+
| 1 |
+---+
| 1 |
| 1 |
| 1 |
+---+
3 rows in set (0.00 sec)
mysql> select 1 from te order by if(0,1,(select 1 union select 2)) limit 0,3;
ERROR 1242 (21000): Subquery returns more than 1 row

基於時間的盲注的話,mysql主要涉及兩個函數,sleep banchmark 基本是使用如下。

mysql> select 1 from te where if(1=1,sleep(1),1) limit 0,1;
Empty set (27.00 sec)
mysql> select 1 from te where if(1=2,sleep(1),1) limit 0,1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)

實例:

 

---------------------

盲注的響應:

 

 

描述: SQL 盲注:字符串並置(MS-SQL 變體)

差異:
以下更改已應用到原始請求:
已將參數“sortProp”的值設置為“%27+%2B+%27%27+%2B+%27lastUpdate”
已將參數“sortProp”的值設置為“%27+%2B+%27+%2B+%27lastUpdate”
已將參數“sortProp”的值設置為“lastUpdate%27+%2B+%27+%2B+%27”
已將參數“sortProp”的值設置為“lastUpdate%27+%2B+%27%27+%2B+%27”

推理:
測試結果似乎指示存在漏洞,因為它顯示可以在參數值后附加的值,這表明它們嵌入在 SQL 查詢中。在該測試中,有 3(有時為 4)個請求已發送。最后一個請求在邏輯上等同於原始請求,而倒數第二個請求則不同。所有其他請求都是為了實現控制目的。最后兩個響應與第一個響應的比較(最后一個響應與第一個響應類似,倒數第二個響應則不同)指示應用程序易受攻擊。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM