如何检测SQL注入和CSS攻击漏洞

html-css06

如何检测SQL注入和CSS攻击漏洞,第1张

对于他们的攻击,主要是通过使用正则表达式来做输入检测:

检测SQL meta-characters的正则表达式 :/(\%27)|(’)|(--)|(\%23)|(#)/ix

解释:我 们首先检查单引号等值的hex,单引号本身或者双重扩折号。

修正检测SQL meta-characters的正则表达式: /((\%3D)|(=))[^ ]*((\%27)|(’)|(--)|(\%3B)|(:))/i

解释: 这个规则首先留意 = 号或它的hex值(%3D),然后考虑零个或多个除换行符以外的任意字符,最后检测单引号,双重破折号或分号。

典型的 SQL 注入攻击的正则表达式: /w*((\%27)|(’))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix

解释:

w* - 零个或多个字符或者下划线。

(\%27)|’ - 单引号或它的hex等值。

(\%6 F)|o|(\%4 F))((\%72)|r|-(\%52) -‘or’的大小写以及它的hex等值

检测SQL注入,UNION查询关键字的正则表达式: /((\%27)|(’))union/ix

(\%27)|(’) - 单引号和它的hex等值

union - union关键字

可以同样为其他SQL查询定制表达式,如 >select, insert, update, delete, drop, 等等.

检测MS SQL Server SQL注入攻击的正则表达式: /exec(s|+)+(s|x)pw+/ix

exec - 请求执行储存或扩展储存过程的关键字

(s|+)+ - 一个或多个的空白或它们的http等值编码

(s|x) p- ‘sp’或‘xp’字母用来辨认储存或扩展储存过程

w+ - 一个或多个字符或下划线来匹配过程的名称

CSS的检测也主要是正则表达式:

一般 CSS 攻击的正则表达式: /((\%3C)|<)((\%2F)|/)*[a-z0-9\%]+((\%3E)|>)/ix

解释:

((\%3C)|<) -检查<和它hex等值

((\%2F)|/)*-结束标签/或它的 hex等值

[a-z0-9\%]+ -检查标签里的字母或它hex等值

((\%3E)|>) -检查>或它的hex等值

"<img src" CSS 攻击正则表达式: /((\%3C)|<)((\%69)|i|(\%49))((\%6D)|m|(\%4D))((\%67)|g|(\%47))[^ ]+((\%3E)|>)/I

解释:

(\%3 C)|<) -<或它的hex等值

(\%69)|i|(\%49))((\%6D)|m|(\%4D))((\%67)|g|(\%47) -’img’字母或它的大小写hex等值的变化组合

[^ ]+ -除了换行符以外的任何跟随<img的字符

(\%3E)|>) ->或它的hex等值

CSS 攻击的极端的正则表达式 : /((\%3C)|<)[^ ]+((\%3E)|>)/I

解释:

这个规则简单寻找<+除换行符外的任何字符+>。由于你的web服务器和web应用程序的构架,这个规则可能产生一些错误。但它能保证捉住任何CCS或者类似CSS的攻击。

文件上传漏洞是什么?怎样防御文件上传漏洞攻击?文件上传漏洞是web安全中经常利用到的一种漏洞形式。这种类型的攻击从大的类型上来说,是攻击 数据与代码分离原则 的一种攻击。

一些web应用程序中允许上传图片,文本或者其他资源到指定的位置,文件上传漏洞就是利用这些可以上传的地方将恶意代码植入到服务器中,再通过url去访问以执行代码

造成文件上传漏洞的原因是

对于上传文件的后缀名(扩展名)没有做较为严格的限制

对于上传文件的MIMETYPE 没有做检查

权限上没有对于上传的文件的文件权限,(尤其是对于shebang类型的文件)

对于web server对于上传文件或者指定目录的行为没有做限制

下面就闲话一些文件上传漏洞的防御方式和攻击者的绕过方式

1.前端限制

function check(){

var filename=document.getElementById("file")

var str=filename.value.split(".")

var ext=str[str.length-1]

if(ext=='jpg'||ext=='png'||ext=='jpeg'||ext=='gif'){

return true

}else{

alert("这不是图片!")

return false

}

return false

}

在表单中使用onsumbit=check()调用js函数来检查上传文件的扩展名。这种限制实际上没有任何用处,任何攻击者都可以轻而易举的破解。只能用于对于用户完全信任的情况下,很难称之为一种安全措施只能称之是一种防止用户误操作上传的措施,

反制:

随便的编辑一下页面/用burpsuite/写个小脚本就可以突破之,无须多言

2.检查扩展名

