Web安全技术 课件 2 SQL注入攻击_第1页
Web安全技术 课件 2 SQL注入攻击_第2页
Web安全技术 课件 2 SQL注入攻击_第3页
Web安全技术 课件 2 SQL注入攻击_第4页
Web安全技术 课件 2 SQL注入攻击_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章SQL注入攻击01SQL注入攻击的原理02SQL注入攻击的分类03SQL注入攻击的流程04常见防护手段及绕过目录CONTENTSSQL注入攻击的原理SQL注入SQL注入攻击的定义

SQL注入攻击是指攻击者通过把恶意SQL命令插入到Web表单的输入域或页面请求的查询字符串中,并且插入的恶意SQL命令会导致原有SQL语句作用发生改变,从而达到欺骗服务器执行恶意的SQL命令的一种攻击方式。

SQL注入攻击已经多年蝉联OWASP高危漏洞的前三名。SQL注入会直接威胁数据的数据安全,因为它可实现任意数据查询,严重时会发生“拖库”的高危行为。更有甚者,如果数据库开启了写权限,攻击者可利用数据库的写功能及特定函数,实现木马自动部署、系统提权等后续攻击。SQL注入攻击的原理SQL注入SQL注入攻击的原理用户发送请求服务器接收请求业务功能拼接SQL语句SQL语句数据库查询结果用户SQL注入的产生原因是用户提交参数的合法性。如果用户提交的数据中,不仅仅包含正常的查询信息,而且在查询信息后面拼接了其他查询语句,恰好服务器没有对用户输入的参数进行有效过滤,那么数据库就会根据用户提交的语句进行查询,返回更多的信息。01SQL注入攻击的原理02SQL注入攻击的分类03SQL注入攻击的流程04常见防护手段及绕过目录CONTENTS工具注入SQL注入SQL注入常见的攻击工具有:“啊D小子”“havji”“SQLmap”“pangolin”等,这些工具用法简单,能提供清晰的UI界面,并自带扫描功能,可自动寻找注入点,自动查表名、列名、字段名,并可直接注入,可查到数据库的信息。其标准注入流程为:查找注入点→查库名→查表名→查字段名→查重点数据手工注入手工注入就是利用攻击者的知识、技术和经验,通过在交互点手工输入命令的方式来完成查找注入点、确定回显位及字段数、注入并获取数据的完整流程。在注入过程中,根据前台的数据是否回显和后台安全配置及防护情况,可以将手工注入又分为:回显注入和盲注。SQL注入SQL注入攻击的分类01SQL注入攻击的原理02SQL注入攻击的分类03SQL注入攻击的流程04常见防护手段及绕过目录CONTENTSSQL注入攻击的流程SQL注入工具注入的流程查找注入点:Sqlmap.py-u“

?id=1”获取数据库:Sqlmap.py-u“

http://?id=1”--current-db(假设得到的数据库名叫db)获取数据库中的表:Sqlmap.py-u“

http://?id=1”-Ddb--tables(假设得到的表名叫tb)获取表中的字段名:Sqlmap.py-u“

http://?id=1”-Ddb-Ttb--columns(假设获得的列名包括a和b)获取表中的数据:Sqlmap.py-u“

