SQL注入與防禦研究(一)

本文持續更新。爲SQL注入攻擊與防禦第二版讀後感

第一章

SQL注入產生過程:

1.字符處理不當

       '作爲分界線。

2.類型處理不當

       數字型,沒加單引號,直接可繼續執行命令。 LOAD_FILE, SELECT INTO OUTFILE

3.查詢語句組裝不當

       $SQL = "SELECT". $_GET["column1"]. ",". $_GET["column2"]. ",".$_GET["column3"]. "FROM". $_GET["table"];

       可直接使用user,password替換,得到數據

4.錯誤處理不當

       SQLserver打印錯誤日誌時對語句進行拼接處理,導致SQL惡意代碼的繼續執行

5.多個提交處理不當

       這個也算是邏輯漏洞,step1檢查了的數據,step2不檢查,如果存在越權等可造成SQL注入。

數據庫配置的不安全之處,主要是權限控制的問題,應該遵守最低權限的原則。

mysql快速查表,可以利用INFORMATION_SCHEMA

SQLserver可以利用INFORMATION_SCHEMA,sysobjects 、 sysindexkeys 、 sysindexes 、 syscolumns 、systypes進行快速查表,SQLserver2005後引入了名爲sys.*的目錄視圖,並限制用戶只能訪問擁有相應訪問權限的對象。所有的 SQL Server 用戶均有權訪問數據庫中的表並可以查看錶中的所有行,而不管用戶是否對錶或所查閱的數據擁有相應的訪問權限。

Oracle則提供了ALL_TABLES 、 ALL_TAB_COLUMNS等進行全局查看。以 DBA_ 開頭的視圖顯示數據庫中的所有對象,但是要有DBA權限纔行。

example:

--Oracle 語句,列舉當前用戶可訪問的所有表
SELECT OWNER, TABLE_NAME FROM ALL_TABLES ORDER BY TABLE_NAME;
--MySQL 語句,列舉當前用戶可訪問的所有表和數據庫
SELECT table_schema, table_name FROM information_schema.tables;
--MSSQL 語句,使用系統表列舉所有可訪問的表
SELECT name FROM sysobjects WHERE xtype = 'U';
-- MSSQL 語句,使用目錄視圖列舉所有可訪問的表
SELECT name FROM sys.tables;

第二章

mysql,Oracle,sqlserver均可使用同 -- 進行單行過濾,/**/用於多行過濾

mysql #用於單行過濾

如何通過連接運算符識別不同數據庫?

sqlserver    'a'+'b'='ab'

mysql 'a' 'b'='ab'

oracle 和 postgresql 則是 'a' || 'b'='ab'

第三章只是簡單涉及到SQL注入的代碼審計,併爲深入講解,此處略過。

第四章

ASP.NET和PHP使用mssql的時候允許堆疊查詢,java使用mssql不允許堆疊查詢,PHP使用mysql不允許堆疊查詢,postgresql則允許。

例如查詢name=acme的值的時候,可以將m替換爲ascii碼,這意味着我們存在了可控數字參數,可以使用char(108+(case when + (system_user='sa') then 1 else 0 end)+'e'),這意味着,如果是sa權限的話,108+1=109,如果不是則是108,由此可以對內容進行猜測。

權限提升

SQLserver

openrowset(通過爆破口令提升權限):

                      1.必須有執行連接的連接憑證,最低權限也可;

                      2.openrowset在遠程或本地調用中均可使用;

                      3.sqlserver2000所有用戶均可調用,2005和2008在默認情況是被禁用的。

                      可以參考:https://blog.csdn.net/daxueba/article/details/70853846

                      可以用如下語句檢查當前SqlServer使用的驗證方式(windows或者是混合型驗證,只有混合型驗證時sa纔會啓用)

                      select serverproperty('IsIntegratedSecurityOnly')

                      當驗證方式是windows時,則會返回1,其他返回0

                      Kali提供的SQL Server數據庫注入工具sqlninja可以進行openrowset爆破。

                      可以用該語句查詢openrowset是否開啓。

                      select value_in_use from sys.configurations where name LIKE 'Ad Hoc%'

Oracle

                      除去我在其它博文提到的oracle提權方式外,仍存在工具可以提權,可參考如下鏈接:

                      https://www.cnblogs.com/rebeyond/p/7928887.html

                      另外使用utl_inaddr.get_host_name是一種有效地報錯注入方法

                      另外還有GET_DOMAIN_INDEX_TABLES函數注入漏洞可以成功提權,詳情可參考:

                      https://www.iswin.org/2015/06/13/hack-oracle/

Mysql

                      這個網上的參考材料就比較多了,kali也有現成的攻擊載荷。可以參考如下文章:

                      https://blog.csdn.net/he_and/article/details/81434865

密碼獲取

Sqlserver

                      sqlserver2000中,密碼存儲在master庫sysxlogins表中,可以直接使用如下語句:

                      select name,password from master.do.sysxlogins;

Mysql

                      select user,password from mysql.user;

Postgresql

                      select usename,passwd from pg_shadow;

                      select rolname,rolpassword from pa_authid;

Oracle

                      select username,password from sys.user$ where type#>0 and length(password)=16

                      oracle DES口令破解最快的工具是 woraauthbf;SHA1最快的是GSAuditor

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章