目录
Sql注入含义:
Sql注入的原理:
Sql注入产生条件:
Sql注入的危害:
Sql注入漏洞检测和判断:
sql注入的防御:
SQL注入的分类(8种):
堆叠注入:
盲注:
宽字节注入:
延时注入:
常用函数:
注入常用函数以及语句
mysql写入一句话:
字符串连接函数
Sql注入waf绕过
白盒绕过
黑盒绕过
Fuzz测试
Sql注入含义:
由于程序员对用户输入的数据的合法性没有进行判断和处理,导致攻击者可以在web应用程序中事先定义好的sql语句中添加额外的sql语句,在管理员不知情的情况下实现非法操作,以此来欺骗数据服务器执行非法的任意查询,从而进一步获取数据
Sql注入的原理:
恶意拼接查询、利用注释执行非法命令、传入非法参数、添加额外条件
所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,
比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入。
Sql注入产生条件:
用户对sql查询语句可控
原本要执行的sql语句,拼接了用户输入的恶意数据
Sql注入的危害:
攻击者未授权可以访问数据库中的数据,盗取用户的隐私以及个人信息,造成用户信息泄露
可以对数据库进行增加或者删除操作,比如私自添加或者删除管理员账号
如果网站目录存在写入写入权限,可以写入网页木马,攻击者可以对网页进行篡改,发布一些违法信息
经过提权等步骤,服务器最高权限被攻击者获取,攻击者可以远程控制服务器,安装后门,那么攻击者就可以修改或者控制操作系统
Sql注入漏洞检测和判断:
检测方法
SQL注入漏洞的检测分为手动检测和自动检测。
1、手动检测是对某个特定区间的URL进行手工注入测试;
常用的注入判断 ‘ “ ’) ”) ‘)) “))
2、自动检测是利用爬虫爬取网站的所有链接,对所有的链接自动进行注入测试。在大型应用中,手动检测的工作量是巨大的,一般采用自动检测的方式。
判断
demo.do?DATA=AjAxNg== DATA有可能经过了 base64 编码再传入服务器,所以我们也要对参数进行 base64 编码才能正确完成测试
sql注入的防御:
防御SQL注入的核心思想是对用户输入的数据进行严格的检查,并且对数据库的使用采用最小权限分配原则。目前SQL注入的防御手段有以下几种:
(1) 基于攻击特征的匹配过滤。
这是目前使用最为广泛的方式,系统会将攻击特征做成数据库,一旦匹配到这些攻击特征就会认定检测到SQL注入。这种方式可以有效的过滤大部分SQL注入攻击,但是大大增加了程序的复杂度,同时可能影响到业务的正常查询。
(2)对用户输入进行转义。
例如,常见的SQL注入语句中都含有“‘’”,通过转义将“‘’”转义为“/”,SQL注入语句就会达不到攻击者预期的执行效果,从而实现对SQL注入进行防御。
(3)数据类型进行严格定义,数据长度进行严格规定。
比如查询数据库某条记录的id,定义它为整型,如果用户传来的数据不满足条件,要对数据进行过滤。数据长度也应该做严格限制,可以防止较长的SQL注入语句。
(4)严格限制网站访问数据库的权限。
(5)mybatis框架预编译功能防止SQL注入。
例如:MyBatis启用了预编译功能,在SQL执行前,会先将`SELECT id,title,author,content FROM blog WHERE id = ?` 发送给数据库进行编译;执行时,直接使用编译好的SQL,替换占位符“?”就可以了。因为SQL注入只能对编译过程起作用,所以这样的方式就很好地避免了SQL注入的问题。
(6)其他防御措施。
例如,避免网站显示SQL执行出错信息,防止攻击者使用基于错误的方式进行注入;
登录框开启错误次数的锁定机制,防止脚本进行注入测试;
每个数据层编码统一,防止过滤模型被绕过等;
数据库还是不要对自己太过相信,不要认为数据库里的数据都是正常的,当从数据库里调用的时候要经过过滤,这就不会造成了二次注入
重要信息加密存储。例如,password进行md5加密存储
使用安全防护产品
SQL注入的分类:
从注入参数类型分:数字型注入、字符型注入、搜索型注入
从注入方法分:基于报错、基于布尔盲注、基于时间盲注、联合查询、堆叠注入、内联查询注入、宽字节注入 二次注入
从提交方式分:GET注入、POST注入、COOKIE注入、HTTP头注入
堆叠注入:
在SQL语句中,语句的结束都是以`;`结尾,但是如果我们在`;`后面再加上一条SQL语句,两条语句会一起执行。这也就是造成堆叠注入的原因了
盲注:
盲注是在SQL注入攻击过程中,服务器关闭了错误回显,我们单纯通过服务器返回内容的变化来判断是否存在SQL注入和利用的方式。盲注的手段有两种,一个是通过页面的返回内容是否正确(boolean-based),来验证是否存在注入。一个是通过sql语句处理时间的不同来判断是否存在注入(time-based),在这里,可以用benchmark,sleep等造成延时效果的函数,也可以通过构造大笛卡儿积的联合查询表来达到延时的目的。
宽字节注入:
产生原理
在数据库使用了宽字符集gbk,而WEB中没考虑这个问题的情况下,在WEB层,由于0XBF27是两个字符,在PHP中比如addslash和magic_quotes_gpc开启时,由于会对0x27单引号进行转义,因此0xbf27会变成0xbf5c27,而数据进入数据库中时,由于0XBF5C是一个另外的字符,因此\转义符号会被前面的bf带着"吃掉",单引号由此逃逸出来可以用来闭合语句。
根本原因
character_set_client(客户端的字符集)和character_set_connection(连接层的字符集)不同,或转换函数如,iconv、mb_convert_encoding使用不当。
Utf-8代表3个字节 Ascii代表1个字节 Gbk代表2个字节
解决办法
统一数据库、Web应用、操作系统所使用的字符集,避免解析产生差异,最好都设置为UTF-8。
或对数据进行正确的转义,如mysql_real_escape_string + mysql_set_charset的使用。
延时注入:
if(ascii(substr(“hello”, 1, 1))=104, sleep(5), 1)
常用函数:
1、length() -- 计算数据库长度
2、left(a,b) -- left()函数表示的是从字符表达式最左边一个字符开始返回指定数目的字符.若 b 的值大于 a 的长度,则返回字符表达式的全部字符a.如果 b 为负值或 0,则返回空字符串。**一般用来猜测库的名字**
3、substr() -- substr()和substring()函数实现的功能是一样的,均为截取字符串
`substr(DATABASE(),1,1)>’a’,查看数据库名第一位 `
4、mid(striing,start,length) --string(必需)规定要返回其中一部分的字符串。-- start(必需)规定开始位置(起始值是 1)。 -- length(可选)要返回的字符数。如果省略,则 mid() 函数返回剩余文本
5、ascii() -- 返回字符串str的最左字符的数值。返回0,如果str为空字符串。返回NULL,如果str为NULL。 ASCII()返回数值是从0到255
6、updatexml(XML_document, XPath_string, new_value);**
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
7、extractvalue()
extractvalue(XML_document, XPath_string);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串).
8、exp()
exp是以e为底的指数函数
由于数字太大是会产生溢出。这个函数会在参数大于709时溢出,报错
9、floor()
floor()函数是 MYSQL 中用来取整的函数。
报错原因是:报错是因为rand()函数在查询的时候会执行一次,插入的时候还会执行一次。这就是整个语句报错的关键
group by x先建立一个空表,用于分组.**然后进行分组查询,第一次rand()执行,查询的结果是0,因为是空表所以插入这条,而插入的时候rand()又执行了一次,所以表中的结果就是
11、Sleep(x) -- 在x参数给定的秒数之后运行,在基于时间的盲注中常用
12、if(a,b,c) -- a为真执行b,为假执行c,基于时间的盲注中常用
基于报错的 SQL 盲注
构造 payload 让信息通过错误提示回显出来
定义:SQL报错注入基于报错的信息获取,虽然数据库报错了,当我们已经获取到我们想要的数据。
条件:后台没有屏蔽数据库报错信息,在语法发生错误的时候会输出在前端。
常用四个报错函数:
updatexml():是mysql对xml文档数据进行查询和修改的xpath函数
extractvalue():是mysql对xml文档数据进行查询的xpath函数
floor():mysql中用来取整的函数
exp():此函数返回e(自然对数的底)指数X的幂值
注入常用函数以及语句
1、系统函数
1. version()——MySQL 版本
2. user()——数据库用户名
3. database()——数据库名
4. @@datadir——数据库路径
5. @@version_compile_os——操作系统版本
6. @@basedir ——数据库安装路径
SELECT SYSTEM_USER();-- 返回MySQL连接的当前用户名和主机名
mysql写入一句话:
root权限以及网站的绝对路径。
select '一句话' into outfile '路径';
select '一句话' into dumpfile '路径';
select '' into dumpfile 'd:\wwwroot\baidu.com\nvhack.php';
读文件:load file
字符串连接函数
1、concat(str1,str2,...)——没有分隔符地连接字符串
2、concat_ws(separator,str1,str2,...)——含有分隔符地连接字符串
3、group_concat(str1,str2,...)——连接一个组的所有字符串,并以逗号分隔每一条数据(当成一个组即可)
说着比较抽象,其实也并不需要详细了解,知道这三个函数能一次性查出所有信息就行了
mysql的网站注入,默认数据库5.0以上和5.0以下有什么区别?
5.0以下没有information.schema这个系统表,无法列出表名列名,只能暴力跑表名。
5.0以下是多用户单操作,5.0以上是多用户多操做。
mysql写shell有几种方法
outfile、dumpfile、开启log写webshell
Sql注入waf绕过
大致可分为三类
白盒绕过
通过源代码分析(代码审计)进行绕过
黑盒绕过
1.架构层面绕过waf
1.寻找原网站绕过waf检测
主要是正对云waf,寻找原网站的真实地址,进行绕过,有点像cdn
2.通过同网段绕过waf防护
在一个网段中,可能经过的数据不会经过云waf,从而实现绕过
2.资源限制角度绕过waf
一般waf的执行需要优先考虑业务优先的原则,所以对于构造较大、超大数据包可能不会被检测,从而绕过waf
【如 某些网站 对于get数据进行waf检测 get数据较小 对于post数据 不进行waf检测 post数据较大(利用post数据从而绕过waf)】
3.协议层面绕过waf
1.协议未覆盖waf
比如由于业务需要,只对get型进行检测,post数据选择忽略
2.参数污染
Index?id=1&id=2 waf可能只对id=1进行检测
4.规则层面绕过waf
1.sql注释符绕过
2.空白符绕过
3.函数分隔符号
4.浮点数绕过
5.利用error-base进行sql注入
6.mysql特殊语法
7.大小写绕过
8.双写绕过
Fuzz测试
可以使用bp配合手工进行测试,后期测试成功再用脚本进行处理
如 /*加多少位可以绕过,手动测试,配合burpsuite*/