http://?id=1”-Ddb-Ttb-Ca,b--dumpSQL注入攻击的流程SQL注入回显手工注入的流程寻找注入点:基本方法是在参数后面加单引号,观察其返回页面的内容。由于添加单引号会导致SQL语句执行错误,因此,若存在SQL注入漏洞,当前页面会报错,或者出现查询内容不显示的情况。SQL注入攻击的流程SQL注入回显手工注入的流程寻找注入点:“1=1”“1=2”测试法此测试法的目的在于发现用户输入的参数是否可影响服务器端的查询。由上述两个测试我们发现输入的查询参数影响了后台的查询,可以改变服务端的查询语句的结构。SQL注入攻击的流程SQL注入回显手工注入的流程寻找注入点:“1=1”“1=2”测试法/index.php?name=‘jack’/index.php?name=‘jack’and‘1’=‘1/index.php?name=‘jack’and‘1’=‘2访问以上三个链接时,产生的情况可能有如下几种:SQL注入攻击的流程SQL注入回显手工注入的流程页面没有变化:说明后台针对此查询点的过滤比较严格,是否存在SQL注入漏洞还需要进行后续测试页面中少了部分内容:如访问前两个链接正常,访问第三个链接有明显的内容缺失,则基本可以确定有漏洞存在。回显错误:如果访问第三个链接后出现数据库报错,可以判定当前查询点存在注入,用标准的回显注入法即可实现SQL注入攻击。跳转到默认界面:如果访问第一个链接正常,第二、三个链接直接跳转到首页或其他默认页面,那么可能是后台有验证逻辑,或者是有在线防护系统或防护软件提供实时保护。可以尝试绕过防护工具的思路。直接关闭链接:如果在访问上述第二、三个链接时出现访问失败,通常为防护工具直接开启在线阻断所致,后续可利用编码、换行等方式尝试绕过(极难成功)。SQL注入攻击的流程SQL注入回显手工注入的流程通过回显位确定字段数:回显位是指数据库查询结果在前端界面中显示出来的位置,也就是查询结果返回的数据库中的哪列。在SQL注入中,一般利用orderby、unionselect等命令来获取回显位的信息业猜测表内容。orderby在SQL语句中的功能是将查询结果按某个字段排序。orderby用在SQL注入中的主要目的是判断当前数据表的列数。如果orderby后接的数值大于当前数据表的列数,则查询语句执行失败,由于页面没有隐藏报错信息,因此报错内容将进行显示。SQL注入攻击的流程SQL注入回显手工注入的流程通过回显位确定字段数:回显位是指数据库查询结果在前端界面中显示出来的位置,也就是查询结果返回的数据库中的哪列。在SQL注入中,一般利用orderby、unionselect等命令来获取回显位的信息业猜测表内容。unionselect在SQL语句中的功能是联合查询,也即执行完union前面的查询后再执行unionselect查询。unionselect在SQL注入中的功能之一就是判断页面显示字段是数据表中的第几个字段,从而控制输出位置。SQL注入攻击的流程SQL注入回显手工注入的流程注入并获取数据:在MySQL5.0之后的版本中,数据库内置了一个库information_schema,用于存储当前数据库中的所有库名、表名等信息。因此,可利用SQL注入方式,通过远程注入查询语句实现读取此数据库,从而获取感兴趣的信息。Information_schema库中对SQL注入有用的表有如下几个:SCHEMATA:存储MySQL中各数据库的相关信息,其中SCHEMA_NAME即为数据库的名字。TABLES:存储所有表的名字,其中TABLE_NAME表示表的名称;TABLE_SCHEMA字段显示该表所属的数据库名字。COLUMNS:存储字段名,其中TABLE_SCHEMA表示表所属的数据库名称;TABLE_NAME表示所属的表的名称;COLUMN_NAME表示字段名。SQL注入攻击的流程SQL注入回显手工注入的流程注入并获取数据:在MySQL5.0之后的版本中,数据库内置了一个库information_schema,用于存储当前数据库中的所有库名、表名等信息。因此,可利用SQL注入方式,通过远程注入查询语句实现读取此数据库,从而获取感兴趣的信息。获得当前数据库的名字:SQL注入攻击的流程SQL注入回显手工注入的流程注入并获取数据:在MySQL5.0之后的版本中,数据库内置了一个库information_schema,用于存储当前数据库中的所有库名、表名等信息。因此,可利用SQL注入方式,通过远程注入查询语句实现读取此数据库,从而获取感兴趣的信息。获得当前数据库的所有表:SQL注入攻击的流程SQL注入回显手工注入的流程注入并获取数据:在MySQL5.0之后的版本中,数据库内置了一个库information_schema,用于存储当前数据库中的所有库名、表名等信息。因此,可利用SQL注入方式,通过远程注入查询语句实现读取此数据库,从而获取感兴趣的信息。获得userinfo表的所有字段:SQL注入攻击的流程SQL注入回显手工注入的流程注入并获取数据:在MySQL5.0之后的版本中,数据库内置了一个库information_schema,用于存储当前数据库中的所有库名、表名等信息。因此,可利用SQL注入方式,通过远程注入查询语句实现读取此数据库,从而获取感兴趣的信息。获得userinfo表的user字段的所有数据:SQL注入攻击的流程SQL注入回显手工注入的流程注入并获取数据:在MySQL5.0之后的版本中,数据库内置了一个库information_schema,用于存储当前数据库中的所有库名、表名等信息。因此,可利用SQL注入方式,通过远程注入查询语句实现读取此数据库,从而获取感兴趣的信息。获得userinfo表的password字段的所有数据:SQL注入攻击的流程SQL注入回显手工注入的流程注入并获取数据:在MySQL5.0之后的版本中,数据库内置了一个库information_schema,用于存储当前数据库中的所有库名、表名等信息。因此,可利用SQL注入方式,通过远程注入查询语句实现读取此数据库,从而获取感兴趣的信息。仅查询admin用户的密码:SQL注入攻击的流程SQL注入回显手工注入的流程注入并获取数据:在MySQL5.0之后的版本中,数据库内置了一个库information_schema,用于存储当前数据库中的所有库名、表名等信息。因此,可利用SQL注入方式,通过远程注入查询语句实现读取此数据库,从而获取感兴趣的信息。若觉得前面用户查询信息比较影响SQL注入显示效果,可以将前面查询出错,则只显示union查询结果:SQL注入攻击的流程SQL注入回显手工注入的流程(进阶)万能密码:

