DVWA学习笔记
Brute Force(暴力破解)
常用设置
Intruder的攻击类型
- Sniper(狙击手):可以指定多个变量同时进行破解,只设置一个字典文件,将每个变量挨个用字典内容进行替换。(常用于破解单个变量)
- Battering ram(破城槌):可以指定多个变量,只设置一个字典文件,将所有的变量一起用字典内容进行替换。
- Ptichfork(音叉):可以指定多个变量,需要为每个变量分别设置一个字典文件,然后用对应的字典内容对变量同时进行替换。
- Clusterbomb(集束炸弹):指定多个变量,并为每个变量分别设置一个字典文件,然后用字典内容组合对变量进行替换。(常用于破解多个变量)
常用载荷类型
- Simple list(简单清单):可以手动添加字典列表,也可以导入Burpsuite自带的字典,或者导入自定义的字典。
- Runtime file(运行时文件):只能导入自定义字典。(不能有中文路径)
- Numbers(数值):指定一个数值范围,依次进行取值测试。
- Brute forcer(爆破):指定字符集根据排列组合生成字典。
Grep-Match
- 设置可能与响应的内容匹配的字符串,当匹配时会打✔。
- 有的页面在用户登录失败时并不出现错误提示,而是仍然返回到登录页面,这个时候就可以从登录页面提取部分代码作为关键字,比如:
form action="#" method="GET"
- 如果不设置关键字,可以通过返回的Length来判断是否登录成功。
攻击流程
仅适用于Low级别以及Medium级别
- 拦截请求并发送到Intruder
- 在Intruder的Positions里边指定变量
- 在Intruder的Payloads里边选择有效载荷集并载入字典
- 在Intruder的Options里边设置Grep-Match的匹配字符串
- 开始攻击
常用的防范措施
- 增加密码的复杂性
- 增加验证码
- 对错误输入进行锁定,比如连续5次错误,锁定30分钟
- 使用双因素认证,比如账号密码+证书
Command Injection(命令行注入)
常用命令连接符
命令 | 功能 |
---|---|
A&&B |
与。A执行成功,才会执行B命令 |
A&B |
A和B同时执行(Windows下则是A执行完执行B) |
`A | B` |
`A |
Linux下还可以使用重定向命令
>
or>>
,以及使用;
执行多条命令。
攻略命令
- Low级别:
127.0.0.1 && whoami
- Meduim级别:
127.0.0.1 & whoami
- High级别:
127.0.0.1 |whoami
CSRF(跨站请求伪造)
基础知识
-
攻击者通过伪造用户的浏览器的请求,向用户自己曾经认证过的网站发送出去,使目标网站接收并误以为是用户的真实操作而去执行命令。常用于盗取账号、转账、发送虚假消息等。
-
实施前提
- 目标网站存在CSRF漏洞
- 受害者需要保持目标站点的登录活动状态
- 受害者需要点击钓鱼链接
-
攻击改进
- 利用短链接将URL缩短
- 将CSRF代码嵌入其他网页
- 将CSRF代码写入XSS注入点中(可以防止跳转到“密码已修改”的提示页面)
攻略
-
Low级别
- 先输入新的密码和确认密码
- 复制所得的链接,如
http://192.168.168.128/DVWA/vulnerabilities/csrf/?password_new=123&password_conf=123&Change=Change#
- 修改链接中的参数,如
http://192.168.168.128/DVWA/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#
- 访问新链接即可修改密码
-
Medium级别
- 用抓包工具得到能成功修改密码的请求
- 用抓包工具修改该请求的密码和确认密码字段后发送即可
HTTP请求中的Referer字段,记录了该请求的来源地址。通过CSRF攻击发出的转账请求,Referer是指向黑客的网站。
防御方法
- 对每一个转账请求验证其Referer值
- 进行二次确认,包括:弹出提示框“是否确认修改密码”、再输入一次密码、设置验证码
File Inclusion(文件包含)
基础知识
-
程序开发人员通常会把可重复使用的函数写入到单个文件中,在使用某些函数时,直接调用此文件,而无需再次编写,这种调用文件的过程被称包含。
-
有时候由于网站功能需求,会让前端用户选择要包含的文件,而开发人员又没有对要包含的文件进行安全考虑,就导致攻击者可以通过修改文件的位置来让后台执行任意文件,从而导致文件包含漏洞。
-
可能存在漏洞的页面URL,如
http://xxx/index.php?page=main.php
-
漏洞测试,如
http://xxx/index.php?page=/etc/passwd
orhttp://xxx/index.php?page=C:\Windows\system.ini
-
文件包含函数
- require():找不到被包含的文件时会产生致命错误,并停止脚本运行。
- include():找不到被包含的文件时只会产生警告,脚本将继续运行。
- require_once()与require()类似,include_once()与include()类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。
攻略
- Low和Medium级别:将URL改为
http://192.168.168.128/DVWA/vulnerabilities/fi/?page=/etc/passwd
即可
防御方法
- 定义白名单
File Upload(文件上传)
基础知识
-
很多Web站点都有文件上传的接口(比如注册时上传头像等),由于没有对上传的文件类型进行严格限制,导致攻击者可以上传一些而已文件(比如Webshell)
-
代码分析
$_FILES
:获取上传文件的各种信息$_FILES['uploaded']['name']
:获取客户端文件的原名称$_FILES['uploaded']['tmp_name']
:获取文件被上传后在服务端存储的临时文件名$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
:指定文件上传路径为:网站根目录/hackable/uploads$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );
:指定上传之后的文件名及保存路径move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path )
:将上传后的文件移动到变量$target_path指定的新位置$_FILES['uploaded']['type']
:获取上传文件的MIME类型
-
MIME类型用来设定某种扩展名文件的打开方式,当具有该扩展名的文件被访问时浏览器会自动使用指定的应用程序来打开。
-
常见的MIME类型:
- html网页.html:txet/html
- 普通文本.txt:text/plain
- GIF图像.gif:image/gif
- JPEG图像.jpeg .jpg:image/jpeg
攻略方法
-
Low级别:直接上传Webshell
-
Medium级别:用Burp Suite的Repeater修改请求的Content-Type字段为image/jpeg后再次请求
Insecure CAPTCHA(不安全的验证码)
- Low级别:将请求中的step字段设置为2之后重新发送
- Medium级别:将请求中的step字段设置为2,并在最后一行末尾添加
&passed_captcha=true
- Hight级别:将User-Agent字段的值改为
reCAPTCHA
,并在最后一行末尾添加g-recaptcha-response=hidd3n_valu3
SQL Injection(SQL注入)
基础知识
- 数字型注入:
SELECT * FROM table WHERE user_id = $id
- 字符型注入:
SELECT * FROM table WHERE user_id = '$id'
- 无论何种类型,都可以通过直接输入单引号来判断是否存在注入点。可以分别输入3和1+2,根据显示结果来判断类型。
注入手法
可以反复利用
1' order by x #
来尝试知道该表有多少个字段,从而使用1' union select x,x,x... #
来查看可以在网页里边显示出来哪些字段
- 字符型注入
- 最关键的是如何闭合SQL语句以及注释多余的代码
'or 1=1 or'
->user_id = ''or 1=1 or ''
:即假or真or假,最后结果为真,能把所有数据都查出来1' or '1'='1
->user_id = '1' or '1'='1'
:真or真'or 1=1 #
='or 1=1--
->user_id = ''or 1=1 #'
:假or真
防范措施
- SQL注入漏洞形成原因:用户构造的语句被代入到数据库中执行
- 防御SQL注入首要原则:用户的一切输入都是不被信任的
- 防御SQL注入主要方法:对用户输入的数据进行过滤
SQL Injection(Blind)(SQL注入盲注)
盲注是指当输入一些特殊字符时,页面并不显示错误信息,只能通过页面是否正常显示来进行判断
- 使用Burp进行抓包,获取请求的cookie
- 使用SQLmap进行扫描,将获取到的cookie加入到命令,如:
python sqlmap.py -u "http://192.168.118.128/DVWA/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=f3kgsoq3qntgdlblecc9jgtq9l"
- 检测到注入点后,在上面的命令的基础上增加
--dbs
,便可查看有哪些数据库:python sqlmap.py -u "http://192.168.118.128/DVWA/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=f3kgsoq3qntgdlblecc9jgtq9l" --dbs