今天我們便要開始正式打Webgoat了! 至於為什麼不從A1開始 而是從A3...... 老實說單純就是因為看到injection這個詞 感覺注入很酷就從這裡開始了
今天我們會從前四題手打題開始,畢竟想要能夠讓資料庫照你想像的方式工作 就必須要先學習命令他的方法
SQL全名為Structured Query Language,是在1980年代制定的標準電腦語言,用於管理關聯式資料庫中的資料並進行操作,本身是以直欄(COLUMN)以及橫列(ROW)結合成的表格進行儲存,對於表格內資料的型態有嚴格的要求
以下是Webgoat自帶的SQL資料庫示意圖

SQL中的指令主要能分5大類
顧名思義,用於查詢資料用的語言,某些教材會將他歸類在DML中,但有些則是像這樣分一大類出來給他,原因是雖然感覺有對資料進行操作,但是實際上不會對資料進行任何改動,SELECT(查詢)被單獨分在了這一類,同時也是資料庫中大部分時間最常用的語言
SELECT [資料所在的直欄] FROM [表格名稱] WHERE [條件];--查詢在資料表格中符合條件的某直欄
用於對於資料庫中存有的資料進行變更,指令有INSERT(新增),UPDATE(更新),DELETE(刪除),操作的基本上都是橫列
INSERT INTO [表格名][橫列1,橫列2,橫列3...] VALUES [資料1,資料2,資料3...];--在表格內輸入新的一組資料
UPDATE [表格名] SET [列名]=[你想要設定的值] WHERE [條件]; --更新表個內某橫列的數值,如果沒有加WHERE則會把整張表的數據都改成一樣的值
DELETE FROM [表格名] WHERE [條件]; --刪除表格內的某一橫列,如果沒有加WHERE則會把整張表的數據都刪除
用於對資料庫本身結構進行修改,指令有CREATE(創造),ALTER(修改結構),DROP(刪除整個表格),操作的基本上都是直欄
CREATE TABLE [表格名]([直欄一名][資料類別], [直欄二名][資料類別],[直欄三名][資料類別]… );--用於創造資料表格
ALTER TABLE [表格名] ADD [直欄名][資料類別]; --在資料表中新增一欄資料
ALTER TABLE [表格名] DROP COLUMN [直欄名]; --在資料表中刪除一欄資料
DROP TABLE [表格名];--刪除整個表格
用來管理使用者的權限,指令有GRANT(給予)和REVOKE(收回)
GRANT [指令名] [表格] TO [使用者名];--給予使用者使用某個指令的權限
REVOKE [指令名] [表格] FROM [使用者名];--收回使用者使用某個指令的權限
用於確保相關聯的資料庫交易中資料的安全與一致性,指令有COMMIT(確認更改),ROLLBACK(回到上次更改)以及SAVEPOINT(設置存檔點),但這次解Webgoat時基本上應該不太會碰到,所以先簡單帶過
BEGIN;
...(執行DML指令)...
COMMIT;--確認修改,永久送入資料庫
BEGIN;
...(執行DML指令)
ROLLBACK;--把剛剛的指令全部撤銷,回復原狀
BEGIN;
...(執行DML指令1)...
SAVEPOINT STEP1;
...(執行DML指令2)...
ROLLBACK TO STEP1;--回退到存檔點STEP1;
COMMIT;--只確認修改並送入從開始到STEP1的內容;


可以看到這題題目是叫我們要從名叫employees的這張表格中找出Bob Franco的department的資料,所以我們要使用SELECT,並由於資料表格中first_name和last_name的資料都有,且沒有人和他有相同的地方,所以都可以使用,這裡用first_name當範例
SELECT department FROM employees WHERE first_name = 'Bob'

雖然說只是開胃小菜,但這題我感覺還是有小重點可以畫,那就是後面包著Bob的單引號(')
在SQL中,除非橫列是特殊名稱(例如SELECT這種和指令名相同的),不然可以省略代表列位的雙引號(")
但字串資料必須被單引號包著('),不然SQL會以為他是某個指令,欄位名或是變數而報錯

這題告訴我們要把employees這張表格中Tobi Barnett的department改成Sales,所以我們要使用DML中的UPDATE
UPDATE employees SET department = 'Sales' WHERE first_name = 'Tobi'

一樣記得,字串一定要包單引號!!!

這一題要我們在employees這張表格中加入叫做phone的新的一個直欄,所以我們要使用DDL中的ALTER,同時由於之前說過SQL對欄位中資料型態有嚴格要求,所以還給了我們varchar(20)
ALTER TABLE employees ADD phone (varchar(20))


這題要我們把grant_rights這張表中的指令權限給到使用者unauthorized_user,所以我們要使用GRANT,這裡用SELECT當範例
GRANT SELECT ON grant_rights TO unauthorized_user

這裡有個小知識,GRANT本身不被算作一種權限而是一種動作,所以沒有GRANT GRANT這種東西,如果要允許別人下放權限的話,後面要加上WITH GRANT OPTION,
然後由於資料庫使用者通常會自動被當成一種識別字(Identifier)識別,所以不需要加'
這樣我們就解完SQL指令相關的四題啦! 明天就要開始正式進入SQL injection了