如果知道用户名,在用户框中输入username’#

如果不知道用户名,在用户名框或者密码框中输入‘or1=1#可以任意用户名登录SQL注入攻击的流程SQL注入回显手工注入的流程(进阶)万能密码:在查询时输入‘or1=1使得前面的条件无论成立与否,查询都可以进行,从而可以查到数据库中所有信息SQL注入攻击的流程SQL注入回显手工注入的流程(进阶)数字型注入和字符型注入:当输入的参数为整型时,如果存在注入漏洞,可以认为是数字型注入。当输入的参数为字符型时,如果存在注入漏洞,可以认为是字符型注入。

主要用在参数为id的情况下。判断方法:SQL注入攻击的流程SQL注入回显手工注入的流程(进阶)手工注入的思路:1.判断是否存在注入,注入是字符型还是数字型2.猜解SQL查询语句中的字段数3.确定显示的字段顺序4.获取当前数据库5.获取数据库中的表6.获取表中的字段名7.下载数据SQL注入攻击的流程SQL注入回显手工注入的流程(进阶)Dvwa-Low:1’orderby2#1’unionselect1,2#10'unionselectNULL,database()#10'unionselectNULL,group_concat(table_name)frominformation_schema.tableswheretable_schema=database()#10'unionselectNULL,group_concat(column_name)frominformation_schema.columnswheretable_name='users'#10'unionselectgroup_concat(user_id,first_name,last_name),group_concat(password)fromusers#SQL注入攻击的流程SQL注入回显手工注入的流程(进阶)Dvwa-Medium:利用mysqli_real_escape_string函数对特殊符号\x00\n\r\’”\x1a进行转义,同时前端页面设置了下拉选择表单,希望以此来控制用户的输入。使用burpsuit抓包的方法可以修改数据包。1.判断是否存在注入,注入是字符型还是数字型:抓包更改参数id为1′or1=1#说明存在数字型注入。(由于是数字型注入,服务器端的mysql_real_escape_string函数就形同虚设了,因为数字型注入并不需要借助引号。)先将源代码倒数第二行改为:$number_of_rows=mysqli_num_rows($result);SQL注入攻击的流程SQL注入回显手工注入的流程(进阶)Dvwa-Medium:利用mysql_real_escape_string函数对特殊符号\x00\n\r\’”\x1a进行转义,同时前端页面设置了下拉选择表单,希望以此来控制用户的输入。使用burpsuit抓包的方法可以修改数据包。2.猜解SQL查询语句中的字段数:抓包更改参数id为1orderby2#抓包更改参数id为1orderby3#,说明执行的SQL查询语句中只有两个字段,即这里的Firstname、Surname。SQL注入攻击的流程SQL注入回显手工注入的流程(进阶)Dvwa-Medium:利用mysql_real_escape_string函数对特殊符号\x00\n\r\’”\x1a进行转义,同时前端页面设置了下拉选择表单,希望以此来控制用户的输入。使用burpsuit抓包的方法可以修改数据包。3.确定显示的字段顺序:抓包更改参数id为1unionselect1,2#说明执行的SQL语句为selectFirstname,Surnamefrom表whereID=id…SQL注入攻击的流程SQL注入回显手工注入的流程(进阶)Dvwa-Medium:利用mysql_real_escape_string函数对特殊符号\x00\n\r\’”\x1a进行转义,同时前端页面设置了下拉选择表单,希望以此来控制用户的输入。使用burpsuit抓包的方法可以修改数据包。4.获取当前数据库:抓包更改参数id为1unionselect1,database()#说明当前的数据库为dvwaSQL注入攻击的流程SQL注入回显手工注入的流程(进阶)Dvwa-Medium:利用mysql_real_escape_string函数对特殊符号\x00\n\r\’”\x1a进行转义,同时前端页面设置了下拉选择表单,希望以此来控制用户的输入。使用burpsuit抓包的方法可以修改数据包。注意:5.获取数据库中的表:抓包更改参数id为1unionselect1,group_concat(table_name)frominformation_schema.tableswheretable_schema=‘dvwa’#因为dvwa两边的单引号’被转义为\’SQL注入攻击的流程SQL注入回显手工注入的流程(进阶)Dvwa-Medium:利用mysql_real_escape_string函数对特殊符号\x00\n\r\’”\x1a进行转义,同时前端页面设置了下拉选择表单,希望以此来控制用户的输入。使用burpsuit抓包的方法可以修改数据包。5.获取数据库中的表:抓包更改参数id为1unionselect1,group_concat(table_name)frominformation_schema.tableswheretable_schema=database()#说明当前的数据库中一共有两个表,guestbook与users。SQL注入攻击的流程SQL注入回显手工注入的流程(进阶)Dvwa-Medium:利用mysql_real_escape_string函数对特殊符号\x00\n\r\’”\x1a进行转义,同时前端页面设置了下拉选择表单,希望以此来控制用户的输入。使用burpsuit抓包的方法可以修改数据包。6.获取表中的字段名:抓包更改参数id为1unionselect1,group_concat(column_name)frominformation_schema.columnswheretable_name=’users’#这是因为单引号被转义了,变成了\’SQL注入攻击的流程SQL注入回显手工注入的流程(进阶)Dvwa-Medium:利用mysql_real_escape_string函数对特殊符号\x00\n\r\’”\x1a进行转义,同时前端页面设置了下拉选择表单,希望以此来控制用户的输入。使用burpsuit抓包的方法可以修改数据包。6.获取表中的字段名:可以利用16进制进行绕过,抓包更改参数id为1unionselect1,group_concat(column_name)frominformation_schema.columnswheretable_name=0×7573657273#SQL注入攻击的流程SQL注入回显手工注入的流程(进阶)Dvwa-Medium:利用mysql_real_escape_string函数对特殊符号\x00\n\r\’”\x1a进行转义,同时前端页面设置了下拉选择表单,希望以此来控制用户的输入。使用burpsuit抓包的方法可以修改数据包。7.下载数据:抓包修改参数id为1or1=1unionselectgroup_concat(user_id,first_name,last_name),group_concat(password)fromusers#SQL注入攻击的流程SQL注入回显手工注入的流程(进阶)Dvwa-High:只是在SQL查询语句中添加了LIMIT1,希望以此控制只输出一个结果。我们可以通过#将其注释掉。其他步骤同Low级别。请大家自行操作。需要特别提到的是,High级别的查询提交页面与查询结果显示页面不是同一个,也没有执行302跳转,这样做的目的是为了防止一般的sqlmap注入,因为sqlmap在注入过程中,无法在查询提交页面上获取查询的结果,没有了反馈,也就没办法进一步注入。Dvwa-Impossiable:采用了PDO技术,划清了代码与数据的界限,有效防御SQL注入,同时只有返回的查询结果数量为一时,才会成功输出,这样就有效预防了“脱裤”,Anti-CSRFtoken机制的加入了进一步提高了安全性。01SQL注入攻击的原理02SQL注入攻击的分类03SQL注入攻击的流程04常见防护手段及绕过目录CONTENTS参数过滤SQL注入的防护参数过滤分为:数据类型限制和危险字符处理。总的思路就是尽可能限制用户可提交的参数类型。针对SQL注入设计防护体系时,一定要与实际业务场景进行配合,很多时候用简单的方式可获得非常好的防护效果。预编译处理也称为参数化查询,是指数据库服务器在数据库完成SQL指令的编译后,才套用参数运行,因此就算参数中含有特殊的参数,也不会被数据库所运行。SQL注入常见防护手段及绕过SQL注入参数类型检测及绕过例如输入参数要求是数字,并且长度为一定值,那么如果能对参数进行过滤,避免参数中出现非数字类型字符,并且对参数长度进行限制,即可有效避免SQL注入攻击。防护思路:使用以下函数实现对输入数据类型的检查。intintval(mixed$var[,int$base=10])