顾名思义,就是在文件被上传到服务端的时候,对于文件名的扩展名进行检查,如果不合法,则拒绝这次上传

在这里,还有一点是值得一提的,在检查扩展名是否合法的时候,有两种策略

黑名单策略,文件扩展名在黑名单中的为不合法,示例代码

$postfix = end(explode('.','$_POST['filename'])

if($postfix=='php'||$postfix=='asp'||$postfix=='sh'){

echo "invalid file type"

return

}

白名单策略,文件扩展名不在白名单中的均为不合法

$postfix = end(explode('.','$_POST['filename'])

if($postfix=='jpg'||$postfix=='png'||$postfix=='gif'){

//save the file and do something next

} else {

echo "invalid file type"

return

}

白名单策略是更加安全的,通过限制上传类型为只有我们接受的类型,可以较好的保证安全,因为黑名单我们可以使用各种方法来进行注入和突破

反制

在一些 webserver 中,存在解析漏洞

1.老版本的IIS中的目录解析漏洞,如果网站目录中有一个 /.asp/目录,那么此目录下面的一切内容都会被当作asp脚本来解析

2.老板本的IIS中的分号漏洞:IIS在解析文件名的时候可能将分号后面的内容丢弃,那么我们可以在上传的时候给后面加入分号内容来避免黑名单过滤,如 a.aspjpg

3.旧版Windows Server中存在空格和dot漏洞类似于 a.php. 和 a.php[空格] 这样的文件名存储后会被windows去掉点和空格,从而使得加上这两个东西可以突破过滤,成功上传,并且被当作php代码来执行

4.nginx空字节漏洞 xxx.jpg%00.php 这样的文件名会被解析为php代码运行

5.apache的解析漏洞,上传如a.php.rar a.php.gif 类型的文件名,可以避免对于php文件的过滤机制,但是由于apache在解析文件名的时候是从右向左读,如果遇到不能识别的扩展名则跳过,rar等扩展名是apache不能识别的,因此就会直接将类型识别为php,从而达到了注入php代码的目的

3.检查HTTP Header中的Content-Type

HTTP协议规定了上传资源的时候在Header中加上一项文件的MIMETYPE,来识别文件类型,这个动作是由浏览器完成的,服务端可以检查此类型不过这仍然是不安全的,因为HTTP header可以被发出者或者中间人任意的修改,不过加上一层防护也是可以有一定效果的

反制

使用各种各样的工具(如burpsuite)强行篡改Header就可以,太容易将header中的

Content-Type: application/php

或者其他类型

改为

Content-Type: image/jpg

Content-Type: image/png

Content-Type: text/plain

等这些web程序允许的泪洗改附上常用的MIMETYPE表

text/plain(纯文本)

text/html(HTML文档)

text/javascript(js代码)

application/xhtml+xml(XHTML文档)

image/gif(GIF图像)

image/jpeg(JPEG图像)

image/png(PNG图像)

video/mpeg(MPEG动画)

application/octet-stream(二进制数据)

application/pdf(PDF文档)

application/(编程语言) 该种语言的代码

application/msword(Microsoft Word文件)

message/rfc822(RFC 822形式)

multipart/alternative(HTML邮件的HTML形式和纯文本形式,相同内容使用不同形式表示)

application/x-www-form-urlencoded(POST方法提交的表单)

multipart/form-data(POST提交时伴随文件上传的表单)

4.分析文件头内容来检查文件类型

与方法2不同,还有一种检查类型的方式是使用对于文件内容的验证机制,这种方法利用的是每一个特定类型的文件都会有不太一样的开头或者标志位。可以通过比如php的exif_imagetype()函数,一个通过这种方法来过滤的示例代码如下:

if (! exif_imagetype($_FILES['uploadedfile']['tmp_name'])) {

echo "File is not an image"

return

}

也可以自己编写函数来进行识别,图片文件通常有称作幻数的头字节,我们来看一下几种图片文件的幻数:

(注意!下面是二进制而不是文本格式的数据)

JPG

FF D8 FF E0 00 10 4A 46 49 46

GIF

47 49 46 38 39 61

(相当于文本的GIF89a)

PNG

89 50 4E 47

通过检查头几位字节,可以分辨是否是图片文件

如果是其他类型的二进制文件,也有响应的头字节,如下表

反制

给上传脚本加上相应的幻数头字节就可以,php引擎会将

(一般不限制图片文件格式的时候使用GIF的头比较方便,因为全都是文本可打印字符。)

GIF89a

do_something()

?>

如果是其他类型的二进制文件,也有响应的头字节,如下表

格式

文件头

TIFF (tif)

49492A00

Windows Bitmap (bmp)

424D

CAD (dwg)

41433130

Adobe Photoshop (psd)

38425053

Rich Text Format (rtf)

7B5C727466

MS Word/Excel (xls.or.doc)

D0CF11E0

MS Access (mdb)

5374616E64617264204A

ZIP Archive (zip),

504B0304

RAR Archive (rar),

52617221

Wave (wav),

57415645

AVI (avi),

41564920

Real Media (rm),

2E524D46

MPEG (mpg),

000001BA

MPEG (mpg),

000001B3

Quicktime (mov),

6D6F6F76

Adobe Acrobat (pdf),

255044462D312E

Windows Media (asf),

3026B2758E66CF11

MIDI (mid),

4D546864

5.限制Web Server对于特定类型文件的行为

导致文件上传漏洞的根本原因在于服务把用户上传的本应是数据的内容当作了代码,一般来说,用户上传的内容都会被存储到特定的一个文件夹下,比如我们很多人习惯于放在 ./upload/ 下面要防止数据被当作代码执行,我们可以限制web server对于特定文件夹的行为。

大多数服务端软件都可以支持用户对于特定类型文件的行为的自定义,以Apache为例:

在默认情况下,对与 .php文件Apache会当作代码来执行,对于 html,css,js文件,则会直接由HTTP Response交给客户端程序对于一些资源文件,比如txt,doc,rar等等,则也会以文件下载的方式传送的客户端。我们希望用户上传的东西仅仅当作资源和数据而不能当作代码

因此可以使用服务器程序的接口来进行限制

以Apache为例,我们可以利用 .htaccess 文件机制来对web server行为进行限制

在这里插一句,如果不是专门的文件下载目录,请务必关掉文件夹浏览的权限,以防止嗅探和可能的越权,也是使用.htaccess文件,在其中加上一句

Options All -Indexes

即可。

禁止脚本执行有多种方式可以实现,而且分别有不同的效果,我们分别来看一下

1.指定特定扩展名的文件的处理方式,原理是指定Response的Content-Type可以加上如下几行

AddType text/plain .pl .py .php

这种情况下,以上几种脚本文件会被当作纯文本来显示出来,你也可以换成其他的Content-Type

2.如果要完全禁止特定扩展名的文件被访问,用下面的几行

Options -ExecCGI

AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi识别

在这种情况下,以上几种类型的文件被访问的时候,会返回403 Forbidden的错误

3.也可以强制web服务器对于特定文件类型的处理,与第一条不同的是, 下面的方法直接强行让apache将文件识别为你指定的类型,而第一种是让浏览器

ForceType text/plain

看代码就可以很明白的知道,符合上面正则的全部被认为是纯文本,也可以继续往里面加入其他类型。

4.只允许访问特定类型的文件

order deny,allow

deny from all

在一个上传图片的文件夹下面,就可以加上这段代码,使得该文件夹里面只有图片扩展名的文件才可以被访问,其他类型都是拒绝访问。

这又是一个白名单的处理方案

永远记得,白名单是最有保障的安全措施

可以通过 move_uploaded_file 函数把自己写的.htaccess 文件上传,覆盖掉服务器上的文件,来定义文件类型和执行权限如果做到了这一点,将获得相当大的权限。

随着前端技术的发展,安全问题已经从服务器悄然来到了每一个用户的的面前,盗取用户数据, 制造恶意的可以自我复制的蠕虫代码,让病毒在用户间传播,使服务器当掉. 更有甚者可能会在用户不知觉得情况下,让用户成为攻击者,这绝对不是骇人听闻。富客户端的应用越来越广,前端的安全问题也随之增多,今天就简单介绍下一些常见的攻击方式和预防攻击办法。

常见攻击

XSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入的恶意html代码会被执行,从而达到恶意用户的特殊目的。XSS属于被动式的攻击,因为其被动且不好利用,所以许多人常呼略其危害性。但是随着前端技术的不断进步富客户端的应用越来越多,这方面的问题越来越受关注。举个简单例子 : 假如你现在是sns站点上一个用户,发布信息的功能存在漏洞可以执行js 你在 此刻输入一个 恶意脚本,那么当前所有看到你新信息的人的浏览器都会执行这个脚本弹出提示框 (很爽吧 弹出广告 :)),如果你做一些更为激进行为呢 后果难以想象。

CSRF(Cross Site Request Forgery),跨站点伪造请求。顾名思义就是 通过伪造连接请求在用户不知情的情况下,让用户以自己的身份来完成攻击者需要达到的一些目的。csrf 的攻击不同于xss csrf 需要被攻击者的主动行为触发。这样听来似乎是有“被钓鱼”的嫌疑哈哈。

多窗口浏览器这这方面似乎是有助纣为虐的嫌疑,因为打开的新窗口是具有当前所有会话的,如果是单浏览器窗口类似ie6 就不会存在这样的问题,因为每个窗口都是一个独立的进程。举个简单例子 : 你正在玩白社会, 看到有人发了一个连接,你点击过去,然后这个连接里面伪造了一个送礼物的表单,这仅仅是一个简单的例子,问题可见一般。

cookie劫持,通过获取页面的权限,在页面中写一个简单的到恶意站点的请求,并携带用户的cookie 获取cookie后通过cookie 就可以直以被盗用户的身份登录站点。这就是cookie 劫持。举个简单例子: 某人写了一篇很有意思的日志,然后分享给大家,很多人都点击查看并且分享了该日志,一切似乎都很正常,然而写日志的人却另有用心,在日志中偷偷隐藏了一个对站外的请求,那么所有看过这片日志的人都会在不知情的情况下把自己的cookie 发送给了 某人,那么他可以通过任意一个人的cookie 来登录这个人的账户。

我们该怎么做?

大致可以分为两类 1 一般用户 2网站开发人员。

首先我们来说说做为一个一般的web产品使用者,很多时候我们是被动的,是在不知情的情况下被利用的。那么我们可以:

1 对于安全级别较高的web应用访问 需要打开一个独立浏览器窗口。

2 对于陌生人发布的链接最好也是复制然后在新开的窗口中打开,当然最好的办法就是无视 – -。

对于开发人员来说我们得从相对详细的一些角度来分析:

对于xss 攻击 特点是攻击者的代码必须能获取用户浏览器端的执行权限,那么代码是从哪里来的呢,想要杜绝此类攻击出现 其实可以在入口 和出口 进行严格的过滤,这样的双保险应当说99% 的类似问题就被我们解决掉了,另外的1% 是那些蹩脚的浏览器带来的后遗症,相信在未来这种问题会越来越少的。

这里我对xss漏洞的形式作了一些整理

恶意代码值被作为某一标签的内容显示 (如果输入的是html 则html会被解析)例如你输入用户名 更新后用户名会显示到页面中的某一个标签内 如果你输入的是

popper.w<script src="hack.js" type="text/javajscript"></script>

那么如果不做过滤直接显示到页面, 会引进一个第三方的js 代码并且会执行。

策略:在不需要html输入的地方对html 标签 及一些特殊字符( ” < > &等等 )做过滤,将其转化为不被浏览器解释执行的字符

恶意代码被作为某一标签的属性显示(通过用 “ 将属性截断来开辟新的属性 或恶意方法) 这种情况往往是是开发人员为了实现功能可能会在某些dom标签上记录一些用户输入的信息例如你输入的用户名 会在页面中的标签中以 title 的形式出现 这时候 如果 你输入的是精心设计的内容 那么 看看 这个

<a title="popper.w" onclick="alert(1)">popper.w" onclick="alert(1)</a>

这里我实际上输入的内容是“popper.w” onclick=”alert(1)”,当然你可以在上边写更多的内容。

策略:对属性中可能存在截断的一些字符进行过滤 属性本身存在的 单引号和双引号都需要进行转码。

恶意代码被作为html代码本身显示 (常见的html编辑器) 这种情况存在的问题最多,不再这里举例子了。

策略:最好对用户输入的html 标签及标签属性做白名单过滤,也可以对一些存在漏洞的标签和属性进行专门过滤。

恶意代码被作为一段json字符串显示 (通过 变量截断 创造新的 恶意的js 变量 甚至是可执行的代码) 这个问题的关键是用户输入的信息可能会成为页面中js 代码的一部分。

策略:对属性中可能存在截断的一些字符进行过滤 属性本身存在的 单引号和双引号都需要进行转码。

对于crsf 和cookie 劫持

特点 隐蔽性比较高 有些时候是先利用xss 漏洞 然后再做 欺骗的

策略

通过 referer、token 或者 验证码 来检测用户提交。

尽量不要在页面的链接中暴漏任何与用户唯一号(用户id)有关的信息。

对于用户修改 删除 提交的操作最好都使用post 操作 。

避免全站通用的cookie 严格的设置cookie的域。

ok 就写到这里~

上边讲的都是一些比较常见的安全问题,主要是从js hack 方面来讲的,随着前端技术的不断发展进步,更多的安全问题可能会展现在我们面,对于开发者来说大多数的问题是可以在开发阶段避免的,所以可怕的不是hack 可怕的是我们对自己的产品安全的松懈