百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

安全人员须知的TOP20漏洞编码安全规范(一)

liebian365 2024-10-22 15:34 4 浏览 0 评论

1.SQL注入

? 风险描述

SQL注入主要发生在应用程序数据库层面上。程序员在设计程序的时候,没有对用户的输入进行校验,含有特殊字符语句会被数据库误认为是正常的SQL指令而运行,从而使数据库受到攻击,可能导致数据被窃取、更改、删除,以及进一步导致网站被嵌入恶意代码、被植入后门程序等危害。

? 特殊字符

对SQL注入而言,特殊字符包括但不限于 (注意大小写绕过以及双写绕过):

“--,#,//(注释符)”、“ and”、“ or”、“ select”、“ update”、“ delete”、“ drop”、“ declare”、“ insert”、“ xp_shell”以及(,)括号、||,+, (空格)连接符、' 单引号、|(竖线符号)、& (& 符号)、;(分号)、$(美元符号)、%(百分比符号)、@(at 符号)、'(单引号)、"(引号)、\'(反斜杠转义单引号)、\"(反斜杠转义引号)、<>(尖括号)、CR(回车符,ASCII 0x0d)、LF(换行,ASCII 0x0a)、,(逗号)、\(反斜杠)等。

? 漏洞示例

其中request.getParameter("searchWord")中的参数“searchWord”是从前端获取到的,也就是jsp页面中input标签中id为“searchWord”的值,如下:

后台SQL语句是以拼接的形式执行,代码所示:

SQL语句一旦以拼接的方式执行,那么拼接的“word” 不仅仅是作为一个参数执行,还可以表示一个SQL语句,比如:word的值为1,那么SQL语句变成:Select * from test where id = 1;如果word的值为1’ and ‘a’=’a,而系统未对传入后台的参数做任何特殊字符过滤,或者字符过滤不全,那么SQL语句变成:Select * from test where id = 1’ and ‘a’=’a。两条查询语句都能成功执行。如果这时候将and后面的字句换成union或者order by语句就能将数据库名、表名以及表中的数据查询出来。

? 规范要求

1、添加全局过滤器,过滤特殊字符。方式如下:

Web.xml
<filter >
    <filter-name>SQLFilter</filter-name>
    < filter -class>*.SQLFilte</ filter -class >
