web应用安全参数检测方法(检测输入参数方法)

前面我们说到,web应用安全的基数是,做好参数检测!就像是小区防止小偷,必须把好所有进入门。然后,对进入人员进行检测!这些我们都清楚的,就是有时候在web应用中,对输入参数检测时候发现困难!因为,输入参数字符可以各种各样,长度也不相同!我们从什么维度准确标识出我所需要的格式呢?

这里我观点是,应用对参数检测可以分为2个关卡,第一个关卡可以是,保证参数输入安全。第二个关卡是保证它是业务所需要的值。一个应用,保证安全是最基础的。我们第一关检测参数,怎么样做比较好呢?

标识参数方法?

所有web传入都是字符串,我们怎么样标识字符串呢?字符串都是有字符组成的,常见是ascii码,对于中文网站,有gb2312,gbk等字符。从这里看,字符个数会很多。它们之间如果做长度不一组合字符串,将会更多了。 因此,再一次说明,不要用现在字符串方法,来检测!有可能你需要限制是无底洞!可以说,对于我们一个web应用参数,90%以上,基本在ascii码就可以,很少参数会突变到这100多个字符范围。所以,标识一个字符串,可以从以下2个方面来限制:

1、字符串 中字符范围 (如:如果是手机号0-9,用户名可能是字母+数字之类)

2、字符串 长度 (如手机号是:11位,用户名可能是:6-15位)

以上方法可以保证,不在用户需要字符范围的字符,一定不能进入后端!我们看看一般例子!

<?php
/**
*读取get值
*@copyright  http://blog.chacuo.net
*@author 8292669
*@param $k string get参数名称
*@param $p string 正则表达式内容
*@return string|array 读取值
*/
function input_get($k,$p='.*')
{
	$v = isset($_GET[$k])?$_GET[$k]:'';
	if(is_array($v))
	{
		$_v = array();
		foreach ($v as $k=>$_v1)
		{
			$_v[$k]=!preg_match("/^".$p."$/",$_v1)?'':$_v1;
		}
		return  $_v;
	}
	return !preg_match("/^".$p."$/",$v)?'':$v;
}

测试:var_dump(input_get(‘a’,'\d+’),input_get(‘b’,'\d+’));  读取a,b参数,都为数字的!

web应用安全参数检测方法 
因为参数b输入是:2ccc,因此不是0-9字符。所以返回为空字符串!

上面这样每次输入正则表达式确实很麻烦的,其实,一个应用,业务字段,应该都比较固定,我们可以再在该基础上面,进一步封装些,取独立业务字段函数。如:input_getUser($k) 专门读取用户名,input_getQQ($k)专门读取QQ号。如此类推,然后我们发现真的需要独立写检测的变得非常少了!

怎么样限制中文字符?

我有一个真实姓名框,需要输入真实姓名!我该怎么样检测?我们知道常见中文字符表是gb2312,其实中国人取名字现在都需要在常见汉字里面挑选。也就是在区位码表中找。所以,我们问题就变成了,怎么样检查用户输入是不是在gb2312字符集中。gb2312是多字节的,一个中文都是2个字节。只要我们先对好范围就可以了。 gb2312字符集表,我们可以查看:http://doc.chacuo.net/gb2312

gb2312字符集 

第一个字节范围是:A1-F7 第2个字节范围是A1-FE ,因此我们正则表达式可以写成:[\xA1-\xF7][\xA1-\xFE] 就可以对2个字节限制了。 “怎么拿过去用不了?”,这里我们做中文限制,只完成第一步,在指定字符集中,找好需要用到中文的字符编码。第二步,就是你要将原字符串转码为该字符集编码。如:你如果是utf-8编码,你需要将获取字符串先转码为gb2312,然后再用gb2312字符位置 正则表达式来检测! 如果,你不转码,你发现刚刚找的那个字符位置正则表达式毫无用处了!通过这个,我们注意做中文位置检测时注意:

1、选择好字符集,找好字符位置,准备好字符范围的正则表达式

2、将待检测字符串,转码为选号的字符集的编码

现在,我们知道了字符串检测方法了,无论简单参数、还是复杂中文字符参数!我们都可以轻松完成了!通过字符串中字符范围定位需要字符在实际检测中,非常安全! 因为,很多经常出现问题字符,都不会出现在应用的参数中!只要我们保证第一个关卡,只允许包含业务相关的字符的字符串进入!应用安全,基本上没有问题!好了,就到这里吧!欢迎朋友们发表自己观点!

