资讯专栏INFORMATION COLUMN

[理论-学习]Web安全原理剖析-01

CarlBenjamin / 2123人阅读

摘要:数据库名的字段名为。例如表示取出第一条记录开始,取出条记录。第二步引用恶意数据开发者默认存入数据库的数据都是安全的,在进行查询时,直接从数据库中取出恶意数据,没有进行进一步的检验的处理。注入攻击输入的参数转为编码进行攻击。

声明:

由于笔者能力有限,难免出现各种错误和漏洞。全文仅作为个人笔记,仅供参考。

笔记内容来源于各类网课、书籍。

本章节内容来源:《Web安全攻防渗透测试实战指南》

一、思维导图

二、SQL注入

1. SQL注入基础

1.1 SQL注入介绍

SQL注入指的是:Web应用程序对用户输入的数据的合法性没有判断,前端传入后端的参数是攻击者可控的,并且参数带入数据库执行,攻击者可以通过构造不同SQL语句来实现对数据库的任意操作

例如后端的PHP代码如下:

$query = "select * from users where id = $_GET["id"]"

由于这里的参数可控,并且带入数据库执行,所有攻击者可以构建SQL语句进行攻击。

例如将id=1 or 1 --+,PHP的查询语句变成:

select * from users where id = 1 or 1 --

就会打印所有users的数据。

1.2 SQL注入原理

SQL注入发生需要两个条件:

  • 参数用户可控:用户可以控制前端传到后端的参数值
  • 参数带入数据库执行:传入的参数拼接到SQL语句,并在带入数据库中执行

参数满足上述条件,攻击者便可以开始测试有无注入漏洞。如果后端对前端传入的参数没有过滤,后端的SQL语句就可能发生注入。

一般的后端SQL语句类型的条件语句(where条件)可分为数字型和字符型(单引号闭合,双引号闭合),常见如下:

where id=1where id="1"where id="1"where id=(1)where id=("1")where id=("1")where id=(("1"))where id=(("1"))where id=((("1")))where id=((("1")))...

