Web漏洞知识库
⽬录:
SQL注⼊漏洞
SQL注⼊攻击(SQL Injection),简称注⼊攻击,SQL注⼊是web开发中最常见的⼀种安全漏洞。 SQL注⼊漏洞可以⽤来从数据库获取敏感信息,或者利⽤数据库的特性执⾏添加⽤户,导出⽂件等⼀系列恶意操作,甚⾄有可能获取数据库乃⾄系统最⾼权限.
SQL注⼊漏洞原理:
由于程序没有过滤⽤户的输⼊,攻击者通过响服务器提交恶意的SQL查询语句,应⽤程序接收后错误的将攻击者的输⼊作为原始SQL查询语句的⼀部分执⾏,导致改变了程序原始的SQL查询逻辑,额外的执⾏了攻击者构造的SQL查询语句。
SQL注⼊实例:
类型1:数字型 $id = $_GET[id]; $sql = “SELECT * FROM “.$tablepre.”announcements WHERE id=$id”; $result = $db->fetchsingleassocbysql( $sql ); $content = $result[‘content’];
提交 and 1=1, 语句变成select * from tablepre announcements where id = 71 and 1=1 这时语句前值后值都为真,and以后也为真,返回查询到的数据。执⾏了攻击者额外的SQL查询语句,导致SQL注⼊漏洞
类型2:字符型 $search = $_GET[key]; $sql = “SELECT * FROM users WHERE username LIKE ‘%$search%’ ORDER BY username”; $result = $db->fetchsingleassocbysql( $sql ); $content = $result[‘content’];
提交%’order by id /* 语句变成SELECT * FROM users WHERE username LIKE ‘% %’ order by id /*ORDER BY username通过闭合单引号并闭合后⾯的原始语句,执⾏了攻击者额外的SQL语句,导致SQL注⼊漏洞
SQL注⼊的位置:
⽆论是内⽹环境还是外⽹环境(互联⽹),B/S架构的Web应⽤(以下指⽹站)都直接或者间接地受到各种类型的Web攻击的影响。
对于后台数据库来说,以SQL注⼊攻击危害最为普遍,由于⽹站服务端语⾔⾃⾝的缺陷与程序员编写代码的安全意识不⾜,
攻击者可以将恶意SQL语句注⼊到正常的数据库操作指令中去,从⽽使该恶意SQL语句在后台数据库中被解析执⾏。
在SQL注⼊攻击之前,⾸先要到⽹站中各类与数据库形成交互的输⼊点。通常情况下,⼀个⽹站的输⼊点包括:
1.表单提交,主要是POST请求,也包括GET请求。
2.URL参数提交,主要为GET请求参数。
3.Cookie参数提交。
4.HTTP请求头部的⼀些可修改的值,⽐如Referer、User_Agent等。
5.⼀些边缘的输⼊点,⽐如.mp3⽂件的⼀些⽂件信息等。
服务端从客户端直接或间接获取数据的过程都是⼀次输⼊过程,⽆论直接或间接,默认情况下输⼊的数据都应该认为是不安全的。
上⾯列举的⼏类输⼊点,只要任何⼀点存在过滤不严,过滤缺陷等问题,都有可能发⽣SQL注⼊攻击。
⼤多数情况下,SQL注⼊的过程都是由⼯具完成的,其中包括⼤批量注⼊⼯具的使⽤。
SQL注⼊的危害:
这些危害包括但不局限于:
1.数据库信息泄漏:数据库中存放的⽤户的隐私信息的泄露。
2.⽹页篡改:通过操作数据库对特定⽹页进⾏篡改。
3.⽹站被挂马,传播恶意软件:修改数据库⼀些字段的值,嵌⼊⽹马链接,进⾏挂马攻击。
4.数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改。
5.服务器被远程控制,被安装后门。经由数据库服务器提供的操作系统⽀持,让⿊客得以修改或控制操作系统。
6.破坏硬盘数据,瘫痪全系统。
⼀些类型的数据库系统能够让SQL指令操作⽂件系统,这使得SQL注⼊的危害被进⼀步放⼤。
SQL注⼊漏洞的解决⽅案:
解决SQL注⼊问题的关键是对所有可能来⾃⽤户输⼊的数据进⾏严格的检查、对数据库配置使⽤最⼩权限原则。
1.所有的查询语句都使⽤数据库提供的参数化查询接⼝,参数化的语句使⽤参数⽽不是将⽤户输⼊变量嵌⼊到SQL语句中。
当前⼏乎所有的数据库系统都提供了参数化SQL语句执⾏接⼝,使⽤此接⼝可以⾮常有效的防⽌SQL注⼊攻击。
2.对进⼊数据库的特殊字符('"\尖括号&*;等)进⾏转义处理,或编码转换。
3.严格限制变量类型,⽐如整型变量就采⽤intval()函数过滤,数据库中的存储字段必须对应为int型。
4.数据长度应该严格规定,能在⼀定程度上防⽌⽐较长的SQL注⼊语句⽆法正确执⾏。
5.⽹站每个数据层的编码统⼀,建议全部使⽤UTF-8编码,上下层编码不⼀致有可能导致⼀些过滤模型被绕过。
6.严格限制⽹站⽤户的数据库的操作权限,给此⽤户提供仅仅能够满⾜其⼯作的权限,从⽽最⼤限度的减少注⼊攻击对数据库的危害。
7.避免⽹站显⽰SQL错误信息,⽐如类型错误、字段不匹配等,防⽌攻击者利⽤这些错误信息进⾏⼀些判断。
8.在⽹站发布之前建议使⽤⼀些专业的SQL注⼊检测⼯具进⾏检测,及时修补这些SQL注⼊漏洞。
9.确认PHP配置⽂件中的magic_quotes_gpc选项保持开启
网页被篡改怎么办跨站脚本漏洞
跨站脚本攻击(Cross-site scripting,通常简称为XSS)发⽣在客户端,可被⽤于进⾏窃取隐私、钓鱼欺骗、偷取密码、传播恶意代码等攻击⾏为。 恶意的攻击者将对客户端有危害的代码放到服务器上作为⼀个⽹页内容, 使得其他⽹站⽤户在观看此⽹页时,这些代码注⼊到了⽤户的浏览器中执⾏,使⽤户受到攻击。⼀般⽽⾔,利⽤跨站脚本攻击,攻击者可窃会话COOKIE从⽽窃 取⽹站⽤户的隐私,包括密码。 XSS攻击使⽤到的技术主要为HTML和Javascript,也包括VBScript和ActionScript等。XSS攻击对WEB服务器虽⽆直接 危害,但是它借助⽹站进⾏传播,使⽹站的使⽤⽤户受到攻击,导致⽹站⽤户帐号被窃取,从⽽对⽹站也产⽣了较严重的危害。
跨站脚本漏洞原理:
攻击者通过⽹站的输⼊点嵌⼊⾮法的HTML标签与JavaScript脚本并执⾏以达到在客户端攻击的⽬的。
攻击者注⼊的标签与脚本最终都要在客户端执⾏,攻击的过程实际上都 在客户端的浏览器上发⽣的。 能在客户端进⾏跨站的不仅仅是HTML标签与JavaScript脚本,还包含⼀些其它的客户端应⽤,⽐如Flash⾥的ActionScript脚本也能辅助发起XSS攻击
跨站脚本漏洞实例:
类型1:CSS跨站 <IMG STYLE="">//style属性值⽤户可控或者⽤户可以直接编辑模板 恶意⽤户可以提
交“xss:expr/*XSS*/ession(alert('XSS'))”作为STYLE标签的属性值,或者在编辑模板的地⽅, 恶意⽤户可以将JS代码写⼊CSS⽂件,导致跨站漏洞
跨站脚本漏洞危害:
1.钓鱼欺骗:最典型的就是利⽤⽬标⽹站的反射型跨站脚本漏洞将⽬标⽹站重定向到钓鱼⽹站,
或者注⼊钓鱼JavaScript以监控⽬标⽹站的表单输⼊,甚⾄发起基于DHTML更⾼级的钓鱼攻击⽅式。
2.⽹站挂马:跨站时利⽤IFrame嵌⼊隐藏的恶意⽹站或者将被攻击者定向到恶意⽹站上,或者弹出恶意⽹站窗⼝等⽅式都可以进⾏挂马攻击。
3.⾝份盗⽤:Cookie是⽤户对于特定⽹站的⾝份验证标志,XSS可以盗取到⽤户的Cookie,从⽽利⽤该Cookie盗取⽤户对该⽹站的操作权限。
如果⼀个⽹站管理员⽤户Cookie被窃取,将会对⽹站引发巨⼤的危害。
4.盗取⽹站⽤户信息:当能够窃取到⽤户Cookie从⽽获取到⽤户⾝份使,攻击者可以获取到⽤户对⽹站的操作权限,从⽽查看⽤户隐私信息。
5.垃圾信息发送:⽐如在SNS社区中,利⽤XSS漏洞借⽤被攻击者的⾝份发送⼤量的垃圾信息给特定的⽬标。
6.劫持⽤户Web⾏为:⼀些⾼级的XSS攻击甚⾄可以劫持⽤户的Web⾏为,监视⽤户的浏览历史,发送与接收的数据等等。
7.XSS蠕⾍:XSS 蠕⾍可以⽤来打⼴告、刷流量、挂马、恶作剧、破坏⽹上数据、实施DDoS攻击等。
跨站脚本漏洞解决⽅案:
1.检查变量是否正确初始化并明确变量类型
2.不仅要验证数据的类型,还要验证其格式、长度、范围和内容。
3.不要仅仅在客户端对数据做HTML标签转义以及过滤单引号,双引号等危险字符,关键的过滤步骤也应该在服务端进⾏。
4.对输出到页⾯的数据也要做安全检查,数据库⾥的值有可能会在⼀个⼤⽹站的多处都有输出,
即使在输⼊做了编码等操作,在各处的输出点时也要进⾏安全检查。
5.在发布应⽤程序之前测试所有已知的威胁。
远程命令执⾏漏洞
远程命令执⾏漏洞,⽤户通过浏览器提交执⾏命令,由于服务器端没有针对执⾏函数做过滤,导致在没有指定绝对路径的情况下就执⾏命令,可能会允许攻击者通过改变 $PATH 或程序执⾏环境的其他⽅⾯来执⾏⼀个恶意构造的代码。
远程命令执⾏漏洞原理:
由于开发⼈员编写源码,没有针对代码中可执⾏的特殊函数⼊⼝做过滤,导致客户端可以提交恶意构
造语句提交,并交由服务器端执⾏。命令注⼊攻击中WEB服务器没有过滤类似system(),eval(),exec()等函数是该漏洞攻击成功的最主要原因。
远程命令执⾏漏洞实例:
<?php $log_string = $_GET[‘log’]; system("echo \"".date("Y-m-d H:i:s ")." ".$log_string."\" >>
/logs/".$pre."/".$pre.".".date("Y-m-d").".log");} ?> 恶意⽤户只需要构造xxx.php?log=`id`形式的URL,即可通过浏览器在远程服务器上执⾏任意系统命令
远程命令执⾏漏洞解决⽅案:
1.建议假定所有输⼊都是可疑的,尝试对所有输⼊提交可能执⾏命令的构造语句进⾏严格的检查或者控制外部输⼊,
系统命令执⾏函数的参数不允许外部传递。
2.不仅要验证数据的类型,还要验证其格式、长度、范围和内容。
3.不要仅仅在客户端做数据的验证与过滤,关键的过滤步骤在服务端进⾏。
4.对输出的数据也要检查,数据库⾥的值有可能会在⼀个⼤⽹站的多处都有输出,即使在输⼊做了编码等操作,在各处的输出点时也要进⾏安全检查。
5.在发布应⽤程序之前测试所有已知的威胁。
⽂件包含漏洞
⽂件包含漏洞,如果允许客户端⽤户输⼊控制动态包含在服务器端的⽂件,会导致恶意代码的执⾏及敏感信息泄露,主要包括本地⽂件包含和远程⽂件包含两种形式。
⽂件包含漏洞原理:
由于开发⼈员编写源码,开放着将可重复使⽤的代码插⼊到单个的⽂件中,并在需要的时候将它们包含在特殊的功能代码⽂件中,然后包含⽂件中的代码会被解释执 ⾏。由于并没有针对代码中存在⽂件包含的函数⼊⼝做过滤,导致客户端可以提交恶意构造语句提交,并交由服务器端解释执⾏。 ⽂件包含攻击中WEB服务器源码⾥可能存在inlcude()此类⽂件包含操作函数,可以通过客户端构造提交⽂件路径,是该漏洞攻击成功的最主要原因。
⽂件包含漏洞实例:
⽂件包含漏洞解决⽅案:
1.严格检查变量是否已经初始化。
2.建议假定所有输⼊都是可疑的,尝试对所有输⼊提交可能可能包含的⽂件地址,
包括服务器本地⽂件及远程⽂件,进⾏严格的检查,参数中不允许出现../之类的⽬录跳转符。
3.严格检查include类的⽂件包含函数中的参数是否外界可控。
4.不要仅仅在客户端做数据的验证与过滤,关键的过滤步骤在服务端进⾏。
5.在发布应⽤程序之前测试所有已知的威胁。
HTTP协议头注射漏洞
HTTP 响应头⽂件中包含未经验证的数据会引发 cache-poisoning、cross-site scripting、cross-user defacement、page hijacking、cookie manipulation 或 open redirect。
HTTP协议头注射漏洞原理:
以下情况中会出现 HTTP协议头注射漏洞:
1.数据通过⼀个不可信赖的数据源进⼊ Web 应⽤程序,最常见的是 HTTP 请求。
2.数据包含在⼀个 HTTP 响应头⽂件⾥,未经验证就发送给了 Web ⽤户。
其中最常见的⼀种 Header Manipulation 攻击是 HTTP Response Splitting。
为了成功地实施 Http Response Splitting 盗取,应⽤程序必须允许将那些包含 CR(回车,由 %0d 或 \r 指定)
和 LF(换⾏,由 %0a 或 \n 指定)的字符输⼊到头⽂件中。
攻击者利⽤这些字符不仅可以控制应⽤程序要发送的响应剩余头⽂件和正⽂,还可以创建完全受其控制的其他响应。
HTTP协议头注射漏洞实例:
<?php $location = $_GET['some_location']; header("location: $location"); ?> 假设在请求中提交了⼀个由标准的字母和数字字符组成的字符串,如 "index.html",那么包含此 cookie 的 HTTP 响应可能表现为以下形式: HTTP/1.1 200 OK ... location:
index.html ... 然⽽,因为该位置的值由未经验证的⽤户输⼊组成,所以仅当提交给 some_location 的值不包含任何 CR 和 LF 字符时,响应才会保留这种形式。
如果攻击者提交的是⼀个恶意字符串,⽐如 : "index.html\r\nHTTP/1.1 200 OK\", 那么此 HTTP 响应就会被分割成以下形式的两个响应: HTTP/1.1 200 OK location: index.html HTTP/1.1 200 OK ... 显 然,第⼆个响应已完全由攻击者控制,攻击者可以⽤所需的头⽂件和正⽂内容构建该响应。 攻击者可以构建任意 HTTP 响应,从⽽发起多种形式的攻击
HTTP协议头注射漏洞解决⽅案:
如今的许多现代应⽤程序服务器可以防⽌ HTTP 头⽂件感染恶意字符。
例如,当新⾏传递到 header() 函数时,最新版本的 PHP 将⽣成⼀个警告并停⽌创建头⽂件。
如果您的 PHP 版本能够阻⽌设置带有换⾏符的头⽂件,则其具备对 HTTP Response Splitting 的防御能⼒。
代码层⾯常见的解决⽅案:
1.严格检查变量是否已经初始化。
2.禁⽌header()函数中的参数外界可控。
任意⽂件上传漏洞
允许⽤户上传任意⽂件可能会让攻击者注⼊危险内容或恶意代码,并在服务器上运⾏。
任意⽂件上传漏洞原理:
由于⽂件上传功能实现代码没有严格限制⽤户上传的⽂件后缀以及⽂件类型,导致允许攻击者向某个可通过 Web 访问的⽬录上传任意PHP⽂件,并能够将这些⽂件传递给 PHP 解释器,就可以在远程服务器上执⾏任意PHP脚本。
任意⽂件上传漏洞实例:
以下代码会处理上传的⽂件,并将它们移到 Web 根⽬录下的⼀个⽬录中。 攻击者可以将任意的PHP源⽂件上传到该程序中,并随后从服务器中请求这些⽂件,会在远程服务器上执⾏恶意⽂件。 <? if(isset($_POST["form"])) { $uploadfile =
"upfiles/".$_FILES['upfile']['name']; move_uploaded_file($_FILES['upfile']['tmp_name'], $uploadfile);//没有检查⽂件类型就直接上传 print_r($_FILES); die(); } ?>
即使程序将上传的⽂件存储在⼀个⽆法通过 Web 访问的⽬录中,攻击者仍然有可能通过向服务器环境引⼊恶意内容来发动其他攻击。如果程序容易出现⽂件包含漏洞,那么攻击者就可能上传带恶意内容的⽂件,并利⽤另⼀种漏洞促使程序读取或执⾏该⽂件,形成“⼆次攻击”。
任意⽂件上传漏洞解决⽅案:
1.检查是否判断了上传⽂件类型及后缀
2.定义上传⽂件类型⽩名单,即只允许上传的⽂件类型
3.⽂件上传⽬录禁⽌脚本解析
发布评论