Posted in web安全 | Tagged | Leave a comment

HTML Link标签 文档资源、导航、SEO 介绍

定义和用法

head头标签里面,有另一个不起眼的标签。那就是:Link标签。<link> 标签的作用是定义文档与外部资源的关系,最常用的是链接样式表。


<head>
<link rel="stylesheet" type="text/css" href="header.css" />
</head>
以上是链接样式表,这是常用的方法。其实它还可以做文件导航、以及seo方面都可以有用途。我们继续往下吧!

Link属性介绍

属性 描述
rel alternate
appendix
bookmark
chapter
contents
copyright
glossary
help
home
index
next
prev
section
start
stylesheet
subsection
icon (后来补充)
定义当前文档与被链接文档之间的关系
rev alternate
appendix
bookmark
chapter
contents
copyright
glossary
help
home
index
next
prev
section
start
stylesheet
subsection
定义被链接文档与当前文档之间的关系
href URL地址 定义被链接文档的位置
type 定义媒体类型 MIME_TYPE 指定被链接文档的 MIME 类型
media screen
tty
tv
projection
handheld
print
braille
aural
all
规定被链接文档将显示在什么设备上
charset 字符编码如:utf-8,gb213等 指定被链接文档的字符编码方式
hreflang 语言2字代码 language_code 指定被链接文档中文本的语言

其它标准属性:

1、核心属性 (id,class,style,title)  分别是id号,样式名称,单行样式,title描述

2、语言属性(dir,lang,xml:lang)  分别是 文本方向、语言

3、键盘属性(accesskey,tabindex) 分别是 快捷键、tab建索引

以上属性也具有!

 

SEO相关的使用属性

1、canonical属性值

当一个站点,有几个内容一致的页面(相同内容,有多个url地址),这样页面多的出现、会因为大量重复内容出现,被搜索引擎降权!因此,我们可以利用该属性指定页面出处!

如:http://blog.chacuo.net/332.html    http://blog.chacuo.net/?p=332

两个是同一个内容,那么我在http://blog.chacuo.net/?p=332 加入:<link rel=’canonical’ href=’http://blog.chacuo.net/332.html’ />
告诉,搜索引擎,这个页面与322.html一致,以322.html为准,不要收录p=322页面。

2、next,prev,home等属性值,带连接的导航作用

例如:当前页是332.html,里面有:

<link rel=’prev’   href=’http://blog.chacuo.net/331.html’ />  <link rel=’next’   href=’http://blog.chacuo.net/333.html’ />它相关的上一个页面是331.html,下一个页面是333.html。不过,目前搜索引擎对这些支持不是很好!基本作用不大!

小结:

link,rel属性有多种,现在也有新的扩展,例如wordpress中,我们可以看到:EditURI,wlwmanifest属性。我们也可以自己定义新的属性,不过已经确定了名称属性。它的作用已经固定,我们得遵守它的本意!

Posted in web原理 | Tagged , | Leave a comment

meta标签 使用说明(http-equiv、refresh、seo)

meta标签,是在head标签里面,一般用做页面描述的。它的内容,用来描述页面一些信息的,如类型、编码、作者、简介等!虽然,它不作为页面布局显示,但实际上用途非常广的!具体的html定义在:meta定义 

meta组成部分

meta标签共有两个属性,它们分别是http-equiv属性和name属性,不同的属性又有不同的参数值,这些不同的参数值就实现了不同的网页功能。

name属性主要用于描述网页,与之对应的属性值为content,content中的内容主要是便于搜索引擎机器人查找信息和分类信息用的。

http-equiv相当于http的文件头作用,它可以向浏览器传回一些有用的信息,以帮助正确和精确地显示网页内容,与之对应的属性值为content,content中的内容其实就是各个参数的变量值。

Meta标签属性

属性 描述
http-equiv content-type
Content-Language
Pragma
expires
refresh
set-cookie
把 content 属性关联到 HTTP 头部。http协议返回头,都支持!
name author
description
keywords
generator
revised
others
把 content 属性关联到具体属性的值
content 对应(name,http_equiv)选择属性的值 定义与 http-equiv 或 name 属性相关的元信息。

http-equiv response返回头控制

