1.SQL注入
Ø风险描述
SQL注入主要发生在应用数据库层面。 程序员在设计程序时,并不验证用户的输入。 含有特殊字符的语句会被数据库误认为是正常的SQL指令并运行,从而使数据库遭受攻击,并可能导致数据被窃取、更改或删除。 并进一步导致网站被嵌入恶意代码、后门程序等危害。
Ø特殊字符
对于SQL注入,特殊字符包括但不限于(注意大小写绕过和双写绕过):
"--,#,//(注释字符)", "and", "or", " ", " ", " ", " drop", " ", " ", " " 和 (,) 括号, | |,+,(空格)连接器,' 单引号,| (管道符号), & (& 符号), ; (分号)、$(美元符号)、%(百分号)、@(at 符号)、'(单引号)、"(引号)、\'(反斜杠转义单引号)、\"(反斜杠转义引号) )、(尖括号)、CR(回车,ASCII 0x0d)、LF(换行,ASCII 0x0a)、,(逗号)、\(反斜杠)等。
Ø漏洞示例
其中.("")中的参数""是从前端获取的,即jsp页面中input标签中id为""的值,如下:
后台SQL语句以拼接的形式执行,如代码所示:
一旦SQL语句以拼接的方式执行,拼接后的“词”不仅作为参数执行,还代表了一条SQL语句。 例如:word的值为1,则SQL语句变为: * from test where id = 1; 如果word的值为1'且'a'='a,并且系统没有对传入后台的参数进行任何特殊字符过滤,或者字符过滤不完整,则SQL语句变为: * from test其中 id = 1 ' 且 'a'='a。 两条查询语句都可以成功执行。 如果此时将 and 后面的单词替换为 union 或 order by 语句,则可以查询数据库名、表名以及表中的数据。
Ø标准要求
1.添加全局过滤器,过滤特殊字符。 就是这样:
Web.xml
SQLFilter < filter -class>*.SQLFilte filter -class >
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漏洞获取用户值、传播蠕虫、篡改页面或进行钓鱼攻击。
Ø特殊字符
对于XSS来说,特殊字符包括但不限于(注意大小写绕过和双写绕过):
| (管道符号), & (& 符号), ; (分号)、$(美元符号)、%(百分号)、@(at 符号)、'(单引号)、"(引号)、\'(反斜杠转义单引号)、\"(反斜杠转义) quote), (尖括号), () (方括号), + (加号), CR (回车, ASCII 0x0d), LF (换行符, ASCII 0x0a),, (逗号), \ (反斜杠), eval方法和关键字、、、等
Ø漏洞示例
搜索框的值是可控参数,在URL中表示为:
相关代码如下:
这里的参数在前端获取为EL表达式,并添加任何过滤,最后直接显示在页面上。 当输入框中输入的参数为:时,浏览器会直接以脚本的形式执行,并弹出框:
URL的表达式为:
%%%281%29%3C%%3E
上面的例子直接与页面交互,通过在URL中构造参数来实现XSS攻击。 另一种方法是传递参数,最后存入数据库。 由于参数在传输过程中没有经过任何有效的过滤(或者存在过滤不彻底,会被绕过),因此作为可信资源存储在数据库中,最终被存储。 实施。 代码如下所示:
用户存储的数据将在没有任何输出过滤(或不完全过滤)的情况下显示在前端页面上。 页面及代码如下:
前端页面结构如下:
如果编辑用户信息时输入:
在数据库中的存储形式为:
查询时,页面上会显示相应的数据,并执行脚本:
Ø标准要求
1.添加全局过滤器,过滤特殊字符。 就是这样:
Web.xml
XSSFilter < filter -class>*.XSSFilte filter -class >
XSSFilter
/* 拦截所有请求
在 .java 类中:
paramValue= paramValue.replaceAll(“>”, “”)
paramValue= paramValue.replaceAll(“%”,“”)
2.输出编码。 编码是为了让解析器知道数据不是用于执行的代码,从而避免受到攻击。 主要包括3种编码:URL编码、HTML编码、编码。 对于来自不受信任来源的数据,需要执行输出编码以确保字符被视为数据。 根据场景使用上述编码之一或编码组合。
3.下载任意文件
Ø风险描述
网站在处理用户下载文件的请求时,允许用户提交任意文件路径,并将服务器上的相应文件直接发送给用户,从而造成任意文件下载威胁。 如果服务器根据用户提交的目录地址将目录中的文件列表发送给用户,就会造成目录遍历安全威胁。 恶意用户会更改目录或文件地址并下载服务器上的敏感文件、数据库链接配置文件、网站源代码等。
Ø系统敏感文件
Linux操作系统:/root/.ssh/、/root/.ssh/
/root/.ssh/.、/root/.ssh/、/etc/httpd/conf/httpd.conf
/root/.,/root/.,/proc/self/fd/fd[0-9]*(文件标识符)
/proc/、/porc/.gz、/etc/、/etc/、/etc/f
操作系统:C:\Files\mysql\my.ini //Mysql配置,
C:\ Files\mysql\data\mysql\user.MYD //Mysql根目录
C:\\php.ini //php配置信息
C:\\my.ini //Mysql配置信息,C:\boot.ini //查看系统版本
C:\\\\.xml //IIS配置文件
C:\\\sam //存储系统初始安装密码
...
Ø漏洞示例
具有下载功能的页面
URL表达式如下:
代码中的表达式如下。 从前端获取文件路径和文件名,然后进行下载操作:
具体下载功能代码如下:
文件正常下载后,截图如下:
直接替换这里的文件名“WEB-INF/web.xml”,尝试下载系统配置文件:
您可以看到下载文件失败并返回不同的结果。 但可以通过添加“../”跳转到该目录:
可以看到上面返回了web.xml内容,说明下载已经成功。
Ø标准要求
1、下载时对文件进行过滤,过滤掉“./”、“../”、“%”等,代码如下:
当输入“../”时:
2、严格控制下载文件路径,只允许下载某些目录下的文件:
3、严格控制下载文件的后缀名:
4、下载文件前进行权限判断,判断用户是否有下载文件的权限。 可以创建文件白名单。 不在白名单中的文件不允许下载。
5、用ID替换文件夹和文件名,这样整个输入就从路径名变成了代表ID的字符串。 该方法很容易验证其有效性。
4.上传任意文件
Ø风险描述
应用程序在处理用户上传的文件时,会将文件保存在服务器上,而不判断文件是否在允许的范围内。 这样一来,恶意用户就可以向服务器上传任意文件甚至上传脚本木马,从而直接控制服务器。 文件上传漏洞的使用存在限制。 首先,木马文件必须上传成功。 其次,上传的木马文件必须能够执行。 最后,必须知道上传文件的路径。
Ø漏洞示例
服务器端代码:
可以看出,服务器没有对上传文件的类型和内容进行检查和过滤,存在明显的文件上传漏洞。 上传hack.php文件(一句话木马):
上传成功,返回上传路径:
通过斩波器连接:
连接成功后,可以在服务器上执行任意命令并获取权限。 服务器上的所有文件都可以下载和修改。
Ø标准要求
1. 检测上传文件类型并设置白名单进行过滤。 (建议禁止上传jsp、jspx、php、asp、aspx等格式的文件)。
2. 检测上传文件的内容和大小。 代码如下:
这里,代码限制了上传文件的类型和大小。
5、越权操作
Ø风险描述
如果Web应用程序没有正确检查用户是否有权访问特定资源,则可能会导致未经授权的访问漏洞。 例如,账户A登录后,可以通过遍历访问请求中的ID来查看其他人的相关信息。 即使是普通权限的用户也可以通过越权的方式获得管理员的权限,从而可以访问属于自己权限的数据或页面。
Ø漏洞示例
直接将账户访问的页面URL中的参数art=4改为art=6,则该账户就可以访问原本只有该账户才能访问的数据,如下图:
相关代码如下:
上面的代码中没有对用户的值进行判断,因此可以通过修改art的值来遍历访问其他信息。
Ø标准要求
1. 验证客户端的所有参数,特别是与权限相关的参数,例如用户ID或角色ID等。
2. 进行增、删、改、查等操作时,需要绑定认证token并保存在服务器会话中。 不要信任客户端发送的任何身份验证和授权信息,包括消息头、隐藏表单或 URL 参数。 以下是更正后的代码:
修复后的代码中会先对用户进行判断,返回的信息只有为True才能查看。 因此,当用户遍历art的值尝试访问其他人的信息时,会提示没有权限访问。
6. 缓冲区溢出
Ø风险描述
缓冲区溢出主要发生在C/C++中,是一种非常常见且危险的漏洞。 缓冲区溢出攻击会导致程序失败、系统关闭、重启等后果。 更严重的是,它可以被用来执行未经授权的指令,甚至获取系统权限,然后执行各种非法操作。
Ø漏洞示例
代码第100行,在数组的复制过程中,后一个数组的长度是前一个数组的两倍。 当要复制的数据超过第一个数组的数组长度时,在复制数组后,由于数组未结束,识别读取数组数据时存在内存溢出的可能。
代码第3278行和第3283行,使用copy时只复制了一个字节,但数组还没有初始化,最后也没有处理数组的结束标记。 直接读取数组时,可能会出现内存溢出。
Ø标准要求
1. 检查传输数据的类型/大小/长度。
2. 过滤风险数据。
3.初始化参数。
7.URL跳转
Ø风险描述
应用程序收到用户提交的URL参数后,不会验证该参数是否为“可信URL”,而是向用户的浏览器返回跳转到该URL的指令。 恶意攻击者可以向用户发送链接,但用户打开该链接后,就会进入钓鱼网站页面,从而导致用户受到钓鱼攻击、账号被盗、或者账号被盗。相关财产被盗。
Ø漏洞示例
跳转代码:.(.("url"));
一个应用程序有一个名为“.jsp”的页面,其参数为“url”。 攻击者精心构造链接,将用户重定向到恶意网站,进行网络钓鱼攻击并安装恶意程序。
Ø标准要求
1、输入验证,验证跳转网址,拒绝非法跳转网址的跳转访问。 可以通过白名单进行验证。
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 是一个漏洞,允许攻击者强制受害者的 Web 浏览器向攻击者选择的网站发送 HTTP 请求。 CSRF依赖于用户标识,利用网站对用户标识的信任来欺骗用户的浏览器向目标站点发送HTTP请求。 通过跨站请求伪造漏洞,攻击者可以允许受害用户修改任何可以修改的数据,或者执行任何允许的功能。
Ø漏洞示例
缺陷代码
攻击者执行恶意代码后,用户的账户和密码将在用户不知情的情况下被更改。
Ø标准要求
1. 进行标准会话管理,在每个会话中使用强随机令牌或参数来管理帐户。
2、对于重要数据提交,添加带有随机token的隐藏字段,提交到服务器后对token进行验证,确保提交的请求合法。
3、对于重要数据提交,还可以进行二次重认证,确保请求合法。
4、对于重要数据提交,还可以添加图形验证码进行验证,确保请求合法。
例子:
9. 敏感信息泄露及错误处理
Ø风险描述
应用系统经常会产生错误消息并显示给用户,从而导致信息泄露问题。 很多时候,这些错误消息是非常有用的攻击信息,因为它们暴露了应用系统实现细节或者有用的开发信息,这对于攻击系统非常有帮助。 帮助。
Ø标准要求
1.通过web.xml配置文件实现,当出现异常或错误时,会跳转到统一的错误处理页面,避免泄露过多的敏感信息。 例如:
java.lang.Throwable
/error.jsp
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] \(反斜杠)
如有侵权,请私信公众号删除文章。