如果后端没有过滤参数,我们使用"、"和注释符(--+、#、%23)来判断有无注入点。 

  • 在数字型后添加"和"都会报错,添加注释符(--+、#、%23)不会报错
  • 在字符型中单引号闭合后添加"不会报错,添加"和注释符会报错
  • 在字符型中双引号闭合后添加"不会报错,添加"和注释符会报错

先判断是数字型还是字符型(闭合符号)在判断外部有无括号和括号数量。之后构建特殊SQL语句进行注入。

1.3 与MySQL注入有关的知识

(1). 在MySQL5.0以后,MySQL默认在数据库中存放一个"information_schema"的数据库。

在该库中存储着所有的数据库信息(数据库名,表名,字段名和相关属性)。其中有三个表尤其重要:schemata,tables,columns。

  • schemata中记录了用户创建的所有数据库名和信息。数据库名的字段名为schema_name
  • tables中记录了用户创建的所有表名和信息。数据库名、表名的字段名分为table_schematable_name
  • columns中记录了用户创建的所有字段名和信息。数据库名、表名、字段名的字段名分为table_schematable_namecolumn_name

(2) MySQL的查询语句,可以使用条件,也可以不使用条件

  • 不使用条件:select colum_name ... from database_name.table_name
  • 使用条件:select column_name ... from database_name.table_name where 条件 [and/or 条件]

(3) Limit的用法

limit格式为Limit m,n,m表示起始位置(从0开始,区别substr从1开始),n表示取几条记录。

例如limit 0,1 表示取出第一条记录开始,取出1条记录。

limit可在SQL注入中用于限制输出的数据数量,在报错注入中,输出的字符有限(受相应的变量控制),我们使用limit控制输出数量,最终全部获取。

(4) 几个函数和系统变量

  • database():当前使用的数据库
  • user():当前登陆的MySQL用户
  • version()/@@version:当前数据的版本

(5) 注释符

  • #
  • --(空格/TAB/换行)
  • /**/

在SQL注入中,可以使用--+,+会被php解释为空格;%23是#的URL编码

(6) 内联注释

内联注释形式为:/*!  code  */其中的代码会被作为SQL语句执行

 在SQL注入中,可用于绕过过滤。

1.4 Union注入攻击

适用条件:

  • 传入的参数使SQL语句报错(或传入参数的值不在范围内),页面返回数据异常(为空等)
  • 对于关键词:union,select,from,order by没有过滤,或可以绕过。

传入参数的值不在范围内:例如user的id从0开始递增,我们取id=-1。

步骤:

测试参数名假定为id。

  1. id可以控制页面:id为不同值,页面返回不同的数据
  2. id可以让SQL语句报错:页面返回数据异常(可能会爆出后台SQL语句)
  3. 可以执行id里面的SQL语句:id=-1 or 1,返回正常的数据,就是执行了or 1的这个语句
  4. 使用order by进行字段数判断:从1开始,依次二分法。
  5. 使用union select确定数据回显位置:一般在页面上,有的在会在img,a等标签的url中。
  6. 使用union select进行数据获取。

存在风险的代码举例:

1.5 Boolean注入攻击

适用条件:

  • 构造报错SQL语句和不在范围内的参数值,页面只会显示两种状态(正常,不正常)
  • 对于关键词:substr,ascii,ord,select,form,limit参数没有过滤,或者可以绕过
  • 过滤了union

可以使用Boolean注入攻击的显著特征就是:页面根据用户的参数输入,只用两种状态

一般使用BurpSuite和编写脚本爆破最便捷。

步骤:

测试参数名假定为id。

  1. id可以控制页面:id为不同值,页面返回不同的数据(页面状态A)
  2. id可以让SQL语句报错:页面返回数据异常(页面状态B)
  3. id = -1 or substr( dataabse() , 1, 1) ="a" --+ 或 id = -1 or ascii(substr( dataabse() , 1, 1) )>-0--+ 等进行爆破出数据库名。根据页面显示状态判断,由于-1为假,只用or后为真,才会返回正确的页面(页面状态A)。
  4. 同理使用d = -1 or substr( (select table_name from information_schema.tables wehere table_schema = database() limit $0$,1) , $1$, 1) = 101  --+ 在$0$和$1$进行递增爆破,即可爆破出表名

 存在风险的代码举例:

1.6 报错注入攻击

适用条件:

  • 构造报错SQL语句,也会将报错信息显示(也可能不显示)
  • 让函数报错是,页面一定会显示报错信息。例如updatexml中的参数应符合xpath语法,我们构造的参数让updatexml报错,页面把updatexml的报错信息显示。
  • 对于关键词:concat,cancat_ws,gourp_concat,updatexml,extractvalue参数没有过滤,或者可以绕过

报错注入主要是利用函数报错,将我们需要的信息同时爆处理,但是输出的信息长度受限,需要配合limit进行控制

  1. id可以控制页面:id为不同值,页面返回不同的数据。
  2. 参数中使用报错函数updatexml或extractvalue进行报错,错误可以显示在页面。
  3. 使用id=-1 or (select ( updatexml(1,   concat(0x7e, version())  ,1) ) ) --+爆出数据库版本。
  4. 使用id=-1 or (select ( updatexml(1,   concat(0x7e,  (select table_name from information_schema.tables where table_schema=database() limit $1$,1)  )  ,1) ) ) --+ 在$1$处进行递增,即可爆破出全部表名。

 存在风险的代码举例:

2. SQL注入进阶

2.1 时间注入攻击

与布尔盲注类型,但是是由于对用用户的参数输入只有一种显示状态,不存在显示异常情况。

我们需要结合函数sleep和if(expr1,expr2,expr3)进行攻击。

在if中如果,expr1为TRUE,则if返回expr2,否则返回expr3。

例如使用:

if(lenght(database()) >1 ,sleep(5) ,1)

表示如果数据库名长度大于1,查询休眠5秒,反应在页面中就是,请求的返回的时间大于5秒(在F12,网络面板可看到)。

使用如下:

if(substr(database(),1,1) ="s", sleep(5), 1)

判断数据库名第一个字符是否是s,如果是页面返回时间大于5s。

后面的爆破操作以此类推。

使用自定义写的脚本爆破效果较好。

2.2 堆叠查询注入攻击

后端获取的参数,使用PDO的方式进行数据查询,但仍将参数拼接到查询语句中,导致PDO没有起到预编译效果,程序任然存在SQL注入漏洞。

例如下面的代码:

使用PDO执行SQL语句,可以执行多条语句,不过这样通常不能直接得到注入结果,因为PDO只会返回第一条SQL语句的执行结果,所以在第二条语句中可以用update更新数据或者使用时间盲注获取数据

令id = 1"; select if (ord(substr(user(),1,1) ==114,sleep(3),1); %23时,执行语句为:

select * from users where id = "1"; select if (ord(substr(user(),1,1)) =114,sleep(3),1); # 

通过后面的时间盲注语句爆出数据。

2.3 二次注入攻击

二次注入可以理解为,攻击者构造的恶意数据存储在数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入。防御者可能在用户输入恶意数据时对其中的特殊字符进行了转义处理,但在恶意数据插入到数据库时被处理的数据又被还原并存储在数据库中,当Web程序调用存储在数据库中的恶意数据并执行SQL查询时,就发生了SQL二次注入。

二次注入,可以概括为以下两步:

  • 第一步:插入恶意数据
    进行数据库插入数据时,对其中的特殊字符进行了转义处理,在写入数据库的时候又保留了原来的数据。

  • 第二步:引用恶意数据
    开发者默认存入数据库的数据都是安全的,在进行查询时,直接从数据库中取出恶意数据,没有进行进一步的检验的处理。

2.4 宽字节注入攻击

  • 使用GBK编码绕过对单引号的过滤。
  • 使用嵌套查询绕过对select中where的条件中单引号过滤。

2.5 cookie注入攻击

注入点在cookie处。

2.6 base64注入攻击

输入的参数转为base64编码进行攻击。

2.7 XFF注入攻击

注入点在X-Forwarded-For处。

3. SQL绕过技巧

3.1 大小写绕过

例如将and,写成AnD,anD,aNd等形式绕过。

3.2 双写绕过

例如将union,写成uniunionon,ununionion等形式。

3.3 编码绕过

对参数进行一次或多次的URL编码。

3.4 内联注释绕过

使用内联注释绕过。例如and写成 /*! and*/。

4. SQL注入修复建议

4.1 过滤危险字符。

采用正则过滤union,sleep,load_file等关键词。

4.2 使用预编译语句

使用PDO预编译语句,不能将变量直接拼接到PDO语句中,而是使用占位符进行数据库的增加、删除、修改、查询。

附:

文中的风险代码举例来源于《Web安全攻防渗透测试实战指南》第四章

二次注入介绍来源:

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/119747.html

相关文章

  • 2017文章总结

    摘要:欢迎来我的个人站点性能优化其他优化浏览器关键渲染路径开启性能优化之旅高性能滚动及页面渲染优化理论写法对压缩率的影响唯快不破应用的个优化步骤进阶鹅厂大神用直出实现网页瞬开缓存网页性能管理详解写给后端程序员的缓存原理介绍年底补课缓存机制优化动 欢迎来我的个人站点 性能优化 其他 优化浏览器关键渲染路径 - 开启性能优化之旅 高性能滚动 scroll 及页面渲染优化 理论 | HTML写法...

    dailybird 评论0 收藏0
  • 2017文章总结

    摘要:欢迎来我的个人站点性能优化其他优化浏览器关键渲染路径开启性能优化之旅高性能滚动及页面渲染优化理论写法对压缩率的影响唯快不破应用的个优化步骤进阶鹅厂大神用直出实现网页瞬开缓存网页性能管理详解写给后端程序员的缓存原理介绍年底补课缓存机制优化动 欢迎来我的个人站点 性能优化 其他 优化浏览器关键渲染路径 - 开启性能优化之旅 高性能滚动 scroll 及页面渲染优化 理论 | HTML写法...

    hellowoody 评论0 收藏0
  • 2017文章总结

    摘要:欢迎来我的个人站点性能优化其他优化浏览器关键渲染路径开启性能优化之旅高性能滚动及页面渲染优化理论写法对压缩率的影响唯快不破应用的个优化步骤进阶鹅厂大神用直出实现网页瞬开缓存网页性能管理详解写给后端程序员的缓存原理介绍年底补课缓存机制优化动 欢迎来我的个人站点 性能优化 其他 优化浏览器关键渲染路径 - 开启性能优化之旅 高性能滚动 scroll 及页面渲染优化 理论 | HTML写法...

    wwolf 评论0 收藏0
  • 【人情事故】做了3年销售一事无成,转行软件测试成功后我就拿了8k!

    摘要:以下为我的真实案例以我真实案例分享,希望给更多决定重新开始的人以鼓励我已经上班很久了,目前在中软做软件测试工程师,月薪,现在回想起来,仍然庆幸我当初的决定。  今天跟大家分享我的故事,或许你也曾像他那样迷茫过。17年软件工程专业专科毕业之后做了3年的销售工作,最后决定还是再次提升专业技能,...

    _Zhao 评论0 收藏0
  • 二十五岁零基础转行做软件测试怎么样?一个过来人的心路历程送给迷茫的你

    摘要:一个软件测试在职老人帮你详细分析一下。在软件测试行业,前两点可以结合起来说,就是大环境和前景以及人才缺口的问题。软件测试属于互联网技术的一个分支,就是经常被提到的行业。你零基础转行嗷,良心奉劝你不要自学。 一个软件测试在职老人帮你详细分析一下。先不说软件测试领域,你想转行的话,得知道这个行...

    AlienZHOU 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<