常用来说明页面类型、编码,重定向,以及缓存控制方面!

1、Content-Type和Content-Language (显示字符集的设定)

<meta http-equiv=″content-Type″ content=″text/html; charset=gb2312″>,当前页面是text/html类型,页面编码是gb2312,也可以简写为<meta charset="gb2312">,语言控制:<meta http-equiv="Content-Language" content="zh-cn" /> ,说明该页面是简体中文

2、refresh 自动刷新并且指向新页面

<meta http-equiv=″refresh″ content=″2; URL=http://blog.chacuo.net″>,2秒后,页面自动进入http://blog.chacuo.net

3、Expires(过期控制)

<meta http-equiv="expires" content="Fri,12 Jan 2001 18:18:18 GMT">,可以用于设定网页的到期时间。一旦网页过期,本地缓存将失效,必须重新从服务器读取信息!

4、Pragma(控制缓存模式)

禁止浏览器从本地计算机的缓存中访问页面内容,<meta http-equiv="Pragma" content="no-cache"> 。本地浏览器不保存内容!禁止缓存可以加上:<meta http-equiv="Cache-Control" CONTENT="no-cache"> ,这样一起控制!

5、set-cookie(设置cookie值)

用法:<meta http-equiv="Set-Cookie" content="kkk=ddd; expires=Thu, 11-Jul-23 11:32:15 GMT; path=/; "> 设置cookie,名称是kkk,值为ddd,过期是2023-7-11 19:32:15秒!

帮助主页被各大搜索引擎登录、其它

1、Keywords 描述页面关键词

<meta name="keywords" content="政治,经济,科技,文化,卫生,情感,心灵,娱乐,生活,社会,企业,交通"> ,便于搜索引擎,快速定位页面主题!

2、Description页面简介描述信息

<meta name="description" content="程默博客是一个关注web安全、性能、框架,以及服务器性能、服务器架构、服务器安全,是一个值得Web开发朋友收藏的博客。"/> ,对页面简单描述概括!

3、Author页面所有者

<META name="author" content="chengmo"> 该页面作者是:chengmo

4、Copyright 版权说明

<META name="copyright" content="&copy; 2013 chacuo.net"> 版权信息描述!

5、Date 开创时间

<META name="date" content=”2013-7-11T19:49:37+00:00”>页面开创时间!

6、robots(机器人向导)

说明:robots用来告诉搜索机器人哪些页面需要索引,哪些页面不需要索引。content的参数有all,none,index,noindex,follow,nofollow。默认是all。举例:<meta name="robots" content="none">不索引该页,并且该页里面所有连接也不搜索索引!

以上是meta常见应用,可以对页面进行信息描述,也可以对搜索引擎进行引导!特别是它的属性及值,没有进一步的定义。随着不断应用,可能在后面我们还会扩展出新的属性,以及它对应值!它为今后的扩展预留很多的空间!也有些浏览器,还支持:进入、退出动画,窗口定义,分级定义。不过它不能很好在所有浏览器中兼容,一次没有一一列举!欢迎交流!

Posted in web原理 | Tagged , | Leave a comment

web应用安全之基础(输入参数检查必要性)

好几天没有写了,电脑一直有问题,还没有修好!本来开机故障,修理了下!现在是彻底开机不了!算了,随它去吧,该换个品牌了!先不说这些,我们进入正题,看看web应用安全基数,为什么是输入参数检查!开发web应用,工作中代码审核、漏洞修复!基本是我们对输入参数检查不够!

主要问题出现在3个方面:

1、对检查认识不够!经常忘记必要参数检测,特别对于一些页面只是传值,而没有写入到后端存储的参数,更是很容易遗漏!

2、对那些是输入的、那些是系统环境参数 有些没有明白,导致错误的放过该检查的参数!

3、检查方法不正确、往往检查过后,还存在问题!

 

我说说自己的一些看法吧,所有一切首先要认识到参数检查的重要性!

为什么要参数检查?

我们还是从生活中来看吧,现在社会上,下班回家进入小区,门口保安要检查门卡,有卡才可以进入!到公司了,进门禁系统,公司需要刷员工卡,然后进入公司!现在学校、机关等等,我们发现都会有个检查的,大家都很清楚,它的目的是保证大家安全,让一些自己允许的人才可以进入!我们发现,所有检查地点,都是在分界隔离地方,也就是在进入的入口上!

