本文持續更新。爲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