天天看點

登陸框select繞過

0x00 原理

  思路來自美團杯2021,本來說出題人已經把select通過正則過濾了,就不該總是往用select進行查詢那方面想-》 select id from users where username='admin' and password='admin'

0x01 繞過方法

  首先我們測出or沒被過濾,and被過濾,||沒被過濾,異或沒被過濾,但是select被過濾了,如果糾結于用盲注,那麼就必須要用到select。

然後題目還過濾了單引号,可以用到之前那篇随筆我提到的方法。通過 username=admin\ 去注釋掉查詢語句中的單引号進行繞過,然後再到密碼欄插入payload。

一開始我采用的payload: username=admin\&password=|| 1=1 通過這種判斷 得到了 頁面的提示 no flag here,但是感覺提示的不是很明白。

之後構造了 username=admin\&password=^(ord(left(database(),1))//regexp//0x67)^1# 得到了資料庫名的第一個字元是g 最後一個字元是p ,然後 測得資料庫有3個字元。

但其實仔細一想這樣不行, 因為 select 根本沒法用,後面如果要查表 或者 查列都必須用到select。 是以必須換種思路。

0x02 技巧

  • 如果是密碼框,而且過濾了if,可通過case when...then...else...end替換

      如果沒過濾的話,猜測密碼列就是 password ,是以可在那構造判斷,原payload是or//if(password//regexp//0x67,1,0) ,因為前面的使用者名是錯的,是以是0,實際上是0 or if(password regexp 0x67,1,0) ,

    語句邏輯為 如果password列中有0x67轉成的字元就傳回1,否則傳回0

    實驗:

    登陸框select繞過

    通過這樣構造 查詢到了比對成功時的id, 但是 這樣的話 不管 是否比對 都有查詢結果,是以頁面可能顯示是一樣的 難以判斷。

    是以我們需要改成延時盲注

    登陸框select繞過

    如果過濾了if 和 逗号 需要改成

    or//case//when//password//regexp//binary//0x67//then//sleep(3)//else//112//end;

    語句邏輯為 如果 密碼比對到了某個十六進制,實際上就是比對到了某個确切的字元 就 休眠3秒,通過這種方式判斷密碼列中的flag,且區分大小寫。

    binary 是為了防止 出現大小寫相同比對

    登陸框select繞過
    登陸框select繞過

    使用了binary時 是區分大小寫的

    反之

    登陸框select繞過
    登陸框select繞過

0x03 本地搭建測試

登陸框select繞過
登陸框select繞過

0x04 參考

  • https://mp.weixin.qq.com/s?__biz=MzIxMDYyNTk3Nw==&mid=2247486861&idx=1&sn=858d0d2291bd013e93a61168d08250d7&chksm=9760f95ba017704d780c29bfe696b251369f1b63bd666d29e99e31522c4bad4cce8fb0985bdb&mpshare=1&scene=23&srcid=0525m1ppqO5TJvLUApdDptsg&sharer_sharetime=1621906679888&sharer_shareid=20feca07eb3065d70e5194c2cdd097b3#rd

red team