从上面这些场景,我们发现生活中,为了我们安全!在进入一些私人区域,都有检查口。其实web检查也是可以比拟的!web参数是最前端用户与系统接口地方,因此这个地方检查是必要的!我们只能允许满足要求的进入后端系统!这也是保证后端系统安全的前提!

漏掉该检查地方隐患!

这个问题,同样存在!前段时间,听到一个新闻,一个很高档的小区有很好的安全门禁检查!但是,它的地下车库到楼上,就没有增加检查!后来,一些别有用心的人,专门租车,从地下车库上到居民楼,进行偷盗!还有个新闻,一个小区进门地方,如果是单人的话,会检查,但是如果你开车进入,特别是名牌车!基本上不检查!后来,也导致一伙别有用心的人,驾车进入偷盗!我们做web应用,一定要知道那些参数来源于用户端输入,php代码里面的:$_GET,$_POST,$_REQUEST,$_SERVER,$_COOKIE,$_FILES等。那些来自用户,那些是系统!清清楚楚,明明白白检查!

怎么样检查才正确?

这些我们也可以看看现实生活中,我们发现公司、小区、学校,每个进入的人,都要有一张发的卡,只有持卡人才可以进入!这个是限定用户范围的,只有限定范围才可以进入!这种检查方法,很常用的,也很安全!换个思路,如果小区里面,认为自己小区高档,来小区的都穿着不错。因此,把检查改为:穿正装可以进入!这样一来,如果刚好小区里面有人因为某种原因,而穿着匆忙,可能不让进入!而另外,对于别有用心的人,买套正式衣服应该很容易!因此,也很容易逃过检查!

从上面两个例子我们不难发现,生活中经常检测是:通过发卡,限定用户群;而少用排除法方法!这也是,我们web参数检查中推荐的方法,限定参数的范围;不做、少做参数过滤替换检查!

好了,上面这些方法其实都来自生活,大家一看都明白!如果真的遇到做参数检查时候,有些迷糊!不妨想想生活中例子!其实,程序都是解决实际生活中问题,并且很多都来自于生活!参数需要检查、并且需要正确检查!下一节我将,谈谈对于参数检查范围检查的一些自己看法!欢迎大家交流!

Posted in web安全 | Tagged | Leave a comment

正则表达式性能优化(高效正则表达式书写)

这里说的正则表达式优化,主要是针对目前常用的NFA模式正则表达式,详细可以参考:正则表达式匹配解析过程探讨分析(正则表达式匹配原理)。从上面例子,我们可以推断出,影响NFA类正则表达式(常见语言:GNU Emacs,Java,ergp,less,more,.NET语言,
PCRE library,Perl,PHP,Python,Ruby,sed,vi )其实主要是它的“回溯”,减少“回溯”次数(减少循环查找同一个字符次数),是提高性能的主要方法。 我们来看个例子:

源字符串:<script type="text/javascript">adsfadfsdasfsdafdsfsadfsa</script>

匹配要求,匹配<script….>….</script>标签里面所有内容,包括改标签

常见写法(1),因为<script后面可能出现字符、空白、特殊符号等,还有标签里面也可能出现各种js代码。我们简单方法是:

正则表达式:<script.*?>.*?</script> (测试工具使用了:regexBuddy)

正则表达式性能优化 
总共花费115步,回溯了:48次。 因为我们使用”.”字符,匹配默认情况下除了\n之外所有字符。