用于获取var变量的整数值。通过使用指定进制base转换(默认是十进制),返回变量var的整数数值。boolis_numeric(mixed$var)检测var变量是否为数字,但此函数允许输入负数和小数。boolctype_digit(string$str)检测str中的字符是否都为数字,负数和小数无法通过检测。在特定情况下,使用这三个函数可限制用户输入数字型参数,这在一些仅允许用户参数为数字的情况下非常适用。如查询需要输入ID号、学号、电话号码等业务场景。常见防护手段及绕过SQL注入参数类型检测及绕过有效绕过方式:当Web应用对数据进行数字类型的限制时,受制于字符类型要求,因此无法构造出有效的语句,也就无法利用SQL注入攻击来获取数据库内的信息。但能使用某些技巧令数据库报错。如is_numeric支持十六进制与十进制,提交0x01时它也会进行查询;intval虽然默认支持十进制数字,但依然会有问题,比如提交id=-1时会出错。这些细微的差异可以帮助攻击者识别后台的过滤函数。常见防护手段及绕过SQL注入参数长度检测及绕过检测思路:当攻击者构造SQL语句进行注入攻击时,其SQL注入语句一般会比较长,远远大于正常业务中有效参数的长度。因此,如果某处提交的内容具有固定的长度(如密码、用户名、邮箱、手机号等),那么严格控制这些提交点的字符长度,大部分注入语句就没办法成功执行。这样可以实现很好的防护效果。检测代码:在PHP下,可用strlen函数检查输入长度,并进行长度判断,如果参数长度在限制范围内即通过,超过限制范围则终止当前流程。绕过方式:在特定环境下,利用SQL语句注释符来实现对查询语句语义的变更,增加的字符长度很少,却会造成比较严重的危害。如万能密码。或者巧妙利用and、or条件查询。因此,在SQL注入防护中,限制参数长度虽然能够限制绝大部分语句无法执行,但是在特定环境下仍有绕过的可能。常见防护手段及绕过SQL注入危险参数过滤及绕过防护思路:常见的危险参数过滤方法包括关键字、内置函数、敏感字符的过滤,其过滤方法主要有:黑名单过滤:将一些可能用于注入的敏感字符写入黑名单中,如’(单引号)、union、select等,也可能使用正则表达式做过滤,但黑名单可能会有疏漏。白名单过滤:例如,用数据库中的已知值校对,通常对参数结果进行合法性校验,符合白名单的数据方可显示。参数转义:对变量默认进行addsalashes或mysql_real_escape_string(在预定义字符前添加反斜杠),使得注入语句构造失败。由于白名单方式要求输出参数有着非常明显的特点,因此适用的业务场景非常有限。总体来说,防护手段仍以黑名单+参数转义方式为主,这也是目前针对SQL第三参数处理的主要方式。常见防护手段及绕过在复杂场景中,有效的防护手段还包括对参数中的敏感信息进行检测及过滤,避免危险字符被系统重构成查询语句,导致SQL注入执行成功。可见,过滤危险参数的工作非常必要。SQL注入危险参数过滤及绕过防护代码:黑名单过滤:针对参数中的敏感字符进行过滤,如果发现敏感字符则直接删除。这里利用str_replace()函数进行过滤,过滤的关键字为union、\、exec、select。参考代码如下:常见防护手段及绕过If(isset($_GET[‘name’]))

