Web安全攻防 滲透測試實戰指南 學習筆記 (五)
第四章 Web安全原理解析 (一)
(一)SQL注入的原理
1.web應用程序對用戶輸入數據的合法性沒有判斷。
2.參數用戶可控:前端傳給后端的參數內容是用戶可以控制的。
3.參數帶入數據庫查詢:傳入的參數拼接到SQL語句,且帶入數據庫查詢。
舉個栗子:
select * from users where id=1 and 1=1
當1=1為真,且where語句中id也為真,頁面會返回與id=1相同的結果。
當傳入的id參數為and 1=2時,由於1=2為假,所以頁面就會返回與id=1不同的結果。
(這樣就說明,你構造的sql語句是被執行了,由此可以初步判斷id參數存在sql注入漏洞~)
(二)Mysql注入
1.MySQL介紹
Mysql5.0版本以后,mysql默認在數據庫中存放一個“information_schema”的數據庫。
在該庫中,讀者需要記住三個表名,分別是SCHEMATA、TABLES、COLUMNS。
SCHEMATA表存儲該用戶創建的所有數據庫的庫名,該表中記錄數據庫庫名的字段名為SCHEMA_NAME。
TABLES表存儲該用戶創建的所有數據庫的庫名和表名,該表中記錄數據庫庫名和表名的字段名分別為TABLE_SCHEMA和TABLE_NAME。
COLUMNS表存儲該用戶創建的所有數據庫的庫名、表名和字段名,該表中記錄數據庫庫名、表名和字段名的字段名為TABLE_SCHEMA、TABLE_NAME和COLUMN_NAME。
2.Mysql小知識點
database() : 當前網站使用的數據庫
version():當前mysql的版本
user():當前mysql的用戶
3.MySQL查詢語句
(1)在不知道任何條件下,你可以試試:
select 要查詢的字段名 from 庫名.表名
(2)知道一條已知條件時,你可以試試:
select 要查詢的字段名 from 庫名.表名 where 已知條件的字段名=‘已知條件的值’
(多條已知條件的話,使用 and 連接~)
4.limit用法
limit子句可以被用於強制 SELECT 語句返回指定的記錄數。limit 接受一個或兩個數字參數。參數必須是一個整數常量。
如果給定兩個參數,第一個參數指定第一個返回記錄行的偏移量,第二個參數指定返回記錄行的最大數目。初始記錄行的偏移量是 0(而不是 1): 為了與 PostgreSQL 兼容,MySQL 也支持句法: limit # OFFSET #。
舉幾個例子~
mysql> SELECT * FROM table LIMIT 5,10; // 檢索記錄行 6-15
//為了檢索從某一個偏移量到記錄集的結束所有的記錄行,可以指定第二個參數為 -1: mysql> SELECT * FROM table LIMIT 95,-1; // 檢索記錄行 96-last. //如果只給定一個參數,它表示返回最大的記錄行數目: mysql> SELECT * FROM table LIMIT 5; //檢索前 5 個記錄行 //換句話說,LIMIT n 等價於 LIMIT 0,n。
id=-1+union select 1,select table_name from information_schema.tables where table_schema='庫名' limit 0,1 ,3
select column_name from information_schema.columns where table_schema='庫名' and table_name='表名' limit 0,1;

當訪問id=1 union select 1,2,3時,執行的sql語句為:
select * from users where id=1 union select 1,2,3
因此,即可獲取數據庫中的數據~
參考資料:
《Web安全攻防 滲透測試實戰指南》