方法(2),我们分析特点发现,<script…>后面,应该是除了”>”之外都可以字符,然后一对<script>标签里面js内容。可以定义为除了”<”之外。(这里面我只是举例说明优化方法,实际网页中script标签里面,常见都会出现有”<”字符了

正则表达式:<script[^?>]+>[^<]+</script>

正则表达式性能优化 
19步,0次回溯! ,步骤只有原先的15%左右,性能几倍的提升了!

从上面我们看到,不同正则表达式,对通用字符配平,性能相差会很大。减少“回溯”是最好的方法,减少回溯其中最主要的方法是:”用最小范围的元字符,尽量避免用过大的元字符!”。一般规律如下:

1、使用正确的边界匹配器(^、$、\b、\B等),限定搜索字符串位置

2、使用具体的元字符、字符类(\d、\w、\s等) ,少用”.”字符

3、使用正确的量词(+、*、?、{n,m}),如果能够限定长度,匹配最佳

4、使用非捕获组、原子组,减少没有必要的字匹配捕获用(?:)

如:我想匹配一些英文字母,它后面接的是数字。如:abc1234,我可以写 “\w+\d+”,也可以写”[a-zA-Z]+\d+” ,其中第一个\w+会先匹配所有abc1234,然后回溯,匹配满足\d+格式。一共4步,而后面这个只需要2步,步骤减少一半了!好了,今天就先到这里,欢迎大家讨论、交流!

Posted in web原理, web性能 | Tagged | Leave a comment

京东商城Jsonp 资源越权限访问漏洞分析

最近比较忙,电脑一直有问题,还没有修理好。本来以前买个电脑才3000来块,现在刚好过保几个月,然后修下说要700多,如果换配件要1000多。这个电脑现在买个新二手,应该也就千把块,够黑了。呵呵,不说这么些了。今天我们继续分析京东商城Jsonp使用漏洞之二,未对资源访问进行授权。

对于Jsonp漏洞,这里我就不细说了,详细可以看:Jsonp常见安全漏洞分析(京东商城Jsonp 漏洞分析) ,从上面文章,我们知道jsonp是可以跨域名调用的。这个漏洞是:没有授权网站,可以直接在该站点访问jsonp接口资源。可能有朋友会问题:“这个漏洞有什么影响呢?”,一般我们常见有:

1.对于存在漏洞的网站来说:jsonp资源给外部调用,浪费接口资源,也给调用带来压力

2.利用者,可以通过jsonp获取网站资源,构造钓鱼站点,或者给用户发送钓鱼站点。获取用户在漏洞网站上面的用户信息(用户登陆情况下),或者偷偷操作用户功能!

具体我们看看实例:

京东商城jsonp漏洞 
我们看看,如果有个另外域名站点,怎么样调用该信息!
<?php
header("Content-Type: text/html; charset=utf-8");
?>
<script>
function jsonp13724(d)
{
	console.log(d);
}
</script>
<script type="text/javascript" src="http://my.jd.com/order/rec.action?jsoncallback=jsonp13724">
</script>
京东商城jsonp漏洞 
 

总结,通过上面例子,对于jsonp跨站访问,带来资源别越权调用漏洞。我们应该知道了它的原理。如果要防止这类越权访问,我们一般只需要对访问来源:reffer进行授权 这是最简单的方法! 也是最常用方法了。如果有朋友会问,这个漏洞有什么危害呀,看起来好像没有什么问题?如果一个站点别有用心站点(这里叫A站),在京东商城上面发了一个链接。有不小心朋友点过去。这个时候,你刚好自己登陆了。这个时候,A站就可以悄悄读到你在京东商城一些信息了。到此,对京东商城jsonp漏洞都分析完毕,国内这么大一个商城,在这个方面使用,几乎没有做任何检测,确实有些不应该!希望,以上分析对即将应用jsonp朋友有所帮助!也需要大家发表自己看法!

Posted in web安全 | Tagged | Leave a comment

GBK字符编码(字符集)缺陷攻击(注入)原理

上一节,我们分析了。选择不同编码可能会导致程序带来本身潜在的漏洞。这次我们以GBK编码为例,看看怎么样通过该编码注入到系统中。目前很多开源系统都存在类似的注入问题。我们先来,从一个Demo开始!

GBK字符集漏洞注入原理

<?php
$u=isset($_GET['u'])? $_GET['u']:'';
$u=addslashes($u);
$sql = "select * from user where user='$u'";

以上是我们写的一个测试例子(GBK编码),现在很多开源系统,比较少的进行统一参数过滤,有时候为了防止注入,就直接对参数进行转义处理。我们看看,这样一个例子,我们怎么样注入进系统!

步骤 备注
1.传入值%D5%27 or 1=1# u参数参入上面值 (%27 对应是“’”  单引号字符)
2.GET获取的值 0xD50x27 or 1=1#
3.Addslashes后值 0xD50x5C0x27 or 1=1 (意思是:誠’ or 1=1#’)  #字符后面被注释掉
4.sql值 将变成 select * from user where user=’誠’ or 1=1#’
#号是sql注释符号,后面字符将截取掉
 
GBK编码漏洞注入测试 

GPC转义打开,或者是通过addslashes函数,会自动在字符是单引号()、双引号(")、反斜线(\)与 NUL(NULL 字符)等字符前面增加“\”字符(0x5c),例子里面,我们采用一个特殊前面字节0xD5,它将与该字节组合变成:0xD50x5c ,刚好是gbk字符集中字符:”誠“ 了。 后面的0×27这个单引号被保留下来了!

GBK字符集漏洞注入总结

呵呵,这个很有意思吧,好了。我们来总结下,这类注入是2个条件的。第一是:gbk编码,第二是:程序采用了转义方法,转义了输入。 这2个条件不苛刻,目前大部分开源系统都有gbk,utf-8编码的源码,剩下的就去看看,源码里面有没有用类似转义方法,过滤字符串了。如果有,那么这个系统某个功能,你可以去渗透下了。这个编码漏洞,网上面提的很多,不过很多时候,没有引起开发人员的足够重视,还是在不断的重现!

那么我们如果要注入一个参数,我们该选择什么样的入参参数呢?其实这种转义字符是单引号()、双引号(")、反斜线(\)与 NUL(NULL 字符),我们这些字符往往在程序中有特殊作用,我们只需要在前面加一个在>7F字符,后面接一个%27()、%22(")、%5C(\)、%00(NULL 字符),就可以自己让这4个字符,可以逃脱转义了。

好了,这个漏洞原理及注入过程分析就这些了。我们开发时候,需要注意这个问题,特别是使用GBK编码开发程序,要有这个方面的预备知识,对于自己开发安全的代码会有帮助的。更多的GBK编码,可以看http://doc.chacuo.net/gbk !(这里有很多落在5c中文字符呢)也欢迎讨论!

Posted in web安全 | Tagged , | Leave a comment

GBK字符编码(字符集)缺陷导致web安全漏洞

很多时候,一个web站点,选择什么样的字符编码,我们不会太过在意的。象中文网站,我们一般用gb2312,gbk,gb18030,也可以用utf-8。但是,可能我们不知道,选择不同编码,可能因此导致程序本身设计缺陷。

多字节编码由来

我们先来看看最常用的,最小字符集是ascii,对应的二级制可以表示为:00-7F 编码 。它也是我们计算机使用最早通用的字符集。前期几乎可以表示所有英文字符。后来,更多使用计算机国家加入后,我们就想在计算机中表示中文字符。我们知道常见中文就有7000多个字符。ascii码就只有128字符,只有0-127编码位置,远远不够用了。因此,我们就开始制作更大字符集,并且保证兼容ascii编码。要支持更多字符,选择更大字符集。我们只能用多个字节来描述一个字符了。为了很好的与ascii码,区分开来!一般做法是:每个字节值都大于>7F,如果是2个字节,那么就是:[>7F][>7F]。这样编码,保证很好的与ascii区分开,并且扩大了字符集。像gb2312范围在[0xA1-0xF7][0xA1-0xFE](中间很多没有填满),它完全保证所有字节在A0之上,也就完全满足在7F之上了。

GBK编码漏洞缘由

通过上面的分析,我们知道gb2312编码是很好的跟ascii码分开了。 那么我们看看,GBK编码呢,它是完全兼容gb2312(就是说在gb2312字符集中每个字符位置,与gbk字符集里面位置完全一致,而且包含于gb2312),但是,它有2万多个字符。从上面看,只能选择往下排序了。 就是从A1A0往下排了,我们发现它编码实际范围是:[0x81-0xFE]([0x40-0x7E|0x80-0xFE] ) (GBK编码),我们发现由2个字节组成,首字节范围在7F之上,而第2个字节,有一部分在0×40-0x7E了。这就是导致bug原因。我们看看下面例子吧!

从ASCII码表中,我们知道0×40-0x7E 包含字符有:“A-Za-z@[\]^_`{|}~”,一共有63字符呢。

GBK编码漏洞 

选择gbk编码,运行上面代码,就一条简单的命令导致出现错误,说字符串 赋值 没有结束! 呵呵,估计很多人看到这个就会认为是php 出Bug了。但是,如果我们变成$a=”誠a”,发现可以正常运行了。是不是觉得很奇葩啦!!

 

原因分析:我们知道文件存在磁盘都是二级制方式,无论你存什么字符,最终都是以该字符的在所选字符集中字符编码保存。php解析时候,最小分析单元是字节。无论你是多字节还是单字节字符。最终都是按照字节来处理的。“誠”  GBK编码是 D55C,php按字节来解释,5C对应字符是“\” 字符。后面直接跟个‘”’,相当于被转义了。 因为没有闭合,因此出现错误!大家看出问题所在了吧,按自己处理的话,会自然把多字节拆成单字节了。这样就会出现很多奇怪问题了。

总结:通过上面讲解,我们知道了多字节编码过程,以及GBK导致简单程序出错的原因。其实,我们很多程序语言里面,都会以单个字节来解析的。这样,当你选择多字节GBK编码中文时,刚好有字节落在特殊位置,将会出现奇怪错误问题。而且,还将给系统带来本身的漏洞,后面我再说说,GBK编码缺陷,导致漏洞、以及专门利用该编码漏洞缺陷进行系统入侵!好了,先到这里了,欢迎交流!

Posted in web原理, web安全 | Tagged , | Leave a comment

京东商城Jsonp 漏洞分析 (京东商城XSS漏洞)

继续我们jsonp 安全使用分享吧!上一篇文章我们提到jsonp使用,常见2种类型漏洞出现!详细可以看看:Jsonp常见安全漏洞分析 ,今天我们来结合实例分析下该漏洞的测试、及利用过程吧!

题外话

为什么我选择是京东商城来分析它的jsonp 漏洞呢,其实主要原因最近6.18一直在做活动,我也买了不少便宜东西。现在该商城越做越好了。它系统也非常庞大,速度性能也很好。当时在购物时候,只是想看看,它的系统分离设计方面。通过分析页面http请求,发现有很多jsonp调用(也许跟换域名有关系,2种域名都可以访问,中间用jsonp交换数据),于是就看看,jsonp常见2种安全方面,有没有做处理。结果一测试。发现完全没有做任何处理,几乎是完完全全暴露出来。个人认为,对于这么大站点,这一点还是头一次遇到!居然,没有任何参数处理、以及资源授权!

京东商城Jsonp xss漏洞分析

京东商城xss漏洞

我们看到,该请求就是一个jsonp,

默认返回:jsonp13**********({“Identity”:{“Name”:”",”IsAuthenticated”:false}}),我们知道callback传入参数,会在response中 作为函数调用名称返回!

分析callback 字符范围

1、测试下有没有屏蔽常见特殊字符” <> ()’”;. {}“,以下这些字符,经常会用到xss里面的。

京东商城callback没有屏蔽特殊字符

到这里,分析说明这里存在着xss注入漏洞的。而且,可以选择很多种方法注入! 本编文章,旨在说明jsonp xss漏洞成因!不会具体去扩大漏洞拿到其它什么权限。以下还有个很有意思事情,callback其实,jd对一些特殊字符串做了处理的。我们看看:

image

从上图中,我们可以看到,京东商城,对输入callback对一些特定的字符串进行了屏蔽处理!这也是,我们做xss漏洞检查时候,经常出现问题。屏蔽字符串能够屏蔽完吗?常见26字符,长度不一任意组合。该有多少字符串呢? 很多朋友,在做安全检测时候,就是屏蔽某些觉得很不安全的标签就认为安全了。 其实,我们发现这样做法只能是一时安全,过不了多久,你会发现又有新的字符串出现。你会为此花费大量的人力物力!好了,做类似事情,我们最好方法是,认证那些觉得安全的字符,予以放行!

其实,为什么用白名单方法放行允许的字符呢? 而不是去过滤一些字符串。原因刚刚说了,字符串太多了。过滤不过来!另外是,我们自己每个业务参数,会用到那些字符其实我们更清楚。另外有人会问,为什么不去屏蔽不用的字符呢?我们知道基础ascii码有0-127,128字符。往往我们,不会用到的字符可能更多呢,我们去过滤不会用到字符,有时候更困难!

正确检查jsonp callback方法

建议收到callback函数对它进行白名单字符范围检测!我们可以用一般函数检测规范来检查就可以了。 既然它是一个函数名称,一般都是字符+数字+下划线+点号(对象分割)。那么我们检测变得非常简单,代码类似如:

1
2
3
4
5
6
7
<?php
$callback = isset($_GET['callback'])?$_GET['callback']:'';
 
if(!preg_match("/^[0-9a-zA-Z_.]+$/",$callback))
{
	exit('参数错误!');
}

后记:以上是分析一个jsonp xss漏洞过程。要检测一个站点是否有该漏洞,其实简单方法,就是看通过参数传入进去的特殊字符,是不是原原本本的response 返回出来。 如果有朋友问我,怎么样利用该漏洞,它能做点什么? 你可以把它比作一个蚁穴,能带来多大危害,看蚂蚁怎么样啃食啦!这些年,sql注入几乎难找了,不过xss漏洞是头号杀手。只要有xss漏洞出现,几乎可以做到无所不能,就看利用的人怎么用了。 以上漏洞,我反馈京东商城,这么好的一个网站,不能因为这个小小xss,给用户带来大的安全隐患了!最后,欢迎朋友提出自己建议!还有一个忘记说了,就是它的jsonp访问权限完全没有限制,下次再分享吧!

Posted in web安全 | Tagged | Leave a comment

Jsonp常见安全漏洞分析(京东商城Jsonp 漏洞分析)

JSONPJSON with Padding)是资料格式 JSON 的一种“使用模式”,可以让网页从别的网域要资料。这个解释来自于互联网上面的答案。jsonp只是 一种使用json模式,之所以能够很广泛使用。主要用它来解决跨域访问问题。可以方便跨域名传输数据。一些是一个jsonp的例子。但是,正确的使用jsonp是至关重要的,用得不好。将带来重要资料把超范围访问,还会带来各自xss漏洞。

JSONP跨域请求例子

传统的ajax ,往往是 XMLHttpRequest ,读取一个接口,返回类似: {“Name”: “小明”, “Rank”: 7} json值。一般我们都采用xmlhttprequest方法通过状态判断执行请求是否完毕。

JSONP的使用模式里,该URL回传的是由自定义传入函数名,动态生成JSON作为该函数入参,这就是JSONP 的“填充(padding)”或是“前辍(prefix)”的由来。

请求:

<script type="text/javascript"
         src="http://www.example.com/RetrieveUser?UserId=1823&callback=parseResponse">
     </script>
返回:
parseResponse({"Name": "Cheeso", "Id" : 1823, "Rank": 7})


parseResponse是传入参数值决定的,这样好处通过script标签可以解决跨域问题,并且只要script src地址加载完,js解析引擎就开始执行src地址返回 js内容了。 我们使用者不用关心,什么时候src地址加载解析完。只用写好接收函数:parseResponse,到时候自动回执行该项目。比传统ajax确实多了很多方便!目前,象google翻译,地图等都用该方法。实现了跨域及异步调用!

JSONP漏洞将来自哪里?

它给我们带来的发布,是毫无疑问的。那么它将会有哪些漏洞呢?首先,我们知道,一切输入是有害的。传入callback 值会在结果里面直接返回。因此,如果该参数过滤不严格。可以随便输入:callback值为:alert(‘1’);parseResponse  字符串。返回结果会打印个alert窗口,然后也会正常执行。

那么另外我们知道,flash是可以跨域的。flash请求外部资源,现在都有个”crossdomain.xml”,可以授权允许那些来源的站点,访问指定站点的资源。其实目的就是为了防止,资源被越权调用了。 如果我们不对其授权,那么任何网站都可通过:创建script标记,读取我网站资源了!这个安全项,也就是是否有对访问来源进行了授权访问!

JSONP漏洞总结:

知道了JSONP漏洞点主要有:callback参数注入、资源访问授权设置!我们其实,可以通过这2项,来检测我们的做的JSONP项目,里面是否有安全隐患了。好了,今天先分析到这里。这些漏洞都是,技术实现型漏洞!只要,我们明白了方法,杜绝是很容易的。之所以会出现类似安全隐患,更多来自,不知道这里有类似安全问题! 题外话、发发感慨!!现在网上看到很多教程,以及书籍都只会讲,怎么样使用某个功能,它的方法、技巧等等!很少解决,技术功能点安全避免漏洞的调用方法!做一个功能很重要,但是我始终认为,开发一个安全、稳定功能是最基础的前提。 如果做的功能不安全,稳定!它急着上线,只会带来更大的风险、或是损失!!!   欢迎大家交流,提出更换的建议!(”什么?这里不是说京东商城有JSONP漏洞吗?“  ”对!没错!” 今天我这里分析漏洞点,大家可以找找京东商城这方面使用漏洞,我们下次分享实例!)

Posted in web安全 | Tagged | Leave a comment