{$name=$_GET[‘name’];

$name=str_replace(‘union’,’’,$name);

$name=str_replace(‘\’,’’,$name);$name=str_replace(‘exec’,’’,$name);$name=str_replace(‘select’,’’,$name);……

}SQL注入危险参数过滤及绕过防护代码:白名单过滤:首先设置白名单为当前用户名,之后对由GET方式传入的用户名进行对比,若相同则进行查询,若不相同则提示输入有误。参考代码如下:常见防护手段及绕过if(isset($_GET[‘name’]))

{$name=$_GET[‘name’];

$conn=mysql_connect($DB_HOST,$DB_USER,$DB_PASS)

ordie(“connectfailed”.mysql_error());

mysql_select_db($DB_DATABASENAME,$conn);

$sql=“select*fromuser”;

$result=mysql_query($sql,$conn);

$isWhiteName=is_in_white_list($result,$name);

if(&isWhiteName){(输出)}

else{echo“输入有误”;}mysql_free_result($result);mysql_close($conn);

}functionis_in_white_list($result,$username){while($row=mysql_fetch_array($result))

{$username2=$row[‘user’];

if($username2==$username)

{returnTRUE;}

}}SQL注入危险参数过滤及绕过防护代码:参数转义:在PHP中,addsalashes和mysql_real_escape_string都是内置的一种安全过滤函数,

addsalashes功能是在用户提交的参数中的敏感字符单引号(’)、双引号(”)、反斜线(\)、和NUL(NULL字符,)前添加反斜杠(\),

mysql_real_escape_string对特殊符号\x00\n\r\’”\x1a进行转义。参考代码如下:常见防护手段及绕过mysql_query(“SETNAMES‘GBK’”);Mysql_select_db(“XX”,$conn);$user=addslashes($user);$pass=addslashes($pass);$sql=“select*fromusertbwhereuser=‘$user’andpassword=‘$pass’”;$result=mysql_query($sql,$conn)ordie(mysql_error());$row=mysql_fetch_array($result,MYSQL_ASSOC);Echo“<p>{$row[‘user’]}<p><p>{$row[‘password’]}<p>\n\n”;SQL注入危险参数过滤及绕过绕过方式:黑名单:绕过黑名单防护措施的思路是:将关键字或特定符号进行不同形式的变换,从而实现绕过绕过过滤器的目的。目前存在的绕过方式有以下几种:使用大小写变种:通过改变攻击字符中的大小写尝试避开过滤,因为数据库中使用不区分大小写的方式处理SQL关键字,所以可以尝试将诸如or改为oR来试验能否绕过。但如果系统对输入使用了大小写转换,那么该方法就没有用了。使用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论