</filter >  
<filter-mapping>
    <filter-name> SQLFilter </filter-name>
    <url-pattern> /*</url-pattern>   拦截所有请求
</filter-mapping>

在SQLFilter.java类中:

paramValue= paramValue.replaceAll(“>”, “”)
paramValue= paramValue.replaceAll(“%”,“”)


2、SQL语句使用参数化查询方式,代码如下:

String sql=“select * from test where id=?”;
db=new DBHelper(sql);
     try{
          db.stmt.setString(1,word);
          ret=db.stmt.executeQuery();
          while(ret.next()){……}}


2.跨站脚本攻击(XSS)

? 风险描述

跨站攻击是因为网站程序对用户输入过滤不足,将用户输入的恶意脚本代码正常执行或者提交。攻击者可利用XSS漏洞获取用户cookie值、传播蠕虫、篡改页面或进行钓鱼等攻击。

? 特殊字符

对XSS而言,特殊字符包括但不限于 (注意大小写绕过以及双写绕过):

|(竖线符号)、& (& 符号)、 ;(分号)、$(美元符号)、%(百分比符号)、@(at 符号)、'(单引号)、"(引号)、\'(反斜杠转义单引号)、\"(反斜杠转义引号)、<>(尖括号)、()(括号)、+(加号)、CR(回车符,ASCII 0x0d)、LF(换行,ASCII 0x0a)、,(逗号)、\(反斜杠)、eval方法以及关键字document、cookie、javascript、script、onerror等。

? 漏洞示例

搜索框种的值即为可控参数,在URL中表现形式为:

http://.../searchword?word=

相关代码如下:

此处参数在前端为EL表达式获取,并且为添加任何过滤,最后直接显示在页面。当输入框输入的参数为:<script>alert(1)</script> 时,就会直接被浏览器当作脚本执行并弹框:

其中URL的表现形式:

http://.../searchword?word=%3Cscript%3Ealert%281%29%3C%2FscriFs%3E

上面的示例是直接与页面交互,通过在URL中构造参数来实现XSS攻击。还有一种是将参数进行传递并最终存储到数据库当中,因为参数在传递过程中未经过任何有效过滤(或者存在过滤不全,会被绕过),作为可信资源存入到数据库中并最终被执行。代码如下:


在前端页面会显示用户存储的数据,并且未做任何输出过滤(或者过滤不全),页面和代码如下:

前端的页面结构如下:

如果在编辑用户信息的时候输入:<script>alert(1)</script>

在数据库中的存储形式为:

在查询的时候就会将相应的数据显示在页面,并执行脚本:

? 规范要求

1、添加全局过滤器,过滤特殊字符。方式如下:

Web.xml
<filter >
    <filter-name>XSSFilter</filter-name>
    < filter -class>*.XSSFilte</ filter -class >
</filter >  
<filter-mapping>
    <filter-name> XSSFilter </filter-name>
    <url-pattern> /*</url-pattern>   拦截所有请求
</filter-mapping>

在XSSFilter.java类中:

paramValue= paramValue.replaceAll(“>”, “”)
paramValue= paramValue.replaceAll(“%”,“”)


2、输出编码,编码就是让解析者知道数据不是用来执行的代码,从而可以避免受攻击。主要包括3种编码:URL编码、HTML编码、JavaScript编码。对于不可信来源的数据需要执行输出编码,确保字符被视为数据,根据场景分别使用以上1种编码或多种编码组合。

3.任意文件下载

? 风险描述

网站在处理用户下载文件的请求时,允许用户提交任意文件路径,并把服务器上对应的文件直接发送给用户,这将造成任意文件下载威胁。如果服务器根据用户提交的目录地址,就把目录下的文件列表发给用户,会造成目录遍历安全威胁。恶意用户会变换目录或文件地址,下载服务器上的敏感文件、数据库链接配置文件、网站源代码等。

? 系统敏感文件

Linux操作系统:/root/.ssh/authorized_keys、 /root/.ssh/id_rsa

/root/.ssh/id_ras.keystore、 /root/.ssh/known_hosts、 /etc/httpd/conf/httpd.conf

/root/.bash_history、/root/.mysql_history、/proc/self/fd/fd[0-9]*(文件标识符)

/proc/mounts、/porc/config.gz、/etc/passwd、/etc/shadow、/etc/my.cnf

Windows操作系统:C:\Program Files\mysql\my.ini //Mysql配置、

C:\Program Files\mysql\data\mysql\user.MYD //Mysql root

C:\Windows\php.ini //php配置信息

C:\Windows\my.ini //Mysql配置信息、C:\boot.ini //查看系统版本

C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文件

C:\Windows\repair\sam //存储系统初次安装的密码

...

? 漏洞示例

存在下载功能的页面

Url表现形式如下:

http://.../downloadFile.action?jpgPath=/download/&jpgName=test.jpg

在代码中的表现形式如下,文件路径和文件名都是从前端获取,然后执行下载操作:

具体下载功能代码如下:

当文件正常下载时,通过brupsuite截图如下:

在此处直接替换文件名为“WEB-INF/web.xml”,尝试下载系统配置文件:

可以看到下载文件失败,返回不一样的结果。但是可以通过添加“../”进行目录跳转:

可以看出上面返回了web.xml内容,表示已经下载成功。

? 规范要求

1、文件下载时进行过滤,过滤掉 “./”、“../”、“%”等,代码如下:

当输入“../”时:

2、对下载的文件路径进行严格控制,只允许下载某部分目录下的文件:

3、对下载文件后缀名做严格控制:

4、下载文件之前做权限判断,判断用户是否有下载该文件的权限。可建立文件白名单,不属于白名单内,不允许下载。

5、使用ID替换文件夹和文件名,使得整个输入由路径名变为一个表示ID的字符串,这种方法很容易验证它的有效性。

4.任意文件上传

? 风险描述

应用程序在处理用户上传的文件时,没有判断文件是否在允许的范围内,就把文件保存在服务器上,导致恶意用户可以上传任意文件,甚至上传脚本木马到服务器上,直接控制服务器。文件上传漏洞的利用是有限制条件的,首先要能够成功上传木马文件,其次上传的木马文件能够被执行,最后就是上传文件的路径必须可知。

? 漏洞示例

服务器端代码:

可以看到,服务器对上传文件的类型、内容没有做任何的检查、过滤,存在明显的文件上传漏洞。上传文件hack.php(一句话木马):

上传成功,并且返回了上传路径:

通过菜刀连接:

连接成功后,就可以在服务器上执行任意命令,获取webshell权限。可以下载、修改服务器的所有文件。

? 规范要求

1、对上传文件的类型进行检测,设置白名单进行过滤。(建议禁止上传jsp、jspx、php、asp、aspx等格式的文件)。

2、对上传文件的内容及大小进行检测,代码如下:

在这里,代码对上传文件的类型、大小做了限制。

5.越权操作

? 风险描述

如果一个Web应用程序不正确检查用户是否被授权访问的特定的资源,就有可能导致产生越权漏洞。例如帐号A在登录的状态下,遍历访问请求中的ID就可以查看其它人的相关信息。甚至普通权限的用户可以通过越权获取到管理员的权限,从而可以访问本部属于自己权限的数据或页面。

? 漏洞示例

在test001账号访问的页面URL中直接将参数art=4改成art=6,则test001账号就可以访问原本只能被test002号访问的数据,如下所示:

相关代码如下:

在上面的代码中,没有判断用户的Session值,导致通过修改art的值就可以遍历访问其他的信息。

? 规范要求

1、验证一切来自客户端的参数,特别是和权限相关的参数,如用户ID或角色ID等。

2、在进行增、删、改、查等操作时,需将sessionID和认证的token绑定,存放在服务器的会话里,不要相信任何客户端发来的认证和授权信息,包括消息头、Cookie、隐藏的表单或者URL参数。下面时修复后的代码:

在修复后的代码中,首先会判断用户的Session,只有在Session为True的情况下才能够查看返回的信息,因此当用户遍历art的值来尝试访问其他人的信息时,会提示无权访问。

6.缓存区溢出

? 风险描述

缓存区溢出主要出现在C/C++当中,是一种非常普遍、非常危险的漏洞。利用缓冲区溢出攻击,可以导致程序运行失败、系统宕机、重新启动等后果。更为严重的是,可以利用它执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作。

? 漏洞示例

在代码100行处,数组在复制过程中,后面一个数组的长度是前一个数组的两倍,当需要复制的数据超过第一个数组的数组长度时,对数组完成复制后,由于数组没有结束标识,读取数组数据时存在内存溢出的可能性。

在代码3278、3283行处,使用strncpy复制时只是复制了一个字节,而数组没有经过初始化,且最后也没有对数组做结束标识处理,在直接读取数组时,可能会造成内存溢出。

? 规范要求

1、对传递的数据进行类型/大小/长度的检验。

2、过滤风险数据。

3、初始化参数。

7.URL跳转

? 风险描述

应用程序接收到用户提交的URL参数后,没有对参数做“可信任URL”的验证,就向用户浏览器返回跳转到该URL的指令。恶意攻击者可以发送给用户一个链接,但是用户打开后,却来到钓鱼网站页面,将会导致用户被钓鱼攻击,账号被盗,或账号相关财产被盗。

? 漏洞示例

跳转代码:response.sendRedirect(request.getParameter("url"));

某应用程序有一个名为“redirect.jsp”的页面,该页面的参数为“url”,攻击者精心构造一个链接将用户重定向到一个恶意网站,执行钓鱼攻击并安装恶意程序。

http://www.example.com/redirect.jsp?url=evil.com

? 规范要求

1、输入验证,对跳转的URL进行验证,对于不合法的跳转URL拒绝跳转访问。可通过白名单进行验证。

2、如果在本网站内跳转,则使用相对路径,而不要使用绝对路径,如在URL的参数中使用了绝对路径,建议在代码里剥离URL中域名部分,然后再和网站的域名重新结合成绝对路径,再跳转。

3、如果请求允许跳转的对象只是限制在有限的范围内,可创建一个匹配的规则,通过数字类型的ID来代替跳转到具体的页面。

4、仅传递一个回调url作为参数是不安全的,增加一个参数签名,保证回调url不被修改,在控制页面转向的地方校验传入的URL是否为公司域名(或者其他可信域名)

如以下是一段校验是否公司域名的JS函数

function VaildURL(sUrl)
{
 return (/^(https?:\/\/)?[\w\-.]+\.(qq|paipai|soso|taotao)\.com($|\/|\\)/i).test(sUrl)||(/^[\w][\w\/\.\-_%]+$/i).test(sUrl)||(/^[\/\\][^\/\\]/i).test(sUrl) ? true : false;
}

8.跨站请求伪造(CSRF)

? 风险描述

CSRF 是一种攻击者迫使被攻击者网页浏览器发送HTTP 请求到攻击者所选择的网站的漏洞。CSRF依靠用户标识,并利用网站对用户标识的信任欺骗用户浏览器发送HTTP请求给目标站点。通过跨站请求伪造漏洞,攻击者能让受害用户修改可以修改的任何数据,或者是执行允许使用的任何功能。

? 漏洞示例

缺陷代码

攻击者执行完恶意代码后用户的账户和密码会在不知情的情况下被更改

? 规范要求

1、执行标准的会话管理,通过在每个会话中使用强随机令牌或参数来管理账户。

2、对于重要的数据提交,增加带随机令牌的隐藏字段,在提交给服务器后对令牌进行验证,确保提交的请求是合法的。

3、对于重要的数据提交,也可进行二次重新认证,以确保请求是合法的。

4、对于重要的数据提交,也可增加图形验证码进行验证,以确保请求是合法的。

示例:

9. 敏感信息泄露及错误处理

? 风险描述

应用系统常常产生错误信息并显示给使用者,导致信息泄露问题,很多时候,这些错误信息是非常有用的攻击信息,因为它们暴露了应用系统实施细则或有用的开发信息,对攻击系统有很大帮助。

? 规范要求

1、通过web.xml配置文件实现,产生异常或者错误时跳转到统一的错误处理页面,避免泄漏过多敏感信息。例如:

<error-page>  
<exception-type>java.lang.Throwable</exception-type>
<location>/error.jsp</location>  
</error-page>

10. 远程系统命令执行

? 风险描述

系统命令执行攻击,是指代码中有一段执行系统命令的代码,但是系统命令需要接收用户输入,恶意攻击者可以通过这个功能直接控制服务器。

? 漏洞示例

以上代码调用系统的shell执行含有用户输入参数的命令,攻击者可以将多个命令合并在一起。比如,输入 “. & echo hello” 首先由dir命令罗列出当前目录的内容,再用echo打印出友好的信息。

? 规范要求

1、所有需要执行的系统命令,必须是开发人员定义好的,不允许接收用户传来的参数,加入到系统命令中去。

2、字符转义,对特殊字符进行转义。

3、输入验证,对于进入命令执行的参数进行检查,检查参数长度及包含特殊字符,重点检查各种命令分隔符(如;、&&、&、||、|等),当发现非法字符,拒绝请求。建议过滤出以下所有字符:

[1] |(竖线符号)

[2] & (& 符号)

[3];(分号)

[4] $(美元符号)

[5] %(百分比符号)

[6] @(at 符号)

[7] '(单引号)

[8] "(引号)

[9] \'(反斜杠转义单引号)

[10] \"(反斜杠转义引号)

[11] <>(尖括号)

[12] ()(括号)

[13] +(加号)

[14] CR(回车符,ASCII 0x0d)

[15] LF(换行,ASCII 0x0a)

[16] ,(逗号)

[17] \(反斜杠)

侵权请私聊公众号删文

相关推荐

快递查询教程,批量查询物流,一键管理快递

作为商家,每天需要查询许许多多的快递单号,面对不同的快递公司,有没有简单一点的物流查询方法呢?小编的回答当然是有的,下面随小编一起来试试这个新技巧。需要哪些工具?安装一个快递批量查询高手快递单号怎么快...

一键自动查询所有快递的物流信息 支持圆通、韵达等多家快递

对于各位商家来说拥有一个好的快递软件,能够有效的提高自己的工作效率,在管理快递单号的时候都需要对单号进行表格整理,那怎么样能够快速的查询所有单号信息,并自动生成表格呢?1、其实方法很简单,我们不需要一...

快递查询单号查询,怎么查物流到哪了

输入单号怎么查快递到哪里去了呢?今天小编给大家分享一个新的技巧,它支持多家快递,一次能查询多个单号物流,还可对查询到的物流进行分析、筛选以及导出,下面一起来试试。需要哪些工具?安装一个快递批量查询高手...

3分钟查询物流,教你一键批量查询全部物流信息

很多朋友在问,如何在短时间内把单号的物流信息查询出来,查询完成后筛选已签收件、筛选未签收件,今天小编就分享一款物流查询神器,感兴趣的朋友接着往下看。第一步,运行【快递批量查询高手】在主界面中点击【添...

快递单号查询,一次性查询全部物流信息

现在各种快递的查询方式,各有各的好,各有各的劣,总的来说,还是有比较方便的。今天小编就给大家分享一个新的技巧,支持多家快递,一次能查询多个单号的物流,还能对查询到的物流进行分析、筛选以及导出,下面一起...

快递查询工具,批量查询多个快递快递单号的物流状态、签收时间

最近有朋友在问,怎么快速查询单号的物流信息呢?除了官网,还有没有更简单的方法呢?小编的回答当然是有的,下面一起来看看。需要哪些工具?安装一个快递批量查询高手多个京东的快递单号怎么快速查询?进入快递批量...

快递查询软件,自动识别查询快递单号查询方法

当你拥有多个快递单号的时候,该如何快速查询物流信息?比如单号没有快递公司时,又该如何自动识别再去查询呢?不知道如何操作的宝贝们,下面随小编一起来试试。需要哪些工具?安装一个快递批量查询高手快递单号若干...

教你怎样查询快递查询单号并保存物流信息

商家发货,快递揽收后,一般会直接手动复制到官网上一个个查询物流,那么久而久之,就会觉得查询变得特别繁琐,今天小编给大家分享一个新的技巧,下面一起来试试。教程之前,我们来预览一下用快递批量查询高手...

简单几步骤查询所有快递物流信息

在高峰期订单量大的时候,可能需要一双手当十双手去查询快递物流,但是由于逐一去查询,效率极低,追踪困难。那么今天小编给大家分享一个新的技巧,一次能查询多个快递单号的物流,下面一起来学习一下,希望能给大家...

物流单号查询,如何查询快递信息,按最后更新时间搜索需要的单号

最近有很多朋友在问,如何通过快递单号查询物流信息,并按最后更新时间搜索出需要的单号呢?下面随小编一起来试试吧。需要哪些工具?安装一个快递批量查询高手快递单号若干怎么快速查询?运行【快递批量查询高手】...

连续保存新单号功能解析,导入单号查询并自动识别批量查快递信息

快递查询已经成为我们日常生活中不可或缺的一部分。然而,面对海量的快递单号,如何高效、准确地查询每一个快递的物流信息,成为了许多人头疼的问题。幸运的是,随着科技的进步,一款名为“快递批量查询高手”的软件...

快递查询教程,快递单号查询,筛选更新量为1的单号

最近有很多朋友在问,怎么快速查询快递单号的物流,并筛选出更新量为1的单号呢?今天小编给大家分享一个新方法,一起来试试吧。需要哪些工具?安装一个快递批量查询高手多个快递单号怎么快速查询?运行【快递批量查...

掌握批量查询快递动态的技巧,一键查找无信息记录的两种方法解析

在快节奏的商业环境中,高效的物流查询是确保业务顺畅运行的关键。作为快递查询达人,我深知时间的宝贵,因此,今天我将向大家介绍一款强大的工具——快递批量查询高手软件。这款软件能够帮助你批量查询快递动态,一...

从复杂到简单的单号查询,一键清除单号中的符号并批量查快递信息

在繁忙的商务与日常生活中,快递查询已成为不可或缺的一环。然而,面对海量的单号,逐一查询不仅耗时费力,还容易出错。现在,有了快递批量查询高手软件,一切变得简单明了。只需一键,即可搞定单号查询,一键处理单...

物流单号查询,在哪里查询快递

如果在快递单号多的情况,你还在一个个复制粘贴到官网上手动查询,是一件非常麻烦的事情。于是乎今天小编给大家分享一个新的技巧,下面一起来试试。需要哪些工具?安装一个快递批量查询高手快递单号怎么快速查询?...

取消回复欢